解决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连接mongodb操作数据示例(mongodb数据库配置类)
Dec 31 Python
使用Python判断IP地址合法性的方法实例
Mar 13 Python
跟老齐学Python之使用Python操作数据库(1)
Nov 25 Python
Python实现批量下载文件
May 17 Python
django加载本地html的方法
May 27 Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 Python
python中logging模块的一些简单用法的使用
Feb 22 Python
python实现趣味图片字符化
Apr 30 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
Nov 19 Python
解决Python3下map函数的显示问题
Dec 04 Python
python空元组在all中返回结果详解
Dec 15 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
php printf输出格式使用说明
2010/12/05 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
php数组查找函数总结
2014/11/18 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
ext jquery 简单比较
2010/04/07 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
JQuery打造省市下拉框联动效果
2014/05/18 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
2017/12/29 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
JavaScript如何判断input数据类型
2020/02/06 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python专用方法与迭代机制实例分析
2014/09/15 Python
python发送邮件功能实现代码
2016/07/15 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
金融专业个人的自我评价
2013/10/18 职场文书
个人贷款收入证明
2014/10/26 职场文书
投诉信范文
2015/07/02 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
使用Redis做预定库存缓存功能
2022/04/02 Redis