Django:过滤预期的内容类型?

时间:2016-09-09 09:50:23

标签: python django

Django提供了一种使用@request_http_method装饰器限制接受方法的方法,因此如果特定视图只能响应GET请求,我们可以这样做:

@require_http_methods(['GET'])
def only_get(request):
    pass

否则我们会收到403(FORBIDDEN)回复。

但是,我还想接受json的Content-Type。如果它不是json,它也应该拒绝该请求(我猜测403响应也是合适的)。

Django与require_http_methods装饰器有什么相似之处,但对于内容类型?如果没有,我还能如何处理这种情况?

1 个答案:

答案 0 :(得分:0)

我不认为Django对于Content-Type有类似的东西,但你可以轻松编写中间件,这会丢弃具有错误Content-Type的请求,然后使用decorator_from_middleware选项。

如果您使用Django 1.10:

class AllowedContentTypes(object):

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request, *args, **kwargs):
        types = kwargs.pop('types') or ['application/json']
        if request.content_type in types:
            response = self.get_response(request)

        else:
            response = HttpResponse() # your response for wrong content type
        return response 

并将其应用于您的观点,例如:

@decorator_from_middleware_with_args(AllowedContentTypes)(types=['application/json'])
def your_view(request):
    ...

此外,您可以使用Django REST Framework,您可以使用Parsers过滤Content-Type,JSONParser只允许application / json content-type用于请求。为您的应用程序实现REST API也会更有用。