13

目前我使用这些模式登录和注销

urlpatterns += patterns("",
    (r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),
    (r'^logout/$', 'django.contrib.auth.views.logout', {'template_name': 'logout.html'})
)

尽管在我的 settings.py 中有 LOGIN_REDIRECT_URL = '/profile/',但如果我想在我已经登录的情况下访问 /login/,Django 不会将我发送到 /profile/...

我可以以某种方式重定向身份验证系统的 URL 模式吗?我不愿意为此编写自定义视图。

4

6 回答 6

26

我在我的 urls.py 中使用了类似的东西:

from django.contrib.auth.views import login
from django.contrib.auth.decorators import user_passes_test


login_forbidden =  user_passes_test(lambda u: u.is_anonymous(), '/')

urlpatterns = patterns('',
    url(r'^accounts/login/$', login_forbidden(login), name="login"),
于 2013-09-01T13:12:48.797 回答
4

骑着Django login风景怎么样?

然后在该视图中添加这段小代码:

if request.user.is_authenticated():
      # Redirect to profile

如果您想为注册用户在模板本身中做其他事情:

{% if user.is_authenticated %}
于 2013-09-01T13:04:21.227 回答
3

我最终为这样的任务编写了一个装饰器。

请注意,我做得又快又脏。

from django.conf import settings
from django.shortcuts import redirect


def redirect_if_logged(f=None, redirect_to_url=None):
    u"""
    Decorator for views that checks that the user is already logged in, redirecting
    to certain URL if so.
    """
    def _decorator(view_func):
        def _wrapped_view(request, *args, **kwargs):
            if request.user.is_authenticated():
                redirect_url = redirect_to_url

                if redirect_to_url is None:
                    # URL has 'next' param?
                    redirect_url_1 = request.GET.get('next')
                    # If not, redirect to referer
                    redirect_url_2 = request.META.get('HTTP_REFERER')
                    # If none, redirect to default redirect URL
                    redirect_url_3 = settings.LOGIN_REDIRECT_URL

                    redirect_url = redirect_url_1 or redirect_url_2 or redirect_url_3

                return redirect(redirect_url, *args, **kwargs)
            else:
                return view_func(request, *args, **kwargs)
        return _wrapped_view

    if f is None:
        return _decorator
    else:
        return _decorator(f)
于 2014-05-01T20:32:35.780 回答
1

看Github上的源码login,默认的view只有在登录表单是通过request提交的时候django.contrib.auth才会使用,并且没有参数。(文档也提到了这一点)。LOGIN_REDIRECT_URLPOSTnext

login视图实际上并不会检查您是否已经通过身份验证 - 因此已经通过身份验证的用户使用标准GET请求访问页面将再次看到登录表单 - 就像未经身份验证的用户一样。

如果您想要不同的行为,我建议您编写自己的登录视图。

于 2013-09-01T13:06:50.190 回答
1

在您的项目urls.py文件(url_patterns列表)中,添加redirect_authenticated_user=True为登录路径中的参数,如下所示:

path('admin/', admin.site.urls),
path('login/', auth_views.LoginView.as_view(
                 template_name='blog_app/login.html', 
                 redirect_authenticated_user=True
                 ), name='login'),
于 2021-07-25T17:09:39.587 回答
0

你可以使用这个装饰器

def login_excluded(redirect_to):
    """ This decorator kicks authenticated users out of a view """
    def _method_wrapper(view_method):
        def _arguments_wrapper(self, request, *args, **kwargs):
            if self.request.user.is_authenticated:
                return redirect(redirect_to)
            return view_method(request, *args, **kwargs)
        return _arguments_wrapper
    return _method_wrapper
于 2021-02-17T17:02:15.350 回答