私は 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)