2016-07-25 3 views
0

Очень смущенно о порядке декораторов, классов auth, диспетчер, который вызывается в djangorestframework. Похоже, что это немного отличается от моих знаний в области джанго.django rest framework: заказ декораторов, классы auth, отправка будет называться

Некоторые коды:

#operation_logger: customized decorator 
class FileView(APIView): 
    parser_classes = (MultiPartParser,)#A 
    authentication_classes = (BasicAuthentication,)#B 

    @permission_classes((IsAuthenticated,))#C 
    @method_decorator(csrf_exempt)#D 
    @method_decorator(operation_logger)#E 
    def dispatch(self, request, *args, **kwargs):#F 
     return super(FileView, self).dispatch(request, *args, **kwargs) 

    @method_decorator(operation_logger)#G 
    def post(self, request):#H 
     print "xxxxpost" 

Что такое порядок (A), B, C, D, E, F, G, H, вызываемые при обработке запросов? Кажется, что B вызывается после F, но до G и H?

Кстати, вначале мой проект был традиционным проектом django. Я знаю, что запрос должен проходить через все посредники. Теперь я добавил новое приложение, в котором размещены API от DRF. Я не уверен, будет ли мой запрос на API проходить через все посредники или нет?

Благодаря

+0

Вы имеете в виду: порядок, в котором функции вызываются во время импорта? –

+0

@ RégisB. Я имею в виду порядок обработки запросов. Я уже обновил свой пост. Спасибо – BAE

+0

Итак, при отправке() работа заказа при отправке создается интерпретатором, тогда применяется декоратор @method_decorator, этот декоратор возвращает вызываемый (как и все декораторы), после того, как следующий декоратор делает то же самое, затем последний результат присваивается отправке() –

ответ

2

вызова порядок, как было указано:

  1. @method_decorator(csrf_exempt)
  2. @method_decorator(operation_logger) (#E)
  3. dispatch() вызовы initial() который называет check_permissions() который оценивает permission_classes (#B).
  4. @method_decorator(operation_logger) (#G)
  5. post()

Одна вещь не будет работать, однако:

@permission_classes((IsAuthenticated,)) по методу addspermission_classes поля к вызываемым (независимо от того, что есть), возвращаемый (#E). Это не работает с представлениями на основе классов и, таким образом, по существу является не-операцией.

Другие части не имеют фиксированный порядок, но используются по требованию:

Аутентификатор вызывается всякий раз, когда это необходимо, т.е., когда user или authentication информация доступна на объекте запроса.

То же самое для parser_classes. Они передаются объекту запроса и используются лениво, когда запрашивается информация запроса, например. request.data.

+0

Спасибо. Как убедиться, что операция_logger запущена после завершения проверки подлинности? Я попытался поставить его в положение G, которое отлично работает. Но не знаю, является ли это единственным решением для завершения работы opertion_logger после завершения проверки подлинности. – BAE

+0

@BAE я не понимаю * готовый * в этом отношении. Вы можете спросить объект запроса, если запрос аутентифицирован или нет.Это заставляет аутентификатор запускаться в первый раз, когда вы это делаете, но потом результат кэшируется. Однако запрос не изменяет состояние «не аутентифицированного» на другое, он просто определяет состояние аутентификации. – dhke

+0

Вы правы. Это то, что я имею в виду. Благодарю. в начале мой проект был традиционным проектом django. Я знаю, что запрос должен проходить через все посредники. Теперь я добавил новое приложение, в котором размещены API от DRF. ** Я не уверен, будет ли мой запрос API работать через все посредники или нет? ** – BAE

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