Python 快速教程(Django06):假作真时

之前了解了:

  • 创建Django项目
  • 数据库
  • 模板
  • 表格提交
  • admin管理页面

上面的功能模块允许我们做出一个具有互动性的站点,但无法验证用户的身份。我们这次了解用户验证部分。通过用户验证,我们可以根据用户的身份,提供不同的服务。

一个Web应用的用户验证是它的基本组成部分。我们在使用一个应用时,总是从“登录”开始,到“登出”结束。另一方面,用户验证又和网站安全、数据库安全息息相关。HTTP协议是无状态的,但我们可以利用储存在客户端的cookie或者储存在服务器的session来记录用户的访问。

Django有管理用户的模块,即django.contrib.auth。你可以在mysite/settings.py里看到,这个功能模块已经注册在INSTALLED_APPS中。利用该模块,你可以直接在逻辑层面管理用户,不需要为用户建立模型,也不需要手工去实现会话。

“为了救你的爱人出来,我们要演一场戏。”

创建用户

你可以在admin页面直接看到用户管理的对话框,即Users。从这里,你可以在这里创建、删除和修改用户。点击Add增加用户daddy,密码为daddyiscool。

在admin页面下,我们还可以控制不同用户组对数据库的访问权限。我们可以在Groups中增加用户组,设置用户组对数据库的访问权限,并将用户加入到某个用户组中。

在这一章节中,我们创立一个新的app,即users。下文的模板和views.py,都针对该app。

“你这套新衣服,还真像那么回事”,德国人说。

用户登录

我们建立一个简单的表格。用户通过该表格来提交登陆信息,并在Django服务器上验证。如果用户名和密码正确,那么登入用户。

我们首先增加一个登录表格:

1

2

3

4

5

6

7

form role="form" action="/login" method="post">

label>Usernamelabel>

input type="text" name=‘username‘>

label>Passwordlabel>

input name="password" type="password">

input type="submit" value="Submit">

form>

我们在views.py中,定义处理函数user_login(),来登入用户:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# -*- coding: utf-8 -*-

from django.shortcuts import render, redirect

from django.core.context_processors import csrf

from django.contrib.auth import *

def user_login(request):

‘‘‘

login

‘‘‘

if request.POST:

username = password = ‘‘

username = request.POST.get(‘username‘)

password = request.POST.get(‘password‘)

user     = authenticate(username=username, password=password)

if user is not None and user.is_active:

login(request, user)

return redirect(‘/‘)

ctx = {}

ctx.update(csrf(request))

return render(request, ‘login.html‘,ctx)

上面的authenticate()函数,可以根据用户名和密码,验证用户信息。而login()函数则将用户登入。它们来自于django.contrib.auth。

作为替换,我们可以使用特别的form对象,而不自行定义表格。这将让代码更简单,而且提供一定的完整性检验。

练习. 使用contrib.auth.forms.AuthenticationForm。来简化上面的模板和处理函数。

德国人还是不忘一再叮嘱,”记住,我们可不是什么赏金猎人。”

登出

有时用户希望能销毁会话。我们可以提供一个登出的URL,即/users/logout。登入用户访问该URL,即可登出。在views.py中,增加该URL的处理函数:

1

2

3

4

5

6

7

8

9

10

# -*- coding: utf-8 -*-

from django.shortcuts import redirect

def user_logout(request):

‘‘‘

logout

URL: /users/logout

‘‘‘

logout(request)

return redirect(‘/‘)

我们修改urls.py,让url对应user_logout()。访问http://127.0.0.1/users/logout,就可以登出用户。

德国人压低声音,“哦,我是来救你的,我们要演一出戏。”

views.py中的用户

上面说明了如何登入和登出用户,但还没有真正开始享受用户验证带来的好处。用户登陆的最终目的,就是为了让服务器可以区别对待不同的用户。比如说,有些内容只能让登陆用户看到,有些内容则只能让特定登陆用户看到。我们下面将探索如何实现这些效果。

在Django中,对用户身份的检验,主要是在views.py中进行。views.py是连接模型和视图的中间层。HTTP请求会转给views.py中的对应处理函数处理,并发回回复。在views.py的某个处理函数准备HTTP回复的过程中,我们可以检验用户是否登陆。根据用户是否登陆,我们可以给出不同的回复。最原始的方式,是使用if式的选择结构:

1

2

3

4

5

6

7

8

9

# -*- coding: utf-8 -*-

from django.http import HttpResponse

def diff_response(request):

if request.user.is_authenticated():

content = "my dear user"

else:

content = "you wired stranger"

return HttpResponse(content)

可以看到,用户的登录信息包含在request.user中,is_authenticated()方法用于判断用户是否登录,如果用户没有登录,那么该方法将返回false。该user对象属于contrib.auth.user类型,还有其它属性可供使用,比如

属性 功能
get_username() 返回用户名
set_password() 设置密码
get_fullname() 返回姓名
last_login 上次登录时间
date_joined   账户创建时间

练习. 实验上面的处理函数的效果。

在Django中,我们还可以利用装饰器,根据用户的登录状况,来决定views.py中处理函数的显示效果。相对于上面的if结构,装饰器使用起来更加方便。下面的user_only()是views.py中的一个处理函数。

1

2

3

4

5

6

from django.contrib.auth.decorators import login_required

from django.http import HttpResponse

@login_required

def user_only(request):

return HttpResponse("This message is for logged in user only.")

注意上面的装饰器login_required,它是Django预设的装饰器。user_only()的回复结果只能被登录用户看到,而未登录用户将被引导到其他页面。

Django中还有其它的装饰器,用于修饰处理函数。相应的http回复,只能被特殊的用户看到。比如user_passes_test,允许的用户必须满足特定标准,而这一标准是可以用户自定义的。比如下面,在views.py中增添:

1

from django.contrib.auth.decorators import user_passes_testfrom django.http import HttpResponse

1

2

3

4

5

6

def name_check(user):

return user.get_username() == ‘vamei‘

@user_passes_test(name_check)

def specific_user(request):

return HttpResponse("for Vamei only")

装饰器带有一个参数,该参数是一个函数对象name_check。当name_check返回真值,即用户名为vamei时,specific_user的结果才能被用户看到。

德国人羞涩的笑笑,“我确实对她有那么点好感。”

模板中的用户

进一步,用户是否登陆这一信息,也可以直接用于模板。比较原始的方式是把用户信息直接作为环境数据,提交给模板。然而,这并不是必须的。事实上,Django为此提供了捷径:我们可以直接在模板中调用用户信息。比如下面的模板:

1

2

3

4

5

{% if user.is_authenticated %}

p>Welcome, my genuine user, my true love.p>

{% else %}

p>Sorry, not login, you are not yet my sweetheart. p>

{% endif %}

不需要环境变量中定义,我们就可以直接在模板中引用user。这里,模板中调用了user的一个方法,is_authenticated,将根据用户的登录情况,返回真假值。需要注意,和正常的Python程序不同,在Django模板中调用方法并不需要后面的括号。

练习. 增加处理函数,显示该模板,然后查看不同登录情况下的显示结果。

管家冷不丁的说,“你认识他们?!”

用户注册

我们上面利用了admin管理页面来增加和删除用户。这是一种简便的方法,但并不能用于一般的用户注册的情境。我们需要提供让用户自主注册的功能。这可以让站外用户提交自己的信息,生成自己的账户,并开始作为登陆用户使用网站。

用户注册的基本原理非常简单,即建立一个提交用户信息的表格。表格中至少包括用户名和密码。相应的处理函数提取到这些信息后,建立User对象,并存入到数据库中。

我们可以利用Django中的UserCreationForm,比较简洁的生成表格,并在views.py中处理表格:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

from django.contrib.auth.forms import UserCreationForm

from django.shortcuts import render, redirect

from django.core.context_processors import csrf

def register(request):

if request.method == ‘POST‘:

form = UserCreationForm(request.POST)

if form.is_valid():

new_user = form.save()

return redirect("/")

else:

form = UserCreationForm()

ctx = {‘form‘: form}

ctx.update(csrf(request))

return render(request, "register.html", ctx)

相应的模板register.html如下:

1

2

3

4

5

form action="" method="post">

{% csrf_token %}

{{ form.as_p }}

input type="submit" value="Register">

form>

“骗子,你们这些骗子”,庄园主怒吼着。

总结

正如我们上面提到的,用户登陆系统的最大功能是区分登入和未登入用户,向他们提供不同的内容和服务。

我们看到了用户验证的基本流程,也看到了如何在views.py和模板中区分用户

本文分享自http://python.jobbole.com/83427/

时间: 2024-10-10 02:38:07

Python 快速教程(Django06):假作真时的相关文章

Python快速教程

Python快速教程 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库,乱花渐欲迷人眼.我一直希望写一个快速的.容易上手的Python教程,而且言语简洁,循序渐进,让没有背景的读者也可以从基础开始学习.我将在每一篇中专注于一个小的概念,希望在闲暇时可以很快读完. 小提醒 教程将专注于Python基础,语法基于Pytho

Python快速教程 尾声(转)

原文地址: http://www.cnblogs.com/vamei/p/3603046.html 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基础.标准库.Django框架.前前后后的文章,包含了Python最重要的组成部分.这一内容的跨度远远超过我的预期,也超过了我看过的任何Python相关书籍.最初动笔的原因,除了要总结,还对很多Pyth

Python 快速教程(补充篇04): Python简史

Python的起源 Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更加享受计算机带来的乐趣.用他的话说,尽管拥有数学和计算机双料资质,他总趋向于做计算机相关的工作,并热衷于做任何和编程相关的活儿. Guido von Rossum 在那个时候,他接触并使用过诸如Pascal.C. Fortran等语言.这些语言的基本设计原则

给深度学习入门者的Python快速教程

基础篇 numpy和Matplotlib篇 本篇部分代码的下载地址: https://github.com/frombeijingwithlove/dlcv_for_beginners/tree/master/chap5 5.3 Python的科学计算包 – Numpy numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算.这个库的前身是1995年就开始开发的一个用于数组运算的库.经过了长时间的发展,基本上成了绝大部分Python科学计算

Python 快速教程(补充篇05):字符串格式化 (%操作符)

在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出.Python中内置有对字符串进行格式化的操作%. 模板 格式化字符串时,Python使用一个字符串作为模板.模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式.Python用一个tuple将多个值传递给模板,每个值对应一个格式符. 比如下面的例子: Python 1 print("I'm %s. I'm %d year old" % ('Vamei', 99)) 上面的例子中

给深度学习入门者的Python快速教程 - 基础篇

实在搞不定博客园的排版,排版更佳的版本在: https://zhuanlan.zhihu.com/p/24162430 Life is short, you need Python 人生苦短,我用Python -- Bruce Eckel 5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明确.Python作者是荷兰人Guido van Rossum,1

Python 快速教程(Django03): 所谓伊人

在之前的程序中,我们直接生成一个字符串,作为http回复,返回给客户端.这一过程中使用了django.http.HttpResponse(). 在这样的一种回复生成过程中,我们实际上将数据和视图的格式混合了到上面的字符串中.看似方便,却为我们的管理带来困难.想像一个成熟的网站,其显示格式会有许多重复的地方.如果可以把数据和视图格式分离,就可以重复使用同一视图格式了. Django中自带的模板系统,可以将视图格式分离出来,作为模板使用.这样,不但视图可以容易修改,程序也会显得美观大方. "她是我心

Python 快速教程(Django05):黑面管家

Django提供一个管理数据库的app,即django.contrib.admin.这是Django最方便的功能之一.通过该app,我们可以直接经由web页面,来管理我们的数据库.这一工具,主要是为网站管理人员使用. 这个app通常已经预装好,你可以在mysite/settings.py中的INSTALLED_APPS看到它. "这庄园里的事情,都逃不过我的眼睛",管家放下账本,洋洋得意. 默认界面 admin界面位于[site]/admin这个URL.这通常在mysite/urls.

Python 快速教程(Django07):马不停蹄

前面的文章研究了Django最主要的几个方面:数据库,模板,动态生成页面等.但都是使用python manage.py runserver来运行服务器.这是一个实验性的web服务器,不适用于正常的站点运行.我们需要一个可以稳定而持续的服务器.这个服务器负责监听http端口,将收到的请求交给Django处理,将Django的回复发还给客户端. 这样的持续性服务器可以有很多选择,比如apache, Nginx, lighttpd等.这里将使用最常见的apache服务器.服务器和Django之间通过P