被解放的姜戈06 假作真时

简介: 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   之前了解了: 创建Django项目 数据库 模板 表格提交 admin管理页面 上面的功能模块允许我们做出一个具有互动性的站点,但无法验证用户的身份。

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

之前了解了:

  • 创建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服务器上验证。如果用户名和密码正确,那么登入用户。

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

<form role="form" action="/login" method="post">
      <label>Username</label>
      <input type="text" name='username'>
      <label>Password</label>
      <input name="password" type="password">
      <input type="submit" value="Submit">
 </form>

 

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

# -*- 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的处理函数:

# -*- 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式的选择结构: 

# -*- coding: utf-8 -*-
from django.http import HttpResponse

def diff_response(request):
    if request.user.is_authenticated():
        content = "<p>my dear user</p>"
    else:
        content = "<p>you wired stranger</p>"
    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中的一个处理函数。

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

@login_required
def user_only(request):
    return HttpResponse("<p>This message is for logged in user only.</p>")

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

 

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

from django.contrib.auth.decorators import user_passes_test
from django.http import HttpResponse
def name_check(user):
    return user.get_username() == 'vamei'

@user_passes_test(name_check)
def specific_user(request):
    return HttpResponse("<p>for Vamei only</p>")

 

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

 

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

 

模板中的用户

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

{% 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中处理表格:

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如下:

<form action="" method="post">
   {% csrf_token %}
   {{ form.as_p }}
   <input type="submit" value="Register">
</form>

 

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

 

总结

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

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

 

两杆枪,一支指着德国人,一支指着姜戈。

 

欢迎阅读“被解放的姜戈”系列文章。

 

 

目录
相关文章
|
5月前
|
运维 监控
运维自动化:解放双手,提升效率
【8月更文挑战第20天】在数字化时代,运维工作的重要性日益凸显。然而,传统的运维方式往往需要大量的人力投入,且容易出错。本文将探讨如何通过运维自动化来解放双手,提升工作效率。我们将从运维自动化的概念、优势、实施步骤以及注意事项等方面进行详细阐述。
|
SQL 数据可视化 关系型数据库
低代码平台——减少开发bug,解放程序员
低代码平台——减少开发bug,解放程序员
|
2月前
|
存储 数据可视化 数据挖掘
高效电商运营的秘密:从繁琐中解放,专注创收
电商运营工作繁琐且重复,容易分散精力,影响创收效率。借助 Leangoo,可实现任务清晰化管理、时间节点精准把控和任务进展高效追踪。例如,通过看板管理“双11活动复盘”,覆盖数据汇总、问题分析和优化建议,确保任务清晰透明。Leangoo 帮助团队从琐碎中解放,专注创收与创新,是电商运营提效的得力工具。
|
5月前
|
运维 监控 持续交付
"揭秘Puppet:自动化运维的超级英雄,一键驾驭复杂IT环境,让运维繁琐瞬间灰飞烟灭,引领未来运维新纪元!"
【8月更文挑战第9天】Puppet作为自动化运维的杰出代表,凭借其强大的配置管理和高度可定制性,助力IT运维实现自动化与智能化转型。通过定义资源模型与使用声明式语言描述系统状态,Puppet能自动调整系统至期望状态,实现标准化运维流程。其工作流程包括定义-应用-报告三步,支持从服务器配置到复杂网络、数据库管理等多种场景。示例代码展示了如何自动化部署Apache服务器,体现了Puppet在实际操作中的高效与便捷。随着技术演进与社区壮大,Puppet将持续推动运维领域的创新发展。
88 6
|
7月前
|
运维 监控 安全
自动化运维:解放双手,提升效率
【6月更文挑战第19天】本文将深入探讨自动化运维的重要性和优势,以及如何实现自动化运维。我们将从自动化运维的定义开始,然后讨论它的优势,包括提高效率、减少错误、节省成本等。接下来,我们将详细介绍如何实现自动化运维,包括选择合适的工具和技术、设计自动化流程、测试和优化等步骤。最后,我们将通过一个实际案例来展示自动化运维的实施过程和效果。
|
运维 监控 Cloud Native
运维自动化:提高效率的秘诀
运维自动化:提高效率的秘诀
195 0
|
8月前
|
监控 供应链 安全
解放生产力:项目管理软件的神奇作用大揭秘!
项目管理软件是整合了项目管理理论的计算机系统,用于协助团队规划、执行和监控项目,提高效率、促进沟通、风险管理及监控进度。PMI、IPMA和Gartner对其有不同定义,强调其在协作、计划制定和沟通中的角色。软件提供统一平台,确保项目按时间表、预算和质量标准推进,通过自动化工作流、沟通模块和风险管理功能增强团队合作。选择软件时要考虑团队规模、行业需求、易用性和安全性。
60 0
|
8月前
|
传感器 监控 自动驾驶
耕耘和栽培自动化
耕耘和栽培自动化
172 5
|
数据采集 数据可视化 JavaScript
低代码:解放生产力的利器还是一场空洞的炒作?
低代码:解放生产力的利器还是一场空洞的炒作?
48 0
|
人工智能 自然语言处理 文字识别
【TICA2020早班车】解放双手,一切皆可自动化
阿里QA导读:早班车第5趟,距离TICA2020只剩下【10天】啦,快上车!今天小编为大家带来陈冠诚老师「AI自动化测试的实践」,跟大家一起看看下一代智能化测试是什么样子的。不要忘记参与文末抽奖,赢免费门票和周边哟。团体票已备好,有需求可以钉钉扫码入群咨询哦
208 0
【TICA2020早班车】解放双手,一切皆可自动化