django authenticate
程序少不了验证用户与权限分配。通过 Django 自带以及我们一些扩展就能够满足验证与权限的需求。
我在使用 Django 遇到的“login(request, user) 之后,再重定向这个 request,然后 request.user 变成了 anonymous user”问题。
使用了一个自定义的 backend,然后使用 authenticate(parm) 能够获取到 user。
搜索了这些
django login in and redirect to current_url - Google 搜索
django 登陆之后丢失信息 - Google 搜索
Redirect to the originally requested page after django registration and email activation | Mitch Fournier
Django:Redirect after login success - Stack Overflow
django redirect after login in without user - Google 搜索
django redirect after login not working - Google 搜索django last login session - Google 搜索
找了几小时都没有找到答案,一直尝试 login(request, user),每次 login 成功了,回来又是 request user。我大部分时间怀疑 login() 方法是不是有问题,但并没有什么收获。然后看了看自定义的 backend,没发现问题,并且通过 authenticate 能够拿到 user。然后问了同事,他们也找到问题。
问了别人都没解决,那只能再次自己动手了。这次我想从底层弄起,想 http 是无状态的,只能通过 cookie, session 来获取状态。那么Django登录一定是在 session 中做文章。于是把 Django 的session变为 dict 查看,发现了问题
session 中存在 _auth_user_id,但是 request.user=AnonymousUser: AnonymousUser
dict_items([('_auth_user_backend', 'apps.traffic.backends.WeixinAccessTokenAuthenticationBackend'), ('openid', 'ouRGywq5gA9bTyMvAw-JcovC6M00'), ('_auth_user_id', '254'), ('_auth_user_hash', '2f27f6ec2895b333caa320790f7868d87094017c'), ('code', '0412PZ1T1Uj85a1HGK1T1BvY1T12PZ1o'), ('_session_expiry', 2592000)])
于是又问同事,他说是 Django 中间件那里过不了。我看了下 backend,能通过 authenticate 获取 user 啊。没办法,再次 Google "django session and login in",这里http://eli.thegreenplace.net/2011/07/17/django-sessions-part-iii-user-authentication 说道
Auth middleware
Similarly to the path we've taken with sessions, it's instrumental to first see how authentication middleware is implemented. Or in other words, how did the "user" attribute get into my HTTP request?The answer is in contrib/auth/middleware.py [2]:
class LazyUser(object):
def __get__(self, request, obj_type=None):
if not hasattr(request, '_cached_user'):
from django.contrib.auth import get_user
request._cached_user = get_user(request)
return request._cached_user
于是搜索显示调用 `get_user(request)`发现返回的是 None,通过 Pycharm 打断点进去看,确认问题出在自定义 backend 上面,其中的 get_user 方法没有返回 user 对象,返回的是 None。问题终结!
反思一下为什么解决这个问题花了这么长时间:
没有规矩。
找 bug 随便找,并没有指定很好的方案。一直在 login 那里打转,不相信是其他的问题。
如果再让我来一次,我会调整为:
按照靠谱程度找 bug。自定义的代码比 Django 源码更不靠谱,所以先重点关注自定义的代码。
从底层入手。authenticate 的实现机制是什么,然后一层层往上。
认真的看代码,可以从下往上看,提高关注度,而不是扫一遍,觉得大概是没错的。
看一遍Django自定义 backend 是怎么写的,并与已有代码比较。
找完了 bug,进入正文。
Django 的认证方式:
middleware, 自定义基类, 装饰器以及Mixin
middleware
middleware 是笼罩所有视图的,比如我这有一个充值话费的项目,就使用了 middleware 来进行验证
自定义基类
自定义基类,我之前用过,感觉不灵活,是我自己想出来的,与 Django 的体系应该不同
装饰器以及Mixin
这个也属于 Django 的体系,也是我们常用的。有些页面需要登录就加装饰器,有些不需要就不加。
参考:
How Django sessions work - introduction (推荐看完这个系列)
django authenticate的更多相关文章
- python - django authenticate 返回结果一直是None
# 不论怎么测试 authenticate 返回结果一直是None,查了查原因好像是 django 2.1 版本的问题 ( 我用的是 2.1.7) 解决方法: 1. 先导入 from django.c ...
- Django学习系列之重写User模型和登录验证
重写User模型 Django内置的User模型可能不适合某些项目,我们可能要基于内置的添加一些字段 创建users app startapp users 修改settings.py配置文件,覆盖默认 ...
- 『Django』第N+1节: Django自带的认证系统 - auth
个人网站: lipeiguan.top 以后会慢慢转移到个人网站, 欢迎大家收藏^ . ^ 写在前面 我们在开发一个网站的时候, 经常需要实现网站的用户系统. 这个时候我们需要实现用户注册.用户登录. ...
- django 的auth.authenticate返回为None
使用auth.authenticate(username= username,passowrd=passowrd),这个用户认证时候,明明数据库中有记录,但是返回就None 我的错误点比较多: 1.我 ...
- Django 自带登录验证:authenticate和login,login_require,logout模块
验证之前需要在settings 中指定验证数据models AUTH_USER_MODEL = 'crm.UserProfile'#app名字.表名字 1.authenticate是一个方法,验证账号 ...
- Django中authenticate和login模块
Django 提供内置的视图(view)函数用于处理登录和退出,Django提供两个函数来执行django.contrib.auth中的动作 : authenticate()和login(). 认证给 ...
- django 自带认证系统(login,logout,authenticate,login_required)
from django.contrib.auth import login,authenticate,logoutfrom django.contrib.auth.decorators import ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- Django
一.Django 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统) ...
随机推荐
- Lind.DDD.Caching分布式数据集缓存介绍
回到目录 戏说当年 大叔原创的分布式数据集缓存在之前的企业级框架里介绍过,大家可以关注<我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器>,而今天主要对Lind.DDD.Cachin ...
- RequireJS+JQueryMobile
RequireJS提供了JS下模块化开发的充分条件.之前我自己也在多个项目中尝试模块化开发,但是由于没有类似RequireJS这样的框架,最后的效果都不是很理想. 在RequireJS中,所有的JS都 ...
- 对kinderEditor 的空内容进行验证
var con = document.getElementById(item.Id).value; var a = con.replace(/( )|[ ]|(<p>)|(<\/p& ...
- Objective-C 快速入门--基础(四)
1.什么是Block? ① 块语法,本质上是匿名函数(没有名称的函数): ② Block是OC中的一种数据类型,在iOS开发中被广泛使用: ③ ^是Block的特有标记: ④ Block的实现代码包含 ...
- MongoDB安装及配置成服务
最近接收了个新项目,这个项目用到了很多之前没用过的(MongoDB.Redis.MVC5+EF6 等等),以前只是看过别人用,自己从未尝试,唯独用了MVC2+EF4,可能是我落伍了,不扯了,进入正题. ...
- Ajax.BeginForm参数详解
在Asp.Net的MVC中的语法,在Razor页面中使用,替代JQuery的Ajax使用,方便快捷. 使用Ajax.BeginForm方法会生成一个form表单,最后以Ajax的方式提交表单数据:需要 ...
- ORACLE OLAP错误ORA-06512: at "SYS.OLAPIHISTORYRETENTION"
刚刚安装了ORACLE 10g R2后,启动数据库时发现告警日志有如下错误: Database Characterset is UTF8 replication_dependency_tracking ...
- 从零自学Hadoop(07):Eclipse插件
阅读目录 序 Eclipse Eclipse插件 新建插件项目 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写 ...
- 大数据系列(4)——Hadoop集群VSFTP和SecureCRT安装配置
前言 经过前三篇文章的介绍,已经通过VMware安装了Hadoop的集群环境,当然,我相信安装的过程肯定遇到或多或少的问题,这些都需要自己解决,解决的过程就是学习的过程,本篇的来介绍几个Hadoop环 ...
- [Java入门笔记] 面向对象编程基础(一):类和对象
什么是面向对象编程? 我们先来看看几个概念: 面向过程程序设计 面向过程,是根据事情发展的步骤,按进行的顺序过程划分,面向过程其实是最为实际的一种思考方式,可以说面向过程是一种基础的方法,它考虑的是实 ...