详解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 相关文章推荐
讲解Python中运算符使用时的优先级
May 14 Python
Python2.x版本中基本的中文编码问题解决
Oct 12 Python
使用pyecharts在jupyter notebook上绘图
Apr 23 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 Python
如何在python字符串中输入纯粹的{}
Aug 22 Python
Python的argparse库使用详解
Oct 09 Python
python实现控制COM口的示例
Jul 03 Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 Python
Pycharm 2020年最新激活码(亲测有效)
Sep 18 Python
如何用用Python将地址标记在地图上
Feb 07 Python
给numpy.array增加维度的超简单方法
Jun 02 Python
分享python函数常见关键字
Apr 26 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
使用php实现截取指定长度
2013/08/06 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
实习自我鉴定
2013/12/15 职场文书
请假条怎么写
2014/04/10 职场文书
效能风暴心得体会
2014/09/04 职场文书
四查四看整改措施
2014/09/19 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
华清池导游词
2015/02/02 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
支教个人总结
2015/03/04 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python