详解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入门教程
Feb 08 Python
python检测服务器是否正常
Feb 16 Python
Python读取mp3中ID3信息的方法
Mar 05 Python
解析Python中的二进制位运算符
May 13 Python
Python处理Excel文件实例代码
Jun 20 Python
详解用python实现简单的遗传算法
Jan 02 Python
python中requests和https使用简单示例
Jan 18 Python
python实现俄罗斯方块游戏
Mar 25 Python
Python 实现子类获取父类的类成员方法
Jan 11 Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 Python
基于Python爬取京东双十一商品价格曲线
Oct 23 Python
opencv 分类白天与夜景视频的方法
Jun 05 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
隐藏你的.php文件的实现方法
2007/03/19 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
php中动态调用函数的方法
2015/03/16 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
javascript getElementsByClassName函数
2010/04/01 Javascript
JS跨域总结
2012/08/30 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
vue2.0 better-scroll 实现移动端滑动的示例代码
2018/01/25 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
react 组件传值的三种方法
2019/06/03 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
使用Python对Excel进行读写操作
2017/03/30 Python
Python中turtle作图示例
2017/11/15 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
python 发送get请求接口详解
2020/11/17 Python
pycharm实现猜数游戏
2020/12/07 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
财务出纳员岗位职责
2013/11/26 职场文书
如何写一份好的自荐信
2014/01/02 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
超市督导岗位职责
2015/04/10 职场文书
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
MySQL分区路径子分区再分区
2022/04/13 MySQL