【发布时间】:2014-07-23 07:33:57
【问题描述】:
我想用我的装饰器装饰 Django 中的视图。基本上,我想在访问 API 的任何端点 URL 之前使用 auth-token 密钥对用户进行身份验证以授权其凭据:-
这是我的代码:-
class XYZResource(ModelResource):
class Meta:
queryset = XYZ.objects.all()
resource_name = 'xyz'
allowed_methods = ['get','post','delete','put']
@roles_accepted('admin','staff')
def obj_get(self, bundle, **kwargs):
..............
@roles_accepted('admin','staff')
def get_object_list(self, request):
......
@roles_accepted('admin','staff')
def obj_create(self, bundle, **kwargs):
......
@roles_accepted('admin','staff')
def obj_update(self, bundle, **kwargs):
......
@roles_accepted('admin','staff')
def obj_delete(self, bundle, **kwargs):
......
这是我的装饰器:-
def roles_accepted(*roles):
def wrapper(fn):
def decorated_view(self,request,*args, **kwargs):
if check_role(request) in roles or check_role(request.request) in roles: # for POST,PUT,DELETE where bundle is passed,
return fn(self,request,*args, **kwargs) # auth_token is contained in bundle.request
raise ImmediateHttpResponse(create_json_response({"error": "Unauthorized user"}, HttpUnauthorized))
return decorated_view
return wrapper
我遇到的错误是当我请求 POST/GET-ALL 时,它工作正常,但是当我执行 'GET/DELETE/PUT' 请求时,它说:-
{
"error_message": "decorated_view() takes at least 2 arguments (1 given)",
"traceback": "Traceback (most recent call last):\n\n File \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\", line 195, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\", line 435, in dispatch_detail\n return self.dispatch('detail', request, **kwargs)\n\n File \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\", line 458, in dispatch\n response = method(request, **kwargs)\n\n File \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\", line 1408, in put_detail\n updated_bundle = self.obj_update(bundle=bundle, **self.remove_api_resource_names(kwargs))\n\nTypeError: decorated_view() takes at least 2 arguments (1 given)\n"
}
既然POST 和PUT/DELETE/GET 包含相同的参数,那么在PUT/DELETE/GET 请求的情况下会发生什么不同?
【问题讨论】:
-
我们可以看到您“执行'GET/DELETE/PUT'请求”的相关行吗?
-
相关行??这是什么意思?
标签: python django python-decorators