views.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. from xml.dom.minidom import parseString
  2. from django.contrib.auth.decorators import login_required, permission_required
  3. from django.core import mail
  4. from django.forms import fields
  5. from django.forms.forms import Form, ValidationError
  6. from django.forms.formsets import formset_factory, BaseFormSet
  7. from django.http import (
  8. HttpResponse, HttpResponseRedirect, HttpResponseNotFound,
  9. HttpResponseNotAllowed, HttpResponseBadRequest,
  10. )
  11. from django.shortcuts import render_to_response
  12. from django.template import Context, Template
  13. from django.utils.decorators import method_decorator
  14. from django.utils.six.moves.urllib.parse import urlencode
  15. def get_view(request):
  16. "A simple view that expects a GET request, and returns a rendered template"
  17. t = Template('This is a test. {{ var }} is the value.', name='GET Template')
  18. c = Context({'var': request.GET.get('var', 42)})
  19. return HttpResponse(t.render(c))
  20. def trace_view(request):
  21. """
  22. A simple view that expects a TRACE request and echoes its status line.
  23. TRACE requests should not have an entity; the view will return a 400 status
  24. response if it is present.
  25. """
  26. if request.method.upper() != "TRACE":
  27. return HttpResponseNotAllowed("TRACE")
  28. elif request.body:
  29. return HttpResponseBadRequest("TRACE requests MUST NOT include an entity")
  30. else:
  31. protocol = request.META["SERVER_PROTOCOL"]
  32. t = Template(
  33. '{{ method }} {{ uri }} {{ version }}',
  34. name="TRACE Template",
  35. )
  36. c = Context({
  37. 'method': request.method,
  38. 'uri': request.path,
  39. 'version': protocol,
  40. })
  41. return HttpResponse(t.render(c))
  42. def post_view(request):
  43. """A view that expects a POST, and returns a different template depending
  44. on whether any POST data is available
  45. """
  46. if request.method == 'POST':
  47. if request.POST:
  48. t = Template('Data received: {{ data }} is the value.', name='POST Template')
  49. c = Context({'data': request.POST['value']})
  50. else:
  51. t = Template('Viewing POST page.', name='Empty POST Template')
  52. c = Context()
  53. else:
  54. t = Template('Viewing GET page.', name='Empty GET Template')
  55. c = Context()
  56. return HttpResponse(t.render(c))
  57. def view_with_header(request):
  58. "A view that has a custom header"
  59. response = HttpResponse()
  60. response['X-DJANGO-TEST'] = 'Slartibartfast'
  61. return response
  62. def raw_post_view(request):
  63. """A view which expects raw XML to be posted and returns content extracted
  64. from the XML"""
  65. if request.method == 'POST':
  66. root = parseString(request.body)
  67. first_book = root.firstChild.firstChild
  68. title, author = [n.firstChild.nodeValue for n in first_book.childNodes]
  69. t = Template("{{ title }} - {{ author }}", name="Book template")
  70. c = Context({"title": title, "author": author})
  71. else:
  72. t = Template("GET request.", name="Book GET template")
  73. c = Context()
  74. return HttpResponse(t.render(c))
  75. def redirect_view(request):
  76. "A view that redirects all requests to the GET view"
  77. if request.GET:
  78. query = '?' + urlencode(request.GET, True)
  79. else:
  80. query = ''
  81. return HttpResponseRedirect('/get_view/' + query)
  82. def view_with_secure(request):
  83. "A view that indicates if the request was secure"
  84. response = HttpResponse()
  85. response.test_was_secure_request = request.is_secure()
  86. response.test_server_port = request.META.get('SERVER_PORT', 80)
  87. return response
  88. def double_redirect_view(request):
  89. "A view that redirects all requests to a redirection view"
  90. return HttpResponseRedirect('/permanent_redirect_view/')
  91. def bad_view(request):
  92. "A view that returns a 404 with some error content"
  93. return HttpResponseNotFound('Not found!. This page contains some MAGIC content')
  94. TestChoices = (
  95. ('a', 'First Choice'),
  96. ('b', 'Second Choice'),
  97. ('c', 'Third Choice'),
  98. ('d', 'Fourth Choice'),
  99. ('e', 'Fifth Choice')
  100. )
  101. class TestForm(Form):
  102. text = fields.CharField()
  103. email = fields.EmailField()
  104. value = fields.IntegerField()
  105. single = fields.ChoiceField(choices=TestChoices)
  106. multi = fields.MultipleChoiceField(choices=TestChoices)
  107. def clean(self):
  108. cleaned_data = self.cleaned_data
  109. if cleaned_data.get("text") == "Raise non-field error":
  110. raise ValidationError("Non-field error.")
  111. return cleaned_data
  112. def form_view(request):
  113. "A view that tests a simple form"
  114. if request.method == 'POST':
  115. form = TestForm(request.POST)
  116. if form.is_valid():
  117. t = Template('Valid POST data.', name='Valid POST Template')
  118. c = Context()
  119. else:
  120. t = Template('Invalid POST data. {{ form.errors }}', name='Invalid POST Template')
  121. c = Context({'form': form})
  122. else:
  123. form = TestForm(request.GET)
  124. t = Template('Viewing base form. {{ form }}.', name='Form GET Template')
  125. c = Context({'form': form})
  126. return HttpResponse(t.render(c))
  127. def form_view_with_template(request):
  128. "A view that tests a simple form"
  129. if request.method == 'POST':
  130. form = TestForm(request.POST)
  131. if form.is_valid():
  132. message = 'POST data OK'
  133. else:
  134. message = 'POST data has errors'
  135. else:
  136. form = TestForm()
  137. message = 'GET form page'
  138. return render_to_response('form_view.html',
  139. {
  140. 'form': form,
  141. 'message': message
  142. }
  143. )
  144. class BaseTestFormSet(BaseFormSet):
  145. def clean(self):
  146. """Checks that no two email addresses are the same."""
  147. if any(self.errors):
  148. # Don't bother validating the formset unless each form is valid
  149. return
  150. emails = []
  151. for i in range(0, self.total_form_count()):
  152. form = self.forms[i]
  153. email = form.cleaned_data['email']
  154. if email in emails:
  155. raise ValidationError(
  156. "Forms in a set must have distinct email addresses."
  157. )
  158. emails.append(email)
  159. TestFormSet = formset_factory(TestForm, BaseTestFormSet)
  160. def formset_view(request):
  161. "A view that tests a simple formset"
  162. if request.method == 'POST':
  163. formset = TestFormSet(request.POST)
  164. if formset.is_valid():
  165. t = Template('Valid POST data.', name='Valid POST Template')
  166. c = Context()
  167. else:
  168. t = Template('Invalid POST data. {{ my_formset.errors }}',
  169. name='Invalid POST Template')
  170. c = Context({'my_formset': formset})
  171. else:
  172. formset = TestForm(request.GET)
  173. t = Template('Viewing base formset. {{ my_formset }}.',
  174. name='Formset GET Template')
  175. c = Context({'my_formset': formset})
  176. return HttpResponse(t.render(c))
  177. def login_protected_view(request):
  178. "A simple view that is login protected."
  179. t = Template('This is a login protected test. Username is {{ user.username }}.', name='Login Template')
  180. c = Context({'user': request.user})
  181. return HttpResponse(t.render(c))
  182. login_protected_view = login_required(login_protected_view)
  183. def login_protected_view_changed_redirect(request):
  184. "A simple view that is login protected with a custom redirect field set"
  185. t = Template('This is a login protected test. Username is {{ user.username }}.', name='Login Template')
  186. c = Context({'user': request.user})
  187. return HttpResponse(t.render(c))
  188. login_protected_view_changed_redirect = login_required(redirect_field_name="redirect_to")(login_protected_view_changed_redirect)
  189. def _permission_protected_view(request):
  190. "A simple view that is permission protected."
  191. t = Template('This is a permission protected test. '
  192. 'Username is {{ user.username }}. '
  193. 'Permissions are {{ user.get_all_permissions }}.',
  194. name='Permissions Template')
  195. c = Context({'user': request.user})
  196. return HttpResponse(t.render(c))
  197. permission_protected_view = permission_required('permission_not_granted')(_permission_protected_view)
  198. permission_protected_view_exception = permission_required('permission_not_granted', raise_exception=True)(_permission_protected_view)
  199. class _ViewManager(object):
  200. @method_decorator(login_required)
  201. def login_protected_view(self, request):
  202. t = Template('This is a login protected test using a method. '
  203. 'Username is {{ user.username }}.',
  204. name='Login Method Template')
  205. c = Context({'user': request.user})
  206. return HttpResponse(t.render(c))
  207. @method_decorator(permission_required('permission_not_granted'))
  208. def permission_protected_view(self, request):
  209. t = Template('This is a permission protected test using a method. '
  210. 'Username is {{ user.username }}. '
  211. 'Permissions are {{ user.get_all_permissions }}.',
  212. name='Permissions Template')
  213. c = Context({'user': request.user})
  214. return HttpResponse(t.render(c))
  215. _view_manager = _ViewManager()
  216. login_protected_method_view = _view_manager.login_protected_view
  217. permission_protected_method_view = _view_manager.permission_protected_view
  218. def session_view(request):
  219. "A view that modifies the session"
  220. request.session['tobacconist'] = 'hovercraft'
  221. t = Template('This is a view that modifies the session.',
  222. name='Session Modifying View Template')
  223. c = Context()
  224. return HttpResponse(t.render(c))
  225. def broken_view(request):
  226. """A view which just raises an exception, simulating a broken view."""
  227. raise KeyError("Oops! Looks like you wrote some bad code.")
  228. def mail_sending_view(request):
  229. mail.EmailMessage(
  230. "Test message",
  231. "This is a test email",
  232. "from@example.com",
  233. ['first@example.com', 'second@example.com']).send()
  234. return HttpResponse("Mail sent")
  235. def mass_mail_sending_view(request):
  236. m1 = mail.EmailMessage(
  237. 'First Test message',
  238. 'This is the first test email',
  239. 'from@example.com',
  240. ['first@example.com', 'second@example.com'])
  241. m2 = mail.EmailMessage(
  242. 'Second Test message',
  243. 'This is the second test email',
  244. 'from@example.com',
  245. ['second@example.com', 'third@example.com'])
  246. c = mail.get_connection()
  247. c.send_messages([m1, m2])
  248. return HttpResponse("Mail sent")
  249. def django_project_redirect(request):
  250. return HttpResponseRedirect('https://www.djangoproject.com/')