views.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from django.http import HttpResponse, HttpResponseBadRequest
  2. from django.utils.decorators import method_decorator
  3. from django.views.decorators.csrf import csrf_exempt
  4. from django.views.generic import View
  5. from django.core.serializers.json import DjangoJSONEncoder
  6. from jwt_auth.compat import json, smart_text
  7. from jwt_auth.forms import JSONWebTokenForm
  8. class ObtainJSONWebToken(View):
  9. http_method_names = ['post']
  10. error_response_dict = {'errors': ['Improperly formatted request']}
  11. json_encoder_class = DjangoJSONEncoder
  12. @method_decorator(csrf_exempt)
  13. def dispatch(self, request, *args, **kwargs):
  14. return super(ObtainJSONWebToken, self).dispatch(request, *args, **kwargs)
  15. def post(self, request, *args, **kwargs):
  16. try:
  17. request_json = json.loads(smart_text(request.body))
  18. except ValueError:
  19. return self.render_bad_request_response()
  20. form = JSONWebTokenForm(request_json)
  21. if not form.is_valid():
  22. return self.render_bad_request_response({'errors': form.errors})
  23. context_dict = {
  24. 'token': form.object['token']
  25. }
  26. return self.render_response(context_dict)
  27. def render_response(self, context_dict):
  28. json_context = json.dumps(context_dict, cls=self.json_encoder_class)
  29. return HttpResponse(json_context, content_type='application/json')
  30. def render_bad_request_response(self, error_dict=None):
  31. if error_dict is None:
  32. error_dict = self.error_response_dict
  33. json_context = json.dumps(error_dict, cls=self.json_encoder_class)
  34. return HttpResponseBadRequest(
  35. json_context, content_type='application/json')
  36. obtain_jwt_token = ObtainJSONWebToken.as_view()