在Django Rest Framework中的任何类型的请求之前执行操作

时间:2015-06-27 14:20:27

标签: django django-rest-framework

我对Django Rest Framework(以及一般的Django)很陌生。

我的网址看起来像这样(这是一个示例,而不是真正的网址):

/api/v1/myapp/<param>/users/<user>/

如果<param>不是来自模型,但它是我在代码中某处定义的3个可能常量之一。

在其他地方我定义了一个函数来检查param是否是有效的 def is_valid_param(param): ...

现在在我的REST视图中,在发出任何请求之前,我想致电is_valid_param,如果它返回False,则返回404。

有没有办法在不处理GET,POST,PUT,DELETE,OPTIONS等处理的所有不同视图类方法中重复相同的代码?

2 个答案:

答案 0 :(得分:1)

您可以创建一个double longitude = location.getLongitude(); double latitude = location.getLatitude(); ParseGeoPoint geoPoint = new ParseGeoPoint(latitude , longitude ); ParseObject parkingobject = new ParseObject("Cooking"); parkingobject.put("username","Alana"); parkingobject.put("Location", geoPoint ); 类来执行此检查。

CheckValidParamMixin

<强> views.py

from django.http import HttpResponseNotFound

class CheckValidParamMixin(object):

    def dispatch(self, request, *args, **kwargs):
        param = self.kwargs.get('param')
        valid_param = is_valid_param(param)
        if valid_param:
            return super(CheckValidParamMixin, self).dispatch(request, *args, **kwargs)
        return HttpResponseNotFound('Invalid param')

在你的观点中,只需继承这个混音。这将提供在任何请求中检查param的功能(如果它是有效的)。

如果发现param有效,它会调用超级class MyView(CheckValidParamMixin, ..): ... your code ... ,从而产生适当的响应。 如果参数无效,则返回dispatch()响应,即HTTPResponseNotFound,其状态代码为404。

答案 1 :(得分:1)

由于您需要为大量视图执行此操作,因此可以在中间件类中执行此操作。我通常会避免这种情况,除非使用mixins或decorator是一项繁重的工作。

class CheckValidParamMiddleware(object):
    def process_view(self, request, view, args, kwargs):
        if 'param' in kwargs and is_valid_param(kwargs['param']):
            raise Http404('invalid param')
        return None

请务必将此课程添加到MIDDLEWARE_CLASSES设置。