详解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操作Mysql实例代码教程在线版(查询手册)
Feb 18 Python
Python中用Ctrl+C终止多线程程序的问题解决
Mar 30 Python
python @property的用法及含义全面解析
Feb 01 Python
python3爬取数据至mysql的方法
Jun 26 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
Oct 30 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
Pytorch Tensor的索引与切片例子
Aug 18 Python
Python:slice与indices的用法
Nov 25 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
Python趣味入门教程之循环语句while
Aug 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
2020最新CPU的性能排名
2020/04/02 数码科技
遭遇php的in_array低性能问题
2013/09/17 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
完善的jquery处理机制
2016/02/21 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
jQuery实现动态控制页面元素的方法分析
2017/12/20 jQuery
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
Element Card 卡片的具体使用
2020/07/26 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
深入理解python函数递归和生成器
2016/06/06 Python
python遍历小写英文字母的方法
2019/01/02 Python
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
法雷奥SQA(electric)面试问题
2016/01/23 面试题
学生会竞选自荐信
2013/10/12 职场文书
自荐书模板
2013/12/15 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
男方婚礼答谢词
2015/01/20 职场文书
公积金贷款承诺书
2015/04/30 职场文书
施工安全保证书
2015/05/09 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL