Python 在Django中,request.META[]是为请求添加特定信息的正确位置吗?
我使用的是Django,希望存储的数据只与请求持续时间相关,而与会话无关 向request.META添加内容是否正确,例如:Python 在Django中,request.META[]是为请求添加特定信息的正确位置吗?,python,django,request,tastypie,Python,Django,Request,Tastypie,我使用的是Django,希望存储的数据只与请求持续时间相关,而与会话无关 向request.META添加内容是否正确,例如: request.META['acl'] = acl 在我的情况下,我使用的是带有自定义授权类的Tastypie,需要一种在函数之间传递数据的方法。。。似乎根据请求存储某些内容是正确的做法。。。我只是不知道该把这些信息储存在哪里。我的班级看起来像: class MyAuthorization(Authorization): def is_authorized(se
request.META['acl'] = acl
在我的情况下,我使用的是带有自定义授权类的Tastypie,需要一种在函数之间传递数据的方法。。。似乎根据请求存储某些内容是正确的做法。。。我只是不知道该把这些信息储存在哪里。我的班级看起来像:
class MyAuthorization(Authorization):
def is_authorized(self, request, object=None):
acl = getMyAccessControlList(request.method,request.session['username'])
for permission in acl:
if permission in self.permissions[request.method]:
request.META['acl'] = acl
return True
return False
def apply_limits(self, request, object_class, rs):
if 'HAS_ALL_ACCESS' in request.META['acl']:
return rs
else if 'HAS_USER_ACCESS' in request.META['acl']:
rs = rs.filter(object_class.user==request.session['username'])
return rs
class AccessControlListMiddleware(object):
def process_view(self,request,view_func,view_args,view_kwargs):
permissions = set()
for role in request.session['permissions']:
for permission in PERMISSION_LIST[request.method][role]:
permissions.add(permission)
request.acl = list(permissions)
此外,Tastypie创建了一个REST资源对象,所有线程都使用一个授权类,因此仅仅将其放在授权类上是不安全的
更新
根据Chris Pratt的反馈,否,修改请求没有意义。进一步研究,似乎应该首先通过自定义中间件修改请求,然后在请求的其余部分保持不变:
在这种情况下,中间件将类似于:
class MyAuthorization(Authorization):
def is_authorized(self, request, object=None):
acl = getMyAccessControlList(request.method,request.session['username'])
for permission in acl:
if permission in self.permissions[request.method]:
request.META['acl'] = acl
return True
return False
def apply_limits(self, request, object_class, rs):
if 'HAS_ALL_ACCESS' in request.META['acl']:
return rs
else if 'HAS_USER_ACCESS' in request.META['acl']:
rs = rs.filter(object_class.user==request.session['username'])
return rs
class AccessControlListMiddleware(object):
def process_view(self,request,view_func,view_args,view_kwargs):
permissions = set()
for role in request.session['permissions']:
for permission in PERMISSION_LIST[request.method][role]:
permissions.add(permission)
request.acl = list(permissions)
不可以。不要弄乱
请求
对象。特别是由于这些方法是在同一个类上的,所以您只需将数据分配给self
:
self.acl = getMyAccessControlList(request.method,request.session['username'])
...
if 'HAS_ALL_ACCESS' in self.acl:
谢谢,但不幸的是,使用tastypie,它创建了一个授权类(以及REST接口),所以它不是线程安全的。。。但也许我遗漏了什么,我明白了。嗯,你可以使用本地线程,但我不确定这是否真的更好。我想在
请求中添加一些东西在技术上没有什么问题,但我不会具体地处理META
。request
上的所有上层属性都表示它们是常量,因此即使可以也不适合修改它们。明白了-看起来向请求添加信息的合适位置是通过中间件,我将为这些信息创建自己的request.acl,这在语法上更加正确。再次感谢。