Nano Hash - криптовалюты, майнинг, программирование

django LOGIN_REDIRECT_URL с динамическим значением

Я пытаюсь перенаправить пользователя на URL-адрес, содержащий его имя пользователя (например, http://domain/username/), и пытаюсь понять, как это сделать. Я использую django.contrib.auth для управления пользователями, поэтому я попытался использовать LOGIN_REDIRECT_URL в настройках:

LOGIN_REDIRECT_URL = '/%s/' % request.user.username # <--- fail..

но, похоже, он принимает только фиксированные строки, а не то, что будет определено после входа пользователя в систему. Как я могу это сделать?

22.10.2009

Ответы:


1

Решение состоит в том, чтобы перенаправить на статический маршрут, такой как «/userpage/», и перенаправить его на конечную динамическую страницу.

Но я думаю, что реальное решение состоит в том, чтобы создать новое представление, которое делает то, что вы действительно хотите.

from django.contrib.auth import authenticate, login
from django.http import HttpResponseRedirect

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            HttpResponseRedirect('/%s/'%username) 
        else:
            # Return a 'disabled account' error message
    else:
        # Return an 'invalid login' error message.

http://docs.djangoproject.com/en/dev/topics/auth/#authentication-in-web-requests

для получения дополнительной информации о перезаписи представления. Вот как говорят документы, чтобы переопределить такие вещи.

22.10.2009
  • Я предпочитаю первое предложение перенаправления со статической страницы /userpage/. Таким образом, вы по-прежнему можете использовать представление входа в систему из django.contrib.auth.views, которое может быть более надежным, чем представление вручную. 22.10.2009
  • поскольку я пытаюсь упростить URL-адреса и свести к минимуму перенаправления, ваше решение кажется подходящим. Спасибо! 23.10.2009
  • Какой простой и блестящий ответ, который решает мой точный вопрос. Мне стыдно, что я не подумал об этом. наслаждайтесь своей интернет-точкой. 19.04.2013

  • 2

    С основанным на классе django.contrib.auth.views.LoginView теперь вы можете просто переопределить get_success_url:

    urls.py:

    url(r'^login$', MyLoginView.as_view(), name='login'),
    url(r'^users/(?P<username>[a-zA-Z0-9]+)$', MyAccountView.as_view(), name='my_account'),
    

    views.py

    class MyLoginView(LoginView):
    
        def get_success_url(self):
            return reverse('my_account', args=[self.request.user.username])
    
    07.11.2017
  • Это делает это для меня. Спасибо. 24.02.2021

  • 3

    Оберните представление аутентификации в свое собственное представление и перенаправьте туда, куда вы хотите, если аутентификация прошла успешно.

    from django.http import HttpResponseRedirect
    from django.contrib import auth
    from django.core.urlresolvers import reverse
    
    def login(request):
        template_response = auth.views.login(request)
    
        if isinstance(template_response, HttpResponseRedirect) and template_response.url == '/accounts/profile/':
            return HttpResponseRedirect(reverse('user', args=(request.user.username,)))
    
    
        return template_response
    

    Другой альтернативой является использование параметра запроса next, чтобы указать, куда перенаправляться после входа в систему.

    <a href="{% url 'login' %}?next={{ request.path }}">sign in</a>
    
    02.08.2015
  • Мне больше всего нравится следующий параметр uri из всех приведенных выше ответов +1 06.08.2020

  • 4

    Я использую представление входа в систему django-two-factor-auth, которое предоставляет функции OTP для входа в систему. Следовательно, я расширяюсь от входа в систему two_factor.

    В основном файле urls.py:

    from two_factor.urls import urlpatterns as tf_urls
    urlpatterns = [
      # make sure login is before default two_factor (tf_urls) urls
      # coz first url has higher preference
      path('account/login/', MyLoginView.as_view(), name='login'),
      path('', include(tf_urls)),
    ]
    

    В views.py:

    from two_factor.views.core import LoginView
    from two_factor.utils import default_device
    
    
    class MyLoginView(LoginView):
    
        def get_success_url(self):
            if self.is_otp_setup() is True:
                return reverse('homepage:homepage')
    
            # otp not setup. redirect to OTP setup page
            else:
                return reverse('two_factor:setup')
            
        def is_otp_setup(self):
            if self.request.user and \
                    self.request.user.is_authenticated and \
                    default_device(self.request.user):
                return True
            else:
                return False
    
    10.09.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..