views.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from django.http import HttpResponse
  2. from django.middleware.csrf import get_token, rotate_token
  3. from django.template import Context, RequestContext, Template
  4. from django.template.context_processors import csrf
  5. from django.utils.decorators import decorator_from_middleware
  6. from django.utils.deprecation import MiddlewareMixin
  7. from django.views.decorators.csrf import csrf_protect, ensure_csrf_cookie
  8. class TestingHttpResponse(HttpResponse):
  9. """
  10. A version of HttpResponse that stores what cookie values are passed to
  11. set_cookie() when CSRF_USE_SESSIONS=False.
  12. """
  13. def __init__(self, *args, **kwargs):
  14. super().__init__(*args, **kwargs)
  15. # This is a list of the cookie values passed to set_cookie() over
  16. # the course of the request-response.
  17. self._cookies_set = []
  18. def set_cookie(self, key, value, **kwargs):
  19. super().set_cookie(key, value, **kwargs)
  20. self._cookies_set.append(value)
  21. class _CsrfCookieRotator(MiddlewareMixin):
  22. def process_response(self, request, response):
  23. rotate_token(request)
  24. return response
  25. csrf_rotating_token = decorator_from_middleware(_CsrfCookieRotator)
  26. @csrf_protect
  27. def protected_view(request):
  28. return HttpResponse('OK')
  29. @ensure_csrf_cookie
  30. def ensure_csrf_cookie_view(request):
  31. return HttpResponse('OK')
  32. @csrf_protect
  33. @ensure_csrf_cookie
  34. def ensured_and_protected_view(request):
  35. return TestingHttpResponse('OK')
  36. @csrf_protect
  37. @csrf_rotating_token
  38. @ensure_csrf_cookie
  39. def sandwiched_rotate_token_view(request):
  40. """
  41. This is a view that calls rotate_token() in process_response() between two
  42. calls to CsrfViewMiddleware.process_response().
  43. """
  44. return TestingHttpResponse('OK')
  45. def post_form_view(request):
  46. """Return a POST form (without a token)."""
  47. return HttpResponse(content="""
  48. <html><body><h1>\u00a1Unicode!<form method="post"><input type="text"></form></body></html>
  49. """)
  50. def token_view(request):
  51. context = RequestContext(request, processors=[csrf])
  52. template = Template('{% csrf_token %}')
  53. return HttpResponse(template.render(context))
  54. def non_token_view_using_request_processor(request):
  55. """Use the csrf view processor instead of the token."""
  56. context = RequestContext(request, processors=[csrf])
  57. template = Template('')
  58. return HttpResponse(template.render(context))
  59. def csrf_token_error_handler(request, **kwargs):
  60. """This error handler accesses the CSRF token."""
  61. template = Template(get_token(request))
  62. return HttpResponse(template.render(Context()), status=599)