解决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 相关文章推荐
初步介绍Python中的pydoc模块和distutils模块
Apr 13 Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
简单谈谈python中的lambda表达式
Jan 19 Python
python3监控CentOS磁盘空间脚本
Jun 21 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
Python谱减法语音降噪实例
Dec 18 Python
django使用多个数据库的方法实例
Mar 04 Python
用Python实现屏幕截图详解
Jan 22 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 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
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
PHP常用技巧总结(附函数代码)
2012/02/04 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
js版本A*寻路算法
2006/12/22 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
python计算文本文件行数的方法
2015/07/06 Python
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
详解Python中的四种队列
2018/05/21 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
python pymysql库的常用操作
2020/10/16 Python
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
见习期自我鉴定
2014/01/31 职场文书
承诺书格式
2014/06/03 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers