详解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(一)Python环境安装
Aug 20 Python
Cpy和Python的效率对比
Mar 20 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
使用python3实现操作串口详解
Jan 01 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
Django实现跨域的2种方法
Jul 31 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
python实现ROA算子边缘检测算法
Apr 05 Python
变长双向rnn的正确使用姿势教学
May 31 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
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
header跳转和include包含问题详解
2012/09/08 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
js手机号批量滚动抽奖实现代码
2020/04/17 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
python删除列表内容
2015/08/04 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
python打包生成so文件的实现
2020/10/30 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
python中if嵌套命令实例讲解
2021/02/25 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
三潭印月的导游词
2015/02/12 职场文书
人民的好儿女观后感
2015/06/18 职场文书
三八妇女节主持词
2015/07/04 职场文书
银行岗位培训心得体会
2016/01/09 职场文书