详解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 相关文章推荐
Python2.x版本中基本的中文编码问题解决
Oct 12 Python
python如何在终端里面显示一张图片
Aug 17 Python
Python实现进程同步和通信的方法
Jan 02 Python
python实现求两个字符串的最长公共子串方法
Jul 20 Python
Python 给某个文件名添加时间戳的方法
Oct 16 Python
Django使用AJAX调用自己写的API接口的方法
Mar 06 Python
Python中如何导入类示例详解
Apr 17 Python
Python将列表中的元素转化为数字并排序的示例
Dec 25 Python
如何在mac环境中用python处理protobuf
Dec 25 Python
python实现学生成绩测评系统
Jun 22 Python
Django Form常用功能及代码示例
Oct 13 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 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提取根域名
2016/03/31 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
浅析return false的正确使用
2013/11/04 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
Python实现的括号匹配判断功能示例
2018/08/25 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
Django 开发环境配置过程详解
2019/07/18 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
浅谈Html5页面打开app的一些思考
2020/03/30 HTML / CSS
物流管理专业大学生自荐信
2013/10/04 职场文书
合同协议书格式
2014/04/18 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
MySQL 时间类型的选择
2021/06/05 MySQL
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技