1. from urllib.parse import urlencode
    
  2. 
    
  3. from django.conf import settings
    
  4. from django.contrib.auth.decorators import login_required
    
  5. from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
    
  6. from django.shortcuts import render
    
  7. from django.template.loader import render_to_string
    
  8. from django.test import Client
    
  9. from django.test.client import CONTENT_TYPE_RE
    
  10. 
    
  11. 
    
  12. class CustomTestException(Exception):
    
  13.     pass
    
  14. 
    
  15. 
    
  16. def no_template_view(request):
    
  17.     "A simple view that expects a GET request, and returns a rendered template"
    
  18.     return HttpResponse(
    
  19.         "No template used. Sample content: twice once twice. Content ends."
    
  20.     )
    
  21. 
    
  22. 
    
  23. def staff_only_view(request):
    
  24.     "A view that can only be visited by staff. Non staff members get an exception"
    
  25.     if request.user.is_staff:
    
  26.         return HttpResponse()
    
  27.     else:
    
  28.         raise CustomTestException()
    
  29. 
    
  30. 
    
  31. @login_required
    
  32. def get_view(request):
    
  33.     "A simple login protected view"
    
  34.     return HttpResponse("Hello world")
    
  35. 
    
  36. 
    
  37. def request_data(request, template="base.html", data="sausage"):
    
  38.     "A simple view that returns the request data in the context"
    
  39.     return render(
    
  40.         request,
    
  41.         template,
    
  42.         {
    
  43.             "get-foo": request.GET.get("foo"),
    
  44.             "get-bar": request.GET.get("bar"),
    
  45.             "post-foo": request.POST.get("foo"),
    
  46.             "post-bar": request.POST.get("bar"),
    
  47.             "data": data,
    
  48.         },
    
  49.     )
    
  50. 
    
  51. 
    
  52. def view_with_argument(request, name):
    
  53.     """A view that takes a string argument
    
  54. 
    
  55.     The purpose of this view is to check that if a space is provided in
    
  56.     the argument, the test framework unescapes the %20 before passing
    
  57.     the value to the view.
    
  58.     """
    
  59.     if name == "Arthur Dent":
    
  60.         return HttpResponse("Hi, Arthur")
    
  61.     else:
    
  62.         return HttpResponse("Howdy, %s" % name)
    
  63. 
    
  64. 
    
  65. def nested_view(request):
    
  66.     """
    
  67.     A view that uses test client to call another view.
    
  68.     """
    
  69.     c = Client()
    
  70.     c.get("/no_template_view/")
    
  71.     return render(request, "base.html", {"nested": "yes"})
    
  72. 
    
  73. 
    
  74. @login_required
    
  75. def login_protected_redirect_view(request):
    
  76.     "A view that redirects all requests to the GET view"
    
  77.     return HttpResponseRedirect("/get_view/")
    
  78. 
    
  79. 
    
  80. def redirect_to_self_with_changing_query_view(request):
    
  81.     query = request.GET.copy()
    
  82.     query["counter"] += "0"
    
  83.     return HttpResponseRedirect(
    
  84.         "/redirect_to_self_with_changing_query_view/?%s" % urlencode(query)
    
  85.     )
    
  86. 
    
  87. 
    
  88. def set_session_view(request):
    
  89.     "A view that sets a session variable"
    
  90.     request.session["session_var"] = "YES"
    
  91.     return HttpResponse("set_session")
    
  92. 
    
  93. 
    
  94. def check_session_view(request):
    
  95.     "A view that reads a session variable"
    
  96.     return HttpResponse(request.session.get("session_var", "NO"))
    
  97. 
    
  98. 
    
  99. def request_methods_view(request):
    
  100.     "A view that responds with the request method"
    
  101.     return HttpResponse("request method: %s" % request.method)
    
  102. 
    
  103. 
    
  104. def return_unicode(request):
    
  105.     return render(request, "unicode.html")
    
  106. 
    
  107. 
    
  108. def return_undecodable_binary(request):
    
  109.     return HttpResponse(
    
  110.         b"%PDF-1.4\r\n%\x93\x8c\x8b\x9e ReportLab Generated PDF document "
    
  111.         b"http://www.reportlab.com"
    
  112.     )
    
  113. 
    
  114. 
    
  115. def return_json_response(request):
    
  116.     content_type = request.GET.get("content_type")
    
  117.     kwargs = {"content_type": content_type} if content_type else {}
    
  118.     return JsonResponse({"key": "value"}, **kwargs)
    
  119. 
    
  120. 
    
  121. def return_json_response_latin1(request):
    
  122.     return HttpResponse(
    
  123.         b'{"a":"\xc5"}', content_type="application/json; charset=latin1"
    
  124.     )
    
  125. 
    
  126. 
    
  127. def return_text_file(request):
    
  128.     "A view that parses and returns text as a file."
    
  129.     match = CONTENT_TYPE_RE.match(request.META["CONTENT_TYPE"])
    
  130.     if match:
    
  131.         charset = match[1]
    
  132.     else:
    
  133.         charset = settings.DEFAULT_CHARSET
    
  134. 
    
  135.     return HttpResponse(
    
  136.         request.body, status=200, content_type="text/plain; charset=%s" % charset
    
  137.     )
    
  138. 
    
  139. 
    
  140. def check_headers(request):
    
  141.     "A view that responds with value of the X-ARG-CHECK header"
    
  142.     return HttpResponse(
    
  143.         "HTTP_X_ARG_CHECK: %s" % request.META.get("HTTP_X_ARG_CHECK", "Undefined")
    
  144.     )
    
  145. 
    
  146. 
    
  147. def body(request):
    
  148.     "A view that is requested with GET and accesses request.body. Refs #14753."
    
  149.     return HttpResponse(request.body)
    
  150. 
    
  151. 
    
  152. def read_all(request):
    
  153.     "A view that is requested with accesses request.read()."
    
  154.     return HttpResponse(request.read())
    
  155. 
    
  156. 
    
  157. def read_buffer(request):
    
  158.     "A view that is requested with accesses request.read(LARGE_BUFFER)."
    
  159.     return HttpResponse(request.read(99999))
    
  160. 
    
  161. 
    
  162. def request_context_view(request):
    
  163.     # Special attribute that won't be present on a plain HttpRequest
    
  164.     request.special_path = request.path
    
  165.     return render(request, "request_context.html")
    
  166. 
    
  167. 
    
  168. def render_template_multiple_times(request):
    
  169.     """A view that renders a template multiple times."""
    
  170.     return HttpResponse(render_to_string("base.html") + render_to_string("base.html"))
    
  171. 
    
  172. 
    
  173. def redirect_based_on_extra_headers_1_view(request):
    
  174.     if "HTTP_REDIRECT" in request.META:
    
  175.         return HttpResponseRedirect("/redirect_based_on_extra_headers_2/")
    
  176.     return HttpResponse()
    
  177. 
    
  178. 
    
  179. def redirect_based_on_extra_headers_2_view(request):
    
  180.     if "HTTP_REDIRECT" in request.META:
    
  181.         return HttpResponseRedirect("/redirects/further/more/")
    
  182.     return HttpResponse()