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

Perform action before any type of request in Django Rest Framework

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

我有 URL 看起来像这样(这是一个例子,不是真正的 URL):

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

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

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

现在在我的 REST 视图中,在任何类型的请求之前,我想调用 is_valid_param 如果它 returns False,return 一个 404。

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

您可以创建一个 CheckValidParamMixin class 来为您执行此检查。

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')

views.py

class MyView(CheckValidParamMixin, ..):

    ...
    your code 
    ...

在你看来,继承这个mixin就好了。这将提供检查任何请求中的参数是否有效的功能。

如果发现参数有效,它会调用 super 的 dispatch() 从而生成正确的响应。 如果参数无效,它 returns 一个 HTTPResponseNotFound 响应,即 HTTPResponse 带有 404 状态代码。

由于您需要对大量视图执行此操作,因此您可以在中间件中执行此操作 class。我通常会避免这种情况,除非使用混合或装饰器是一项巨大的工作量。

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

请务必将此 class 添加到您的 MIDDLEWARE_CLASSES 设置中。