在讲完注册模块以后,咱们来着手实现登陆和注销模块。html
21.添加登陆模块 django
注册功能作好了,接下来咱们来完成登陆模块。小程序
如下是咱们要完成的工做:浏览器
咱们先来搞定登陆视图。ide
编辑rango/views.py,添加如下内容:post
rango/views.py:ui
def user_login(request): # 若是是HTTP POST请求,则尝试取出相关的数据 if request.method == 'POST': # 获取用户提供的用户名和密码,这些信息包含在登陆表单中 username = request.POST['username'] password = request.POST['password'] # 验证用户名和密码,验证经过将返回一个user对象. user = authenticate(username=username, password=password) # 若验证经过 if user: # 检查帐户是否已激活(可能会被禁用). if user.is_active: # 若是用户帐户有效且已激活,可容许用户登陆。 # 咱们将引导用户回到首页. login(request, user) return HttpResponseRedirect('/rango/') else: # 用户帐户被禁用,则弹出警告信息! return HttpResponse("Your Rango account is disabled.") else: # 验证不经过,则不容许用户登陆 print ("Invalid login details: {0}, {1}".format(username, password)) return HttpResponse("Invalid login details supplied.") # 非 HTTP POST请求, 则显示登陆表单. else: # 没有要传送到模板系统的变量,因此直接传一个空的字典对象 return render(request, 'rango/login.html', {})
最后,别忘了在文件头部加入如下代码:url
from django.contrib.auth import authenticate, login from django.http import HttpResponseRedirect, HttpResponse
接下来建立登陆模板,建立templates/rango/login.html,加入以下内容:spa
templates/rango/login.html:rest
{% extends 'rango/base.html' %} {% block body_block %} <div class="hero-unit"> <h1>登陆Rango</h1> <div class="container"> <form class="form-signin span4" id="login_form" method="post" action="/rango/login/"> <h2 class="form-signin-heading">请登陆</h2> {% csrf_token %} {% if bad_details %} <p><strong>您输入的用户名或密码错误!</strong></p> {% elif disabled_account %} <p><strong>您的Rango帐户已被禁用,暂不能登陆!</strong></p> {% endif %} 用户名: <input type="text" class="input-block-level" placeholder="用户名" name="username" value="" size="50" /> <br /> 密码: <input type="password" class="input-block-level" placeholder="密码" name="password" value="" size="50" /> <br /> <button class="btn btn-primary" type="submit">登陆</button> </form> </div> <!-- /container --> </div> {% endblock %}
视图和模板都好了,接下来咱们来处理URL映射,把它们都连到一块儿。编辑rango/urls.py,改为下面这样:
rango/urls.py:
from django.conf.urls import patterns, url from rango import views urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^about/$', views.about, name='about'), url(r'^category/(?P<category_name_slug>\w+)$', views.category, name='category'), url(r'^add_category/$', views.add_category, name='add_category'), url(r'^category/(?P<category_name_slug>\w+)/add_page/$', views.add_page, name='add_page'), url(r'^register/$', views.register, name='register'), url(r'^login/$', views.user_login, name='login'), )
最后一步,咱们要在首页模板(templates/rango/index.html)中添加一个“登陆”连接。请在</body>标签前添加如下内容:
templates/rango/index.html:
<a href="/rango/login/">登陆</a><br />
搞完以上这些,赶脚还有些意犹未尽。我想让Rango更人性化一些,在用户登陆后来一句问候语。
继续修改首页模板,找到这句:
templates/rango/index.html:
<h1>欢迎来到Rango!</h1>
改成:
templates/rango/index.html:
{% if user.is_authenticated %} <h1> ` user`.`username `,欢迎来到Rango!</h1> {% else %} <h1>欢迎来到Rango!</h1> {% endif %}
咱们来看检查一下工做成果,在浏览器中输入:http://127.0.0.1:8000/rango/,而后点击“登陆”连接,输入用户名和密码以后(用管理员帐号“admin”便可),你会看到下面这样的页面:
22.添加访问限制有些内容,咱们只但愿给已登陆的用户看到。这在Django中如何实现呢?
咱们来简单演示一下。
编辑rango/views.py,添加如下内容:
rango/views.py:
@login_required def restricted(request): return HttpResponse("你只有在登陆后才能看到这段文本!")
别忘了在文件头部加入如下代码:
from django.contrib.auth.decorators import login_required
这个“@login_required”叫作“装饰器”,咱们能够理解成一段内置的小程序,程序在执行“restricted”这段代码前先执行”login_required“,检查用户有无登陆,只有在用户已登陆的状况下,才会显示”restricted“中的内容。
咱们一样要给“restricted”加上URL映射。编辑rango/urls.py,改为下面这样:
rango/urls.py:
urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^about/$', views.about, name='about'), url(r'^category/(?P<category_name_slug>\w+)', views.category, name='category'), url(r'^add_category/$', views.add_category, name='add_category'), url(r'^category/(?P<category_name_slug>\w+)/add_page/$', views.add_page, name='add_page'),
url(r'^register/$', views.register, name='register'), url(r'^login/$', views.user_login, name='login'), url(r'^restricted/', views.restricted, name='restricted'), )
为了让”login_required“将未登陆的用户引导到登陆页面,咱们在设置文件(rangoproject/settings.py)中要加入这样一句代码:
rangoproject/settings.py:
LOGIN_URL = '/rango/login/
23.添加注销模块
既然有登陆,那天然要提供一个注销模块,才显得更为合理。
在Django中加入一个注销模块是件很是简单的事情。编辑rango/views.py 文件,让它变成下面这个样子:
rango/views.py(注意将第一行放到文件头部):
from django.contrib.auth import logout # 使用login_required()装饰器来确保只有已登陆的用户才能够访问这个视图 @login_required def user_logout(request): # 咱们只能对已登陆的用户使用注销功能 logout(request) # 将用户从新引导回首页. return HttpResponseRedirect('/rango/')
加入URL映射。编辑rango/urls.py,改为下面这样:
rango/urls.py:
urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^about/$', views.about, name='about'), url(r'^category/(?P<category_name_slug>\w+)$', views.category, name='category'), url(r'^add_category/$', views.add_category, name='add_category'), url(r'^category/(?P<category_name_slug>\w+)/add_page/$', views.add_page, name='add_page'), url(r'^register/$', views.register, name='register'), url(r'^login/$', views.user_login, name='login'), url(r'^restricted/', views.restricted, name='restricted'), url(r'^logout/$', views.user_logout, name='logout'), )
咱们在模板中也要作相应的修改。只让已登陆的用户才能看到”注销“连接。
修改首页模板(templates/rango/index.html),把“注册”和”登陆“的两行代码删掉,加入以下内容:
templates/rango/index.html:
{% if user.is_authenticated %} <a href="/rango/restricted/">限制页面</a><br /> <a href="/rango/logout/">注销</a><br /> {% else %} <a href="/rango/register/">注册</a><br /> <a href="/rango/login/">登陆</a><br /> {% endif %}
【未完待续】