解决Django模板无法使用perms变量问题的方法


Posted in Python onSeptember 10, 2017

前言

本文主要给大家介绍了关于Django模板无法使用perms变量的解决方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

解决方法:

首先,在使用Django内置权限管理系统时,settings.py文件要添加

INSTALLED_APPS添加:
'django.contrib.auth',

 
MIDDLEWARE添加:
'django.contrib.auth.middleware.AuthenticationMiddleware',

'django.contrib.auth.context_processors.auth',
TEMPLATES = [
 {
  'BACKEND': 'django.template.backends.django.DjangoTemplates',
  'DIRS': [os.path.join(BASE_DIR, 'templates')],
  'APP_DIRS': True,
  'OPTIONS': {
   'context_processors': [
    'django.template.context_processors.debug',
    'django.template.context_processors.i18n',
    'django.template.context_processors.media',
    'django.template.context_processors.static',
    'django.template.context_processors.tz',
    'django.contrib.messages.context_processors.messages',
    'django.template.context_processors.request',
    'django.contrib.auth.context_processors.auth',
   ],
  },
 },
]

如何在模板进行权限检查呢?

根据官网说明 https://docs.djangoproject.com/en/1.11/topics/auth/default/#permissions ,已登录用户权限保存在模板{{ perms }}变量中,是权限模板代理django.contrib.auth.context_processors.PermWrapper的一个实例,具体可以查看django/contrib/auth/context_processors.py源码

测试用例:

解决Django模板无法使用perms变量问题的方法 

测试过程中,发现{{ perms }}变量压根不存在,没有任何输出;好吧,只能取Debug Django的源码了

def auth(request):
 """
 Returns context variables required by apps that use Django's authentication
 system.

 If there is no 'user' attribute in the request, uses AnonymousUser (from
 django.contrib.auth).
 """
 if hasattr(request, 'user'):
  user = request.user
 else:
  from django.contrib.auth.models import AnonymousUser
  user = AnonymousUser()
 print(user, PermWrapper(user), '-----------------------')
 return {
  'user': user,
  'perms': PermWrapper(user),
 }

测试访问接口,发现有的接口有打印权限信息,有的没有,似乎恍然醒悟

可以打印权限信息的接口返回:

return render(request, 'fms/fms_add.html', {'request': request, 'form': form, 'error': error})

不能打印权限新的接口返回:

return render_to_response( 'fms/fms.html', data)

render和render_to_response区别

render是比render_to_reponse更便捷渲染模板的方法,会自动使用RequestContext,而后者需要手动添加:

return render_to_response(request, 'fms/fms_add.html', {'request': request, 'form': form, 'error': error},context_instance=RequestContext(request))

其中RequestContext是django.template.Context的子类.接受requestcontext_processors ,从而将上下文填充渲染到模板问题已经很明确,由于使用了render_to_response方法,没有手动添加context_instance=RequestContext(request)导致模板不能使用{{ perms }}变量

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
pyqt和pyside开发图形化界面
Jan 22 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
May 02 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
详解python做UI界面的方法
Feb 27 Python
python实现WebSocket服务端过程解析
Oct 18 Python
python绘制规则网络图形实例
Dec 09 Python
Python正则表达式学习小例子
Mar 03 Python
Django实现列表页商品数据返回教程
Apr 03 Python
Python实现转换图片背景颜色代码
Apr 30 Python
使用Python pip怎么升级pip
Aug 11 Python
java关于string最常出现的面试题整理
Jan 18 Python
Python 中面向接口编程
May 20 Python
python实现批量修改文件名代码
Sep 10 #Python
python中利用队列asyncio.Queue进行通讯详解
Sep 10 #Python
Python上下文管理器和with块详解
Sep 09 #Python
Python使用asyncio包处理并发详解
Sep 09 #Python
Python协程的用法和例子详解
Sep 09 #Python
python利用dir函数查看类中所有成员函数示例代码
Sep 08 #Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 #Python
You might like
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
Python中多线程及程序锁浅析
2015/01/21 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
set在python里的含义和用法
2019/06/24 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
Farnell德国:电子元器件供应商
2018/07/10 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
公司证明怎么写
2014/09/22 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书
物业公司管理制度
2015/08/05 职场文书
HTML5中 rem适配方案与 viewport 适配问题详解
2021/04/27 HTML / CSS
利用Python实时获取steam特惠游戏数据
2022/06/25 Python