嗨我使用了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 回答
登录后,您可以通过在视图中引用
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
到URLlogin/
的设置 . 没关系,它是作为装饰器本身的参数传递的 .要覆盖此行为,只需在应用的
settings.py
中添加以下内容:LOGIN_REDIRECT_URL = "/"
这将重定向到您的主页 . 您可以将此网址更改为首选网址 .
将用户重定向到accounts / profile /后,将返回该链接的视图 . 您可以使用
request.user
按照此post访问有关当前登录用户的信息 . 同时提示查看您在视图中可以访问的信息 . 使用import pbd; pdb.set_trace()
. 这会弹出一个python提示符,可以访问所有当前变量 . 要查看所有已定义的变量,请调用locals()
,尽管这会打印出大量的垃圾 . 在模板中,如果用户未登录,您可以display "you can't access this page"消息 .