Django: перенаправление авторизованных пользователей со страницы входа - PullRequest
59 голосов
/ 23 февраля 2010

Я хочу настроить свой сайт так, чтобы, если пользователь заходит на страницу /login и он уже вошел в систему, он будет перенаправлять их на домашнюю страницу. Если они не вошли в систему, он будет отображаться нормально. Как я могу это сделать, так как код входа встроен в Django?

Ответы [ 9 ]

74 голосов
/ 23 февраля 2010

Я предполагаю, что вы в настоящее время используете встроенный вид входа в систему, с

(r'^accounts/login/$', 'django.contrib.auth.views.login'),

или что-то подобное в ваших URL.

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

что-то вроде:

from django.contrib.auth.views import login

def custom_login(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect(...)
    else:
        return login(request)

и, конечно, измените свои URL соответственно:

(r'^accounts/login/$', custom_login),
53 голосов
/ 09 августа 2016

Путь Джанго 1.10

Для Django 1.10, выпущенного в августе 2016 года, новый параметр с именем redirect_authenticated_user был добавлен в представление login() на основе функций, присутствующее в django.contrib.auth [1].

Пример

Предположим, у нас есть приложение Django с файлом с именем views.py и другим файлом с именем urls.py. Файл urls.py будет содержать такой код Python, как этот:

#
# Django 1.10 way
#
from django.contrib.auth import views as auth_views
from . import views as app_views


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', auth_views.login, name='login',
        kwargs={'redirect_authenticated_user': True}),
    url(r'^dashboard/', app_views.Dashboard.as_view(), name='dashboard'),
    url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
]

Из этого файла соответствующая часть в определении переменной urlpatterns является следующей, в которой используется уже упомянутый параметр redirect_authenticated_user со значением True:

    url(r'^login/', auth_views.login, name='login',
        kwargs={'redirect_authenticated_user': True}),

Обратите внимание, что значением по умолчанию для параметра redirect_authenticated_user является False.

Django 1.11 way

Для Django 1.11, выпущенного в апреле 2017 года, представление на основе класса LoginView заменило представление на основе функции login() [2], что дает вам два варианта выбора:

  • Используйте тот же Django 1.10 way , только что описанный ранее, что является положительным моментом, поскольку ваш текущий код будет продолжать работать нормально. Если вы скажете интерпретатору Python отображать предупреждения, например, запустив в консольном терминале команду python -Wd manage.py runserver в каталоге проекта Django, а затем перейдя с веб-браузером на страницу входа, вы увидите в этом же консольном терминале предупреждение как это:

/ USR / местные / Библиотека / python3.6 / сайт-пакеты / Джанго / вно / авт / views.py: 54: RemovedInDjango21Warning: представление login () заменяется основанный на классе LoginView ().

  • Используйте новый Django 1.11 way, который сделает ваш код более современным и совместимым с будущими выпусками Django. С этой опцией приведенный выше пример теперь будет выглядеть следующим образом:
* +1047 * Пример * +1048 *

Мы снова предполагаем, что у нас есть приложение Django с файлом с именем views.py и другим файлом с именем urls.py. Файл urls.py будет содержать такой код Python, как этот:

#
# Django 1.11 way
#
from django.contrib.auth import views as auth_views
from . import views as app_views


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/',
        auth_views.LoginView.as_view(redirect_authenticated_user=True),
        name='login'),
    url(r'^dashboard/', app_views.Dashboard.as_view(), name='dashboard'),
    url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
]

Из этого файла релевантная часть в определении переменной urlpatterns выглядит следующим образом, которая снова использует уже упомянутый параметр redirect_authenticated_user со значением True, но передает его в качестве аргумента методу as_view LoginView класса:

    url(r'^login/',
        auth_views.LoginView.as_view(redirect_authenticated_user=False),
        name='login'),

Обратите внимание, что здесь значение по умолчанию для параметра redirect_authenticated_user также равно False.

Ссылки

22 голосов
/ 17 октября 2013

anonymous_required декоратор

Для представлений на основе классов

Код:

from django.shortcuts import redirect

def anonymous_required(func):
    def as_view(request, *args, **kwargs):
        redirect_to = kwargs.get('next', settings.LOGIN_REDIRECT_URL )
        if request.user.is_authenticated():
            return redirect(redirect_to)
        response = func(request, *args, **kwargs)
        return response
    return as_view

Usage:

url(r'^/?$',
   anonymous_required(auth_views.login),
),
url(r'^register/?$',
    anonymous_required(RegistrationView.as_view()),
    name='auth.views.register'
),
# Could be used to decorate the dispatch function of the view instead of the url

Для просмотра функций

С http://blog.motane.lu/2010/01/06/django-anonymous_required-decorator/

Код:

from django.http import HttpResponseRedirect

def anonymous_required( view_function, redirect_to = None ):
    return AnonymousRequired( view_function, redirect_to )

class AnonymousRequired( object ):
    def __init__( self, view_function, redirect_to ):
        if redirect_to is None:
            from django.conf import settings
            redirect_to = settings.LOGIN_REDIRECT_URL
        self.view_function = view_function
        self.redirect_to = redirect_to

    def __call__( self, request, *args, **kwargs ):
        if request.user is not None and request.user.is_authenticated():
            return HttpResponseRedirect( self.redirect_to )
        return self.view_function( request, *args, **kwargs )

Использование:

@anonymous_required
def my_view( request ):
    return render_to_response( 'my-view.html' )
9 голосов
/ 20 декабря 2013

Добавьте этот декоратор над видом входа в систему, чтобы перенаправить на / home, если пользователь уже вошел в систему

@user_passes_test(lambda user: not user.username, login_url='/home', redirect_field_name=None)

и не забудьте импортировать декоратор

from django.contrib.auth.decorators import user_passes_test

5 голосов
/ 13 декабря 2018

Для Django 2.x, в вашем urls.py:

from django.contrib.auth import views as auth_views
from django.urls import path

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(redirect_authenticated_user=True), name='login'),
]
5 голосов
/ 09 февраля 2018

Поскольку просмотров на основе классов (CBV) находится на подъеме. Этот подход поможет вам перенаправить на другой URL-адрес при доступе к представлению только для пользователей, не прошедших проверку подлинности.

В моем примере страница регистрации переопределяет метод dispatch().

class Signup(CreateView):
    template_name = 'sign-up.html'

    def dispatch(self, *args, **kwargs):
        if self.request.user.is_authenticated:
            return redirect('path/to/desired/url')
        return super().dispatch(*args, **kwargs)

Ура! * * 1013

3 голосов
/ 09 сентября 2013

Я знаю, что это довольно старый вопрос, но я добавлю свою технику на случай, если кому-то еще понадобится:


MyProject / MyApp / просмотров / misc.py

from django.contrib.auth.views import login as contrib_login, logout as contrib_logout
from django.shortcuts import redirect
from django.conf import settings


def login(request, **kwargs):
    if request.user.is_authenticated():
        return redirect(settings.LOGIN_REDIRECT_URL)
    else:
        return contrib_login(request, **kwargs)

logout = contrib_logout

MyProject / MyApp / urls.py

from django.conf.urls import patterns, url

urlpatterns = patterns('myapp.views.misc',
    url(r'^login/$', 'login', {'template_name': 'myapp/login.html'}, name='login'),
    url(r'^logout/$', 'logout', {'template_name': 'myapp/logout.html'}, name='logout'),
)
...
0 голосов
/ 12 января 2012

Предполагая, что вы завершили настройку встроенной аутентификации пользователя Django (и используете декораторы), добавьте это в ваши settings.py:

LOGIN_REDIRECT_URL = '/welcome/'

ПРИМЕЧАНИЕ. «/ Welcome /» - это URL-адрес домашней страницы. Вам решать, чем его заменить.

0 голосов
/ 23 февраля 2010

Все, что вам нужно сделать, это установить «корневой» URL для просмотра домашней страницы. Поскольку просмотр домашней страницы уже закрыт для зарегистрированных пользователей, он автоматически перенаправляет анонимных пользователей на страницу входа.

Сохраните URL как есть. И добавить что-то вроде:

(r'^$', 'my_project.my_app.views.homepage'),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...