详解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实现获取命令行输出结果的方法
Jun 10 Python
python调用Delphi写的Dll代码示例
Dec 05 Python
django 修改server端口号的方法
May 14 Python
Python+threading模块对单个接口进行并发测试
Jun 25 Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
python列表切片和嵌套列表取值操作详解
Feb 27 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
Django CBV模型源码运行流程详解
Aug 17 Python
如何实现一个python函数装饰器(Decorator)
Oct 12 Python
Python实战之实现康威生命游戏
Apr 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
社区(php&amp;&amp;mysql)一
2006/10/09 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
php如何调用webservice应用介绍
2012/11/24 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
Maps Javascript
2007/01/22 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python 调用Java实例详解
2017/06/02 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
python实现求特征选择的信息增益
2018/12/18 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
django如何自己创建一个中间件
2019/07/24 Python
python 等差数列末项计算方式
2020/05/03 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
开办化妆品公司创业计划书
2013/12/26 职场文书
校三好学生主要事迹
2014/01/11 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
2015年推普周活动方案
2015/05/06 职场文书