详解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文件比较示例分享
Jan 10 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
Apr 17 Python
python中管道用法入门实例
Jun 04 Python
python简单文本处理的方法
Jul 10 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
Python Django框架模板渲染功能示例
Nov 08 Python
Python continue语句实例用法
Feb 06 Python
pandas分组聚合详解
Apr 10 Python
python读取hdfs上的parquet文件方式
Jun 06 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 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实现每日签到功能
2018/11/29 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
javascript 二维数组的实现与应用
2010/03/16 Javascript
学习面向对象之面向对象的基本概念:对象和其他基本要素
2010/11/30 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
vue如何进行动画的封装
2018/09/26 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
layer 刷新某个页面的实现方法
2019/09/05 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
python fabric使用笔记
2015/05/09 Python
使用Python AIML搭建聊天机器人的方法示例
2018/07/09 Python
浅析python中while循环和for循环
2019/11/19 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
为什么会有内存对齐
2016/10/10 面试题
社团活动策划书范文
2014/01/09 职场文书
学年末自我鉴定
2014/01/21 职场文书
出国考察邀请函
2014/01/21 职场文书
电大会计学自我鉴定
2014/02/06 职场文书
建材投资建议书
2014/05/16 职场文书
医药销售自我评价200字
2014/09/11 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
同学会邀请函模板
2015/01/30 职场文书
2015年大学生实习评语
2015/03/25 职场文书