#python #django #django-rest-framework
Вопрос:
Я использую Django-rest-framework-social-oauth2
, convert-token
конечная точка. Эти конечные точки возвращают json следующим образом
{
"access_token": "************",
"token_type": "Bearer",
"expires_in": 36000,
"refresh_token": "************",
"scope": "read write"
}
Теперь я хочу добавить user id
или удалить user model
(например ,имя, адрес электронной почты и т. Д.) В этот json.
Поэтому я хочу переопределить это представление,возможно class ConvertTokenView
, в этом коде.
Как я могу это сделать??
class ConvertTokenView(CsrfExemptMixin, OAuthLibMixin, APIView):
"""
Implements an endpoint to convert a provider token to an access token
The endpoint is used in the following flows:
* Authorization code
* Client credentials
"""
server_class = SocialTokenServer
validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS
oauthlib_backend_class = KeepRequestCore
permission_classes = (permissions.AllowAny,)
def post(self, request, *args, **kwargs):
# Use the rest framework `.data` to fake the post body of the django request.
mutable_data = request.data.copy()
request._request.POST = request._request.POST.copy()
for key, value in mutable_data.items():
request._request.POST[key] = value
url, headers, body, status = self.create_token_response(request._request)
response = Response(data=json.loads(body), status=status)
for k, v in headers.items():
response[k] = v
return response
Комментарии:
1. вы хотите просто изменить ответ ?
2. Вы можете немного изменить словарь тела и добавить в него новые поля, прежде чем передавать его в Response
Ответ №1:
Вы должны сделать два шага:
Шаг 1. Переопределите ConvertTokenView
представление, чтобы включить нужные поля как таковые:
class MyCustumConvertTokenView(CsrfExemptMixin, OAuthLibMixin, APIView):
"""
Implements an endpoint to convert a provider token to an access token
The endpoint is used in the following flows:
* Authorization code
* Client credentials
"""
server_class = SocialTokenServer
validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS
oauthlib_backend_class = KeepRequestCore
permission_classes = (permissions.AllowAny,)
def post(self, request, *args, **kwargs):
# Use the rest framework `.data` to fake the post body of the django request.
mutable_data = request.data.copy()
request._request.POST = request._request.POST.copy()
for key, value in mutable_data.items():
request._request.POST[key] = value
url, headers, body, status = self.create_token_response(request._request)
# You can add your desired fields here:
data=json.loads(body)
data['username'] = request.user.username
response = Response(data, status=status)
for k, v in headers.items():
response[k] = v
return response
Шаг 2: Измените свою urlconf
convert-token
конечную точку, чтобы она указывала на ваше новое представление
url(r'^convert-token/?
Примечание 1: В вашем views.py
случае , когда вы переписываете это ConvertTokenView
, вы должны импортировать все необходимые модули из исходного пакета.
Примечание 2. urlsconf
Убедитесь, что этот недавно добавленный URL-адрес находится поверх URL-адреса, связанного с пакетом oauth2.
Комментарии:
1. Спасибо, это довольно отличное объяснение. Я подумал, что мне следует заняться наследством. но мне просто нужно сделать чередование.
, MyCustumConvertTokenView.as_view(), name="convert_token"),
Примечание 1: В вашем views.py
случае , когда вы переписываете это ConvertTokenView
, вы должны импортировать все необходимые модули из исходного пакета.
Примечание 2. urlsconf
Убедитесь, что этот недавно добавленный URL-адрес находится поверх URL-адреса, связанного с пакетом oauth2.
Комментарии:
1. Спасибо, это довольно отличное объяснение. Я подумал, что мне следует заняться наследством. но мне просто нужно сделать чередование.