详解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在linux中输出带颜色的文字的方法
Jun 19 Python
Python随机生成带特殊字符的密码
Mar 02 Python
Python 多核并行计算的示例代码
Nov 07 Python
对numpy中数组转置的求解以及向量内积计算方法
Oct 31 Python
实例讲解Python中浮点型的基本内容
Feb 11 Python
Python中文编码知识点
Feb 18 Python
对python中的控制条件、循环和跳出详解
Jun 24 Python
Python基于network模块制作电影人物关系图
Jun 19 Python
python文件及目录操作代码汇总
Jul 08 Python
python Selenium 库的使用技巧
Oct 16 Python
python 实现性别识别
Nov 21 Python
一文带你了解Python 四种常见基础爬虫方法介绍
Dec 04 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
PHP使用数组实现矩阵数学运算的方法示例
2017/05/29 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
Yii框架安装简明教程
2020/05/15 PHP
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
Webpack实战加载SVG的方法
2017/12/26 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
浅谈Vue SSR中的Bundle的具有使用
2019/11/21 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
Python 闭包的使用方法
2017/09/07 Python
Django REST framework内置路由用法
2019/07/26 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
十岁生日答谢词
2015/01/05 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
小学生必读成语故事大全:送给暑假的你们
2019/07/09 职场文书