2016-09-09 3 views
0

Django предлагает способ ограничить принятые методы с использованием @request_http_method декоратора, поэтому если конкретный вид может только ответить на запрос GET мы можем сделать:Django: фильтрация ожидаемого типа контента?

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

В противном случае мы получаем (запрещенный) ответ 403.

Однако, я также хотел бы принять Content-Type от json. Если это не json, он также должен отклонить запрос (я предполагаю, что ответ 403 также будет подходящим).

Есть ли у Django что-то похожее на декоратор require_http_methods, но для типов контента? Если нет, как еще я могу решить этот сценарий?

ответ

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, то вы можете фильтровать Content-Type используя Parsers, JSONParser разрешает только тип содержимого приложения/json для запросов. Также было бы более полезно реализовать REST API для вашего приложения.

+1

Я не делал этого точно так, но что-то подобное, поэтому я собираюсь принять этот ответ :) – dabadaba

Смежные вопросы