实战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_url>\w+)$‘, views.category, name=‘category‘),
    url(r‘^add_category/$‘, views.add_category, name=‘add_category‘),
    url(r‘^category/(?P<category_name_url>\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‘^(?P<category_name_url>\w+)‘, views.category, name=‘category‘),
    url(r‘^add_category/$‘, views.add_category, name=‘add_category‘),
    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_url>\w+)$‘, views.category, name=‘category‘),
    url(r‘^add_category/$‘, views.add_category, name=‘add_category‘),
    url(r‘^category/(?P<category_name_url>\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 %}

【未完待续】

本文版权归舍得学苑所有,欢迎转载,转载请注明作者和出处。谢谢!

作者:舍得

首发:舍得学苑@博客园

 
时间: 2024-08-03 19:24:47

实战Django:Rango Part5的相关文章

实战Django:Rango Part1

在前面我们已经陆续学习了六个Django的实例,其中一个来自Django官方的文档,另外五个来自<Django Web开发指南>.舍得介绍的每一个实例,都是按照官方文档的标准,力求让大家在根据文章去做自己的实例时,能够按"文"索骥,轻松再现整个实例的制作过程. 接下来,舍得要介绍一个大型的实例,这个项目叫做Rango,它来自Django圈内口碑甚佳的<How to Tango with Django>一书.事实上,此书就是围绕Rango这一个实例来展开的,而且,

实战Django:Rango Part6

24.优化模板 在这个项目中,从已经做过的模板来看,你可能会注意到里面有很多重复的代码.这种重复不仅带来大量无谓的工作量,而且以后调整起来也极为不便. 因此,最理想的做法是将那些重复的代码放到基础模板中,然后从基础模板再扩展出一个个新的模板. 我们先来做这个基础模板,在templates/rango文件夹下新建一个base.html文件,然后添加以下内容: templates/rango/base.html: <!DOCTYPE html> <html> <head>

实战Django:Rango Part7

26.用Django-Registration-Redux进行用户校验 Django中,有好多现成的应用提供了注册.登录.校验等功能,我们只要稍稍改动一下URL映射.视图和模板就可以使用它们.在这一章,我们将介绍用Django-Registration-Redux,顺便学习一下如何把外部的应用加到我们的项目中. (1)安装Django-Registration-Redux 在Dos命令提示符下转到Python的Scripts文件夹,然后运行如下命令: pip install django-reg

实战Django:简易博客Part1

舍得学习新技能的时候,通常不喜欢傻读书--捧着一本阐述该项技能的书籍,然后傻看,一路看下来,脑子里塞满了新的概念.知识点,头是越来越大,但技能却几乎没掌握半分. 多年来,舍得养成了用做实例来学习新技能的习惯.这可不是舍得的独创,在象棋.围棋界中,历来有"打谱"一说,就是根据棋谱,把一步步棋摆出来,在打谱的过程中,去感悟.去吸收,此时感悟到的.吸收进的,才是属于你自己的东西.新的技能就这样一步步发展起来,逐渐壮大. 就象Django官方文档那样,一个实例看起来很简单,但作为初学者,用&q

实战Django:简易博客Part2

在Part1中,我们完成了本项目的基本框架搭建,并完善了一下管理后台,现在我们来看如何设计面向公共的页面部分. 8.创建模板 首先,请在blog文件夹下建立templates文件夹,然后,在templates文件夹中建立一个叫bog的文件夹,在这个bog文件夹下新建一个archive.html文件,这个文件的路径应该是: bog/templates/bog/archive.html 把下面这些代码添加到archive.html中: bog/templates/bog/archive.html:

实战Django:小型CMS Part2

回顾一下我们之前讲过的几个实例的流程,现在,我们只要添加一些内容(用来测试),创建视图.模板和URL模式,就能完成这个小型的CMS了.   7.添加内容 我们先来创建一个分类,点击Categories后面的"增加"按钮,然后在Label文本框中输入:"Django",在slug文本框后面输入"django"(django不用输入也能自动出现,你可以改成自己喜欢的名字): 随后点击后面的"保存"按钮. 点击左上方的"首

实战Django:Pastebin

  这是<Django Web开发指南>中的最后一个实例.如果说上一个实例Liveblog重点讲的是Django和Ajax的协作,那么我们在Pastebin中,将学习到Django和高亮语法JS的协作,顺便复习一下在Django中加入表单. 1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如"c:\python32\Scripts"),然后运行如下命令: $ django-admin startproject pastebinpr

实战Django:官方实例Part1

[写在前面] 撰写这个实战系列的Django文章,是很久之前就有的想法,问题是手头实例太少,一旦开讲,恐有"无米下锅"之忧. 随着对Django学习的深入,渐渐有了些心得,把这些心得整理出来,以规范的.方便新人上手的撰写方式来写这个实战系列,相信对刚接触Django的童鞋会有一定的帮助. 舍得这里所用到的版本,为Django 1.7.1,Python 3.2,想要按照舍得讲解的实例上手练习的话,请务必与舍得所用的版本保持一致. 实例是在Windows系统下调试的,如果你采用的是非Win

实战Django:小型CMS Part1

CMS,即Content Management System,内容管理系统.我们这里要开发的小型CMS应用,从结构上和blog应用有些类似,但我们会在这里加入一些新的技术,比如说工作流.搜索功能.编辑组件等. 1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如"c:\python32\Scripts"),然后运行如下命令: $ django-admin startproject cmsproject 然后在dos命令提示符下继续输入如下命令,

实战Django:LiveBlog

<Django Web开发指南>的实例讲的差不多了,除了今天要介绍的LiveBlog,还有一个Pastebin.这样,书中的实例基本讲完了.做完这些实例之后,舍得建议回头看看这本书,或许你会从书中找到舍得所讲的实例里忽略掉的一些细节.此外,<Django Web开发指南>中有几个章节是关于Django的基础或高级技术的,建议阅读并设法把它应用到你所练习过的实例中. 正如你已经看到的,Django提供了丰富的内置功能,你可以很轻松地用这些功能来完成很多工作.但和所有的工具一样,Dja