详解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 相关文章推荐
java直接调用python脚本的例子
Feb 16 Python
python文件和目录操作函数小结
Jul 11 Python
Python中getattr函数和hasattr函数作用详解
Jun 14 Python
用pickle存储Python的原生对象方法
Apr 28 Python
解决PyCharm中光标变粗的问题
Aug 05 Python
Django实现快速分页的方法实例
Oct 22 Python
全面分析Python的优点和缺点
Feb 07 Python
Python实现的计算器功能示例
Apr 26 Python
python如何读取bin文件并下发串口
Jul 05 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
python如何运行js语句
Sep 09 Python
python中的列表和元组区别分析
Dec 30 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获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
JS中 用户登录系统的解决办法
2013/04/15 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python可跨平台实现获取按键的方法
2015/03/05 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
python 日期操作类代码
2018/05/05 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
python 如何将office文件转换为PDF
2020/09/22 Python
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
学前教育毕业生自荐信范文
2013/12/24 职场文书
小学运动会表扬稿
2014/01/19 职场文书
小学英语教学反思案例
2014/02/04 职场文书
物理力学求职信
2014/02/18 职场文书
留学推荐信中文范文
2015/03/26 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
2016年教师节慰问信
2015/12/01 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python