我正在使用Django,并希望存储仅在请求期间相关的数据,而不是在会话中相关的数据。
向request.META添加以下内容是否正确:
request.META['acl'] = acl
在我的情况下,我使用的是tastype,带有自定义授权类,需要一种在函数之间传递数据的方法。。。似乎按要求存储一些东西是正确的做法。。。我只是不知道在哪里储存这些信息。我的课看起来像:
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
另外,tastype创建了一个REST资源对象,所有线程都使用一个授权类,因此将其放在authorization类上是不安全的。
更新
根据Chris Pratt的反馈,不,修改请求是没有意义的。进一步探讨,似乎应该首先通过自定义中间件修改请求,然后在请求的其余部分保持不变:https://docs.djangoproject.com/en/1.4/topics/http/middleware
在这种情况下,中间件将类似于:
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)
最佳答案
不,不要弄乱request
对象。特别是因为这些是同一个类上的方法,所以您只需将数据分配给self
:
self.acl = getMyAccessControlList(request.method,request.session['username'])
...
if 'HAS_ALL_ACCESS' in self.acl: