实战Django:Rango Part5
在讲完注册模块之后,我们来着手实现登录和注销模块。
21.添加登录模块
注册功能做好了,接下来我们来完成登录模块。
以下是我们要完成的工作:
- 创建一个登录视图;
- 创建登录模板来显示登录表单;
- 将登录视图映射到URL;
- 在首页上添加登录链接;
我们先来搞定登录视图。
编辑rango/views.py,添加以下内容:
rango/views.py:
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', {})
最后,别忘了在文件头部加入以下代码:
from django.contrib.auth import authenticate, login from django.http import HttpResponseRedirect, HttpResponse
接下来创建登录模板,创建templates/rango/login.html,加入如下内容:
templates/rango/login.html:
{% 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 %}
【未完待续】
本文版权归舍得学苑所有,欢迎转载,转载请注明作者和出处。谢谢!
作者:舍得
首发:舍得学苑@博客园