首页 文章

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

提问于
浏览
0

嗨我使用了django inbult auth urls和我的项目的视图,现在已完成初始用户帐户创建/登录/重置密码过程 .

现在,用户可以登录并重定向到成功登录url accounts / profile /之后 .

我对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 Is the REDIRECT_FIELD_NAME in the function set as '/profile/' in django.contrib.auth ?

我可以看到这个变量是从 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 Has the login function passed the account info about the user? If yes, how can I access it?

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

在我的情况下,重定向到accounts / profile /,最初网址的视图只是一个

HttpResponse("You have logged in successfully")

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

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

非常感谢您的解释 .

3 回答

  • 1

    登录后,您可以通过在视图中引用 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 装饰了一个视图,它的相应URL是 /login_test/ . 然后,登录表单中的 {{next}} 上下文变量将使用 /login_test/ 呈现 . 所以你登录后

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

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

  • 3

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

    LOGIN_REDIRECT_URL = "/"

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

  • 2

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

相关问题