详解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中操作字符串之rstrip()方法的使用
May 19 Python
python django事务transaction源码分析详解
Mar 17 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
对python 判断数字是否小于0的方法详解
Jan 26 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
Jun 20 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
python如何从文件读取数据及解析
Sep 19 Python
django 取消csrf限制的实例
Mar 13 Python
jupyter 导入csv文件方式
Apr 21 Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
Oct 16 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 HtmlReplace输入过滤安全函数
2010/07/03 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
php操作redis命令及代码实例大全
2020/11/19 PHP
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
2013/04/23 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
python实现端口转发器的方法
2015/03/13 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
python实现关键词提取的示例讲解
2018/04/28 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
python 自动去除空行的实例
2018/07/24 Python
python中必要的名词解释
2019/11/20 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
Python如何实现机器人聊天
2020/09/10 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
干部鉴定材料
2014/05/18 职场文书
企业公益活动策划方案
2014/08/24 职场文书
计划生育诚信协议书
2014/11/02 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
合作协议书格式范本
2016/03/21 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs