详解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爬取读者并制作成PDF
Mar 10 Python
python 线程的暂停, 恢复, 退出详解及实例
Dec 06 Python
python多线程socket编程之多客户端接入
Sep 12 Python
python中set()函数简介及实例解析
Jan 09 Python
django反向解析URL和URL命名空间的方法
Jun 05 Python
对pandas处理json数据的方法详解
Feb 08 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
python颜色随机生成器的实例代码
Jan 10 Python
Python ATM功能实现代码实例
Mar 19 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 Python
Python入门之基础语法详解
May 11 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
apache rewrite_module模块使用教程
2008/01/10 PHP
那些年一起学习的PHP(二)
2012/03/21 PHP
用PHP编写和读取XML的几种方式
2013/01/12 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
js鼠标左右键 键盘值小结
2010/06/11 Javascript
统计出现最多的字符次数的js代码
2010/12/03 Javascript
jQuery 幻灯片插件(带缩略图功能)
2011/01/24 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
jQuery实现拖拽可编辑模块功能代码
2017/01/12 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
vue做网页开场视频的实例代码
2017/10/20 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
python 并发下载器实现方法示例
2019/11/22 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
django 模型字段设置默认值代码
2020/07/15 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
Python之多进程与多线程的使用
2021/02/23 Python
马耳他航空公司官方网站:Air Malta
2019/05/15 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
十周年庆典策划方案
2014/06/03 职场文书
宿舍标语大全
2014/06/19 职场文书
党支部四风整改方案
2014/10/25 职场文书
Mysql基础之常见函数
2021/04/22 MySQL