python - 在 Django 中,request.META[] 是为请求添加特定信息的正确位置吗?

标签 python django request tastypie

我正在使用 Django,并希望存储仅与请求持续时间相关的数据,而不是与 session 相关的数据。

在request.META中添加一些东西是否正确,比如:

request.META['acl'] = acl

在我的情况下,我正在使用带有自定义授权类的 Tastypie,并且需要一种在函数之间传递数据的方法......似乎在请求中存储一些东西是正确的做法......我只是不知道在哪里存储这些信息。我的类(class)看起来像:

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

此外,Tastypie 创建了一个单一的 REST 资源对象,所有线程使用一个单一的授权类,所以将它放在授权类上并不是线程安全的。

更新

根据 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:

关于python - 在 Django 中,request.META[] 是为请求添加特定信息的正确位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11869383/

相关文章:

python - 如何在主 Flask 模块之外登录?

python - 在机器人框架中定义包含变量的关键字

python - 即使正在导入,也无法在磁盘上找到该函数

java - IllegalStateException : Not supported on AsyncContext. startAsync(请求,资源)

http - 我如何使用 .STRACE 文件从中提取请求?

ios - UIAlertView 在调用 loginButton 操作后出现太短

python - 如何抓取另一个 html 行后面的特定 html 行

Python urllib2异常非数字端口: 'port/'

django - 如何在 Django 中导入日期时间模块?

Django:数据库中的默认值,而不仅仅是 ORM