详解Django框架中用户的登录和退出的实现
Django提供内置的视图(view)函数用于处理登录和退出(以及其他奇技淫巧),但在开始前,我们来看看如何手工登录和退出。Django提供两个函数来执行django.contrib.auth\中的动作:authenticate()和login()。
认证给出的用户名和密码,使用authenticate()函数。它接受两个参数,用户名username和密码password,并在密码对给出的用户名合法的情况下返回一个User对象。如果密码不合法,authenticate()返回None。
>>>fromdjango.contribimportauth >>>user=auth.authenticate(username='john',password='secret') >>>ifuserisnotNone: ...print"Correct!" ...else: ...print"Invalidpassword."
authenticate()只是验证一个用户的证书而已。而要登录一个用户,使用login()。该函数接受一个HttpRequest对象和一个User对象作为参数并使用Django的会话(session)框架把用户的ID保存在该会话中。
下面的例子演示了如何在一个视图中同时使用authenticate()和login()函数:
fromdjango.contribimportauth deflogin_view(request): username=request.POST.get('username','') password=request.POST.get('password','') user=auth.authenticate(username=username,password=password) ifuserisnotNoneanduser.is_active: #Correctpassword,andtheuserismarked"active" auth.login(request,user) #Redirecttoasuccesspage. returnHttpResponseRedirect("/account/loggedin/") else: #Showanerrorpage returnHttpResponseRedirect("/account/invalid/")
注销一个用户,在你的视图中使用django.contrib.auth.logout()。它接受一个HttpRequest对象并且没有返回值。
fromdjango.contribimportauth deflogout_view(request): auth.logout(request) #Redirecttoasuccesspage. returnHttpResponseRedirect("/account/loggedout/")
注意,即使用户没有登录,logout()也不会抛出任何异常。
在实际中,你一般不需要自己写登录/登出的函数;认证系统提供了一系例视图用来处理登录和登出。使用认证视图的第一步是把它们写在你的URLconf中。你需要这样写:
fromdjango.contrib.auth.viewsimportlogin,logout urlpatterns=patterns('', #existingpatternshere... (r'^accounts/login/$',login), (r'^accounts/logout/$',logout), )
/accounts/login/和/accounts/logout/是Django提供的视图的默认URL。
缺省情况下,login视图渲染registragiton/login.html模板(可以通过视图的额外参数template_name修改这个模板名称)。这个表单必须包含username和password域。如下示例:一个简单的template看起来是这样的
{%extends"base.html"%} {%blockcontent%} {%ifform.errors%} <pclass="error">Sorry,that'snotavalidusernameorpassword</p> {%endif%} <formaction=""method="post"> <labelfor="username">Username:</label> <inputtype="text"name="username"value=""id="username"> <labelfor="password">Password:</label> <inputtype="password"name="password"value=""id="password"> <inputtype="submit"value="login"/> <inputtype="hidden"name="next"value="{{next|escape}}"/> </form> {%endblock%}
如果用户登录成功,缺省会重定向到/accounts/profile。你可以提供一个保存登录后重定向URL的next隐藏域来重载它的行为。也可以把值以GET参数的形式发送给视图函数,它会以变量next的形式保存在上下文中,这样你就可以把它用在隐藏域上了。
logout视图有一些不同。默认情况下它渲染registration/logged_out.html模板(这个视图一般包含你已经成功退出的信息)。视图中还可以包含一个参数next_page用于退出后重定向。