3

私は Django を使用しており、セッションではなく、リクエストの期間にのみ関連するデータを保存したいと考えています。

次のように、request.META に何かを追加するのは正しいですか。

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

さらに、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)
4

1 に答える 1

1

requestいいえ、オブジェクトを台無しにしないでください。特に、これらは同じクラスのメソッドであるため、単純にデータを に割り当てる必要がありますself

self.acl = getMyAccessControlList(request.method,request.session['username'])

...

if 'HAS_ALL_ACCESS' in self.acl:
于 2012-08-08T17:23:11.840 に答える