详解Django框架中用户的登录和退出的实现


Posted in Python onJuly 23, 2015

Django 提供内置的视图(view)函数用于处理登录和退出 (以及其他奇技淫巧),但在开始前,我们来看看如何手工登录和退出。 Django提供两个函数来执行django.contrib.auth\中的动作 : authenticate()和login()。

认证给出的用户名和密码,使用 authenticate() 函数。它接受两个参数,用户名 username 和 密码 password ,并在密码对给出的用户名合法的情况下返回一个 User 对象。 如果密码不合法,authenticate()返回None。

>>> from django.contrib import auth
>>> user = auth.authenticate(username='john', password='secret')
>>> if user is not None:
...   print "Correct!"
... else:
...   print "Invalid password."

authenticate() 只是验证一个用户的证书而已。 而要登录一个用户,使用 login() 。该函数接受一个 HttpRequest 对象和一个 User 对象作为参数并使用Django的会话( session )框架把用户的ID保存在该会话中。

下面的例子演示了如何在一个视图中同时使用 authenticate() 和 login() 函数:

from django.contrib import auth

def login_view(request):
  username = request.POST.get('username', '')
  password = request.POST.get('password', '')
  user = auth.authenticate(username=username, password=password)
  if user is not None and user.is_active:
    # Correct password, and the user is marked "active"
    auth.login(request, user)
    # Redirect to a success page.
    return HttpResponseRedirect("/account/loggedin/")
  else:
    # Show an error page
    return HttpResponseRedirect("/account/invalid/")

注销一个用户,在你的视图中使用 django.contrib.auth.logout() 。 它接受一个HttpRequest对象并且没有返回值。

from django.contrib import auth

def logout_view(request):
  auth.logout(request)
  # Redirect to a success page.
  return HttpResponseRedirect("/account/loggedout/")

注意,即使用户没有登录, logout() 也不会抛出任何异常。

在实际中,你一般不需要自己写登录/登出的函数;认证系统提供了一系例视图用来处理登录和登出。 使用认证视图的第一步是把它们写在你的URLconf中。 你需要这样写:

from django.contrib.auth.views import login, logout

urlpatterns = patterns('',
  # existing patterns here...
  (r'^accounts/login/$', login),
  (r'^accounts/logout/$', logout),
)

/accounts/login/ 和 /accounts/logout/ 是Django提供的视图的默认URL。

缺省情况下, login 视图渲染 registragiton/login.html 模板(可以通过视图的额外参数 template_name 修改这个模板名称)。 这个表单必须包含 username 和 password 域。如下示例: 一个简单的 template 看起来是这样的

{% extends "base.html" %}

{% block content %}

 {% if form.errors %}
  <p class="error">Sorry, that's not a valid username or password</p>
 {% endif %}

 <form action="" method="post">
  <label for="username">User name:</label>
  <input type="text" name="username" value="" id="username">
  <label for="password">Password:</label>
  <input type="password" name="password" value="" id="password">

  <input type="submit" value="login" />
  <input type="hidden" name="next" value="{{ next|escape }}" />
 </form>

{% endblock %}

如果用户登录成功,缺省会重定向到 /accounts/profile 。 你可以提供一个保存登录后重定向URL的next隐藏域来重载它的行为。 也可以把值以GET参数的形式发送给视图函数,它会以变量next的形式保存在上下文中,这样你就可以把它用在隐藏域上了。

logout视图有一些不同。 默认情况下它渲染 registration/logged_out.html 模板(这个视图一般包含你已经成功退出的信息)。 视图中还可以包含一个参数 next_page 用于退出后重定向。

Python 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
用python写asp详细讲解
Dec 16 Python
python strip() 函数和 split() 函数的详解及实例
Feb 03 Python
Python装饰器原理与简单用法实例分析
Apr 29 Python
python+os根据文件名自动生成文本
Mar 21 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
python常用数据重复项处理方法
Nov 22 Python
Django values()和value_list()的使用
Mar 31 Python
python如何调用字典的key
May 25 Python
Python 私有属性和私有方法应用场景分析
Jun 19 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
Apr 02 Python
在Django的session中使用User对象的方法
Jul 23 #Python
Django的session中对于用户验证的支持
Jul 23 #Python
在Django的视图(View)外使用Session的方法
Jul 23 #Python
在Python的Django框架的视图中使用Session的方法
Jul 23 #Python
详解Python的Django框架中的Cookie相关处理
Jul 22 #Python
在Django中使用Sitemap的方法讲解
Jul 22 #Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 #Python
You might like
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
一道关于JavaScript变量作用域的面试题
2016/03/08 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
vue实现简单的MVVM框架
2018/08/05 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
彻底搞懂Python字符编码
2018/01/23 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
Python 做曲线拟合和求积分的方法
2018/12/29 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
Python二元赋值实用技巧解析
2019/10/25 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
Python log模块logging记录打印用法解析
2020/01/20 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
法国二手MacBook销售网站:Okamac
2019/03/18 全球购物
银行财务部实习生的自我鉴定
2013/11/27 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
合作经营协议书
2014/04/17 职场文书
小学数学课后反思
2014/04/23 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
Pygame Event事件模块的详细示例
2021/11/17 Python
Java中API的使用方法详情
2022/04/06 Java/Android