Django-为什么内置的auth登录功能在成功登录url后没有传递有关用户的信息

时间:2013-07-04 04:18:20

标签: python django django-authentication django-login

您好我为我的项目使用了django inbult auth urls和views,现在已经完成了初始用户帐户创建/登录/重置密码过程。

现在,用户可以登录并重定向到成功登录后的URL帐户/个人资料/。

我对django登录功能有几点疑问。为方便起见,我复制粘贴下面的django内置登录功能代码。

@sensitive_post_parameters()
@csrf_protect
@never_cache
def login(request, template_name='registration/login.html',
          redirect_field_name=REDIRECT_FIELD_NAME,
          authentication_form=AuthenticationForm,
          current_app=None, extra_context=None):
    """
    Displays the login form and handles the login action.
    """
    redirect_to = request.REQUEST.get(redirect_field_name, '')

    if request.method == "POST":
        form = authentication_form(request, data=request.POST)
        if form.is_valid():

            # Ensure the user-originating redirection url is safe.
            if not is_safe_url(url=redirect_to, host=request.get_host()):
                redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)

            # Okay, security check complete. Log the user in.
            auth_login(request, form.get_user())

            return HttpResponseRedirect(redirect_to)
    else:
        form = authentication_form(request)

    current_site = get_current_site(request)

    context = {
        'form': form,
        redirect_field_name: redirect_to,
        'site': current_site,
        'site_name': current_site.name,
    }
    if extra_context is not None:
        context.update(extra_context)
    return TemplateResponse(request, template_name, context,
                            current_app=current_app)

我的问题是:

1 REDIRECT_FIELD_NAME中函数中的django.contrib.auth是否设置为'/ profile /'?

我可以看到此变量是从django.contrib.auth

导入的
from django.contrib.auth import REDIRECT_FIELD_NAME, login as auth_login, logout as auth_logout, get_user_model

我没有对此变量进行任何设置,但在用户成功登录后,该页面将定向到/ accounts / profile /

2登录功能是否通过了有关用户的帐户信息?如果是,我该如何访问它?

从代码中,如果用户成功登录,页面将被重定向:return HttpResponseRedirect(redirect_to)

在我的情况下,

重定向到accounts / profile /,最初网址的视图只是一个

HttpResponse("You have logged in successfully")

现在当我尝试实现视图功能时,我意识到没有传递有关用户的信息。

我在视图功能中尝试了print request,但是在服务器终端中打印的消息中没有关于用户的信息,我得到的是一长串系统设置或其他信息。但是,登录应该将刚刚成功登录的人员的信息传递给成功登录URL吗?

非常感谢您的解释。

3 个答案:

答案 0 :(得分:4)

登录后,您可以在视图中引用request.user,在模板中引用{{user}}来访问用户信息。您需要确保的是,您将HttpResponse中的RequestContext传递给将来的请求。

是的,REDIRECT_FIELD_NAME在django.contrib.auth的__init__.py中定义,它只是您从登录表单传递的"next"

在Django中,有多种方法可以强制用户登录。通过使用@login_required装饰视图函数,通过调用用户定义的URL等的内置登录视图,请参阅登录设置变量here。你会得到更多的想法。

Building custom login page。该链接为您提供了自定义登录实现的示例。考虑您使用@login_required修饰了一个视图,其对应的网址是/login_test/。然后,登录表单中的{{next}}上下文变量将使用/login_test/呈现。所以登录后,

<input type="hidden" name="next" value="{{ next }}" />

此元素的值将根据REDIRECT_FIELD_NAME进行重定向。虽然我怀疑该示例缺少settings.LOGIN_URL到网址login/的设置。没关系,它在装饰器本身作为参数传递。

答案 1 :(得分:2)

要覆盖此行为,只需在应用的settings.py中添加以下内容:

LOGIN_REDIRECT_URL = "/"

这将重定向到您的主页。您可以将此网址更改为首选网址。

答案 2 :(得分:1)

将用户重定向到accounts / profile /后,将返回该链接的视图。您可以使用request.user按照此post访问有关当前登录用户的信息。同时提示查看您在视图中可以访问的信息。使用import pbd; pdb.set_trace()。这会弹出一个python提示符,可以访问所有当前变量。要查看所有已定义的变量,请调用locals(),尽管这会打印出大量的垃圾。在模板中,如果用户未登录,您可以display“您无法访问此页面”消息。

相关问题