详解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中的from..import绝对导入语句
Jun 21 Python
python executemany的使用及注意事项
Mar 13 Python
用Python实现随机森林算法的示例
Aug 24 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
pandas对dataFrame中某一个列的数据进行处理的方法
Jul 08 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
python基于K-means聚类算法的图像分割
Oct 30 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
简单的Python人脸识别系统
Jul 14 Python
怎么解决pycharm license Acti的方法
Oct 28 Python
python BeautifulSoup库的安装与使用
Dec 17 Python
Python中requests做接口测试的方法
May 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
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
JS使用JSON作为参数实例分析
2016/06/23 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
python的pdb调试命令的命令整理及实例
2017/07/12 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
python 自动重连wifi windows的方法
2018/12/18 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
部队学习十八大感言
2014/01/11 职场文书
商务邀请函范文
2014/01/14 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
学前班学生评语
2014/12/29 职场文书
图书馆义工感想
2015/08/07 职场文书