实战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”即可),你会看到下面这样的页面:

4_thumb

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 %}

 

【未完待续】

本文版权归舍得学苑所有,欢迎转载,转载请注明作者和出处。谢谢!
作者:舍得
首发:舍得学苑@博客园

 

posted on 2015-05-14 16:39  舍得学苑  阅读(426)  评论(0编辑  收藏  举报

导航