Django: перекодировать запрос и вызвать другой вид - PullRequest
0 голосов
/ 06 февраля 2020

Я работаю над бэкэнд-приложением, которое предоставляет REST API на основе JSON. Тем не менее, я использую некоторую библиотеку, которая имеет некоторые собственные конечные точки, и они принимают данные, закодированные в форме. Я хочу расширить действия, выполняемые этими конечными точками, и раскрыть мои расширенные версии. В то же время я хочу, чтобы мой API был согласованным, и чтобы все мои конечные точки использовали JSON. Чтобы быть более точным c, я использую библиотеку oauth2_provider и хочу выйти из системы, когда пользователи аннулируют токен. Я также рассматриваю возможность создания дескриптора logout, который потребовал бы токен-носитель в заголовке Authorization и одновременно вышел бы из системы и отозвал токен.

Мой первый подход к этому заключался в написании представления-оболочки вокруг oauth2_toolkit отзываемого представления токена, выход пользователя из системы в представлении оболочки и затем вызов фактического представления revoke_token. Однако я должен изменить тело запроса, которое является неизменным.

class Logout(View):
   def get(self, request):
       if request.user.is_authenticated:
           logout(request)
       # modify the .body attr of the request or create a new request here
       RevokeTokenView.as_view(request)

Я не смог найти способ клонировать запрос Django или изменить его. Есть ли способ сделать это? (Сейчас я изучаю создание пользовательского класса oauthlib_backend_class, но это выглядит как излишнее убийство)

UPD : данные, необходимые для представления revoke_token, находятся в request_body

1 Ответ

1 голос
/ 06 февраля 2020

Вы можете изменить неизменяемое тело запроса, как показано ниже:

class Logout(View):
   def get(self, request):
       if request.user.is_authenticated:
           logout(request)
       # modify or create a new request here
       body = request.GET.copy()
       body['key'] = 'new_value'
       request.GET = body
       RevokeTokenView.as_view(request)

ОБНОВЛЕНИЕ: Если вы хотите изменить .body атрибут объекта запроса, в соответствии с * Реализация 1012 * , вы должны изменить атрибут ._body, который является частным атрибутом объекта request.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...