Подтвердить что ты не робот

Django: переадресовать пользователей с учетной записи

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

4b9b3361

Ответ 1

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

(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),

Ответ 2

Джанго 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 часть в определении переменной urlpatterns является следующей, в которой используется уже упомянутый параметр redirect_authenticated_user со значением True:

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

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

Джанго 1.11 путь

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

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

/usr/local/lib/python3.6/site-packages/django/contrib/auth/views.py:54: RemovedInDjango21Warning: представление login() заменяется основанным на классе LoginView().

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

пример

Мы снова предполагаем, что у нас есть приложение 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.

Рекомендации

Ответ 3

anonymous_required decorator

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

Код:

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

Применение:

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' )

Ответ 4

Добавьте этот декоратор над своим именем входа для перенаправления в /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

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


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'),
)
...

Ответ 6

Поскольку классовые представления (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)

Ура!

Ответ 7

Для 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'),
]

Ответ 8

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

LOGIN_REDIRECT_URL = '/welcome/'

ПРИМЕЧАНИЕ: "/welcome/" - это URL-адрес главной страницы. Это зависит от вас, что заменить его.

Ответ 9

Все, что вам нужно сделать, - установить "root" url на домашнюю страницу. Поскольку представление домашней страницы уже ограничено для зарегистрированных пользователей, оно автоматически перенаправляет анонимных пользователей на страницу входа.

Перечислите URL как есть. И добавьте что-то вроде:

(r'^$', 'my_project.my_app.views.homepage'),