详解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 splitlines使用技巧
Sep 06 Python
在Python中使用sort()方法进行排序的简单教程
May 21 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
详解python中asyncio模块
Mar 03 Python
Python将list中的string批量转化成int/float的方法
Jun 26 Python
在Python中实现替换字符串中的子串的示例
Oct 31 Python
在Python中COM口的调用方法
Jul 03 Python
Python 如何提高元组的可读性
Aug 26 Python
python使用Geany编辑器配置方法
Feb 21 Python
用于ETL的Python数据转换工具详解
Jul 21 Python
Django实现在线无水印抖音视频下载(附源码及地址)
May 06 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
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP与Ajax相结合实现登录验证小Demo
2016/03/16 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
ppk谈JavaScript style属性
2008/10/10 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
JS作用域链详解
2017/06/26 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
让 python 命令行也可以自动补全
2014/11/30 Python
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
python模块之paramiko实例代码
2018/01/31 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
flask框架路由常用定义方式总结
2019/07/23 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
python如何将两个txt文件内容合并
2019/10/18 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
20年同学聚会邀请函
2014/02/04 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书