2018-02-05 18:22:24 +08:00
|
|
|
import json
|
2017-01-07 19:11:46 +08:00
|
|
|
from urllib.parse import urlencode
|
2007-02-17 08:23:09 +08:00
|
|
|
from xml.dom.minidom import parseString
|
2007-09-04 08:50:06 +08:00
|
|
|
|
2007-11-08 06:45:07 +08:00
|
|
|
from django.contrib.auth.decorators import login_required, permission_required
|
2011-10-14 02:04:12 +08:00
|
|
|
from django.core import mail
|
2020-02-12 21:48:49 +08:00
|
|
|
from django.core.exceptions import ValidationError
|
2008-07-19 09:22:26 +08:00
|
|
|
from django.forms import fields
|
2020-02-12 21:48:49 +08:00
|
|
|
from django.forms.forms import Form
|
2014-10-13 19:10:00 +08:00
|
|
|
from django.http import (
|
2015-01-28 20:35:27 +08:00
|
|
|
HttpResponse,
|
|
|
|
HttpResponseBadRequest,
|
|
|
|
HttpResponseNotAllowed,
|
|
|
|
HttpResponseNotFound,
|
|
|
|
HttpResponseRedirect,
|
2014-10-13 19:10:00 +08:00
|
|
|
)
|
2015-12-23 02:50:16 +08:00
|
|
|
from django.shortcuts import render
|
2011-10-14 02:04:12 +08:00
|
|
|
from django.template import Context, Template
|
2015-08-08 03:28:54 +08:00
|
|
|
from django.test import Client
|
2010-02-09 23:02:39 +08:00
|
|
|
from django.utils.decorators import method_decorator
|
2022-06-17 00:04:13 +08:00
|
|
|
from django.views.generic import TemplateView
|
2007-05-07 20:34:18 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2006-09-02 17:34:40 +08:00
|
|
|
def get_view(request):
|
|
|
|
"A simple view that expects a GET request, and returns a rendered template"
|
|
|
|
t = Template("This is a test. {{ var }} is the value.", name="GET Template")
|
Merged Unicode branch into trunk (r4952:5608). This should be fully
backwards compatible for all practical purposes.
Fixed #2391, #2489, #2996, #3322, #3344, #3370, #3406, #3432, #3454, #3492, #3582, #3690, #3878, #3891, #3937, #4039, #4141, #4227, #4286, #4291, #4300, #4452, #4702
git-svn-id: http://code.djangoproject.com/svn/django/trunk@5609 bcc190cf-cafb-0310-a4f2-bffc1f526a37
2007-07-04 20:11:04 +08:00
|
|
|
c = Context({"var": request.GET.get("var", 42)})
|
2007-09-04 08:54:40 +08:00
|
|
|
|
2006-09-02 17:34:40 +08:00
|
|
|
return HttpResponse(t.render(c))
|
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2020-02-13 06:15:00 +08:00
|
|
|
async def async_get_view(request):
|
|
|
|
return HttpResponse(b"GET content.")
|
|
|
|
|
|
|
|
|
2014-10-13 19:10:00 +08:00
|
|
|
def trace_view(request):
|
|
|
|
"""
|
|
|
|
A simple view that expects a TRACE request and echoes its status line.
|
|
|
|
|
|
|
|
TRACE requests should not have an entity; the view will return a 400 status
|
|
|
|
response if it is present.
|
|
|
|
"""
|
|
|
|
if request.method.upper() != "TRACE":
|
|
|
|
return HttpResponseNotAllowed("TRACE")
|
|
|
|
elif request.body:
|
|
|
|
return HttpResponseBadRequest("TRACE requests MUST NOT include an entity")
|
|
|
|
else:
|
|
|
|
protocol = request.META["SERVER_PROTOCOL"]
|
|
|
|
t = Template(
|
|
|
|
"{{ method }} {{ uri }} {{ version }}",
|
|
|
|
name="TRACE Template",
|
|
|
|
)
|
|
|
|
c = Context(
|
|
|
|
{
|
|
|
|
"method": request.method,
|
|
|
|
"uri": request.path,
|
|
|
|
"version": protocol,
|
|
|
|
}
|
|
|
|
)
|
|
|
|
return HttpResponse(t.render(c))
|
|
|
|
|
|
|
|
|
2017-05-22 18:49:39 +08:00
|
|
|
def put_view(request):
|
|
|
|
if request.method == "PUT":
|
|
|
|
t = Template("Data received: {{ data }} is the body.", name="PUT Template")
|
2018-02-12 23:50:43 +08:00
|
|
|
c = Context(
|
|
|
|
{
|
|
|
|
"Content-Length": request.META["CONTENT_LENGTH"],
|
|
|
|
"data": request.body.decode(),
|
|
|
|
}
|
|
|
|
)
|
2017-05-22 18:49:39 +08:00
|
|
|
else:
|
|
|
|
t = Template("Viewing GET page.", name="Empty GET Template")
|
|
|
|
c = Context()
|
|
|
|
return HttpResponse(t.render(c))
|
|
|
|
|
|
|
|
|
2006-09-02 17:34:40 +08:00
|
|
|
def post_view(request):
|
|
|
|
"""A view that expects a POST, and returns a different template depending
|
|
|
|
on whether any POST data is available
|
|
|
|
"""
|
2007-02-17 08:23:09 +08:00
|
|
|
if request.method == "POST":
|
|
|
|
if request.POST:
|
|
|
|
t = Template(
|
|
|
|
"Data received: {{ data }} is the value.", name="POST Template"
|
|
|
|
)
|
|
|
|
c = Context({"data": request.POST["value"]})
|
|
|
|
else:
|
|
|
|
t = Template("Viewing POST page.", name="Empty POST Template")
|
|
|
|
c = Context()
|
2006-09-02 17:34:40 +08:00
|
|
|
else:
|
2007-02-17 08:23:09 +08:00
|
|
|
t = Template("Viewing GET page.", name="Empty GET Template")
|
2022-11-08 19:19:59 +08:00
|
|
|
# Used by test_body_read_on_get_data.
|
|
|
|
request.read(200)
|
2006-09-02 17:34:40 +08:00
|
|
|
c = Context()
|
2018-02-05 18:22:24 +08:00
|
|
|
return HttpResponse(t.render(c))
|
|
|
|
|
|
|
|
|
2021-09-23 18:18:15 +08:00
|
|
|
def post_then_get_view(request):
|
|
|
|
"""
|
|
|
|
A view that expects a POST request, returns a redirect response
|
|
|
|
to itself providing only a ?success=true querystring,
|
|
|
|
the value of this querystring is then rendered upon GET.
|
|
|
|
"""
|
|
|
|
if request.method == "POST":
|
|
|
|
return HttpResponseRedirect("?success=true")
|
|
|
|
|
|
|
|
t = Template("The value of success is {{ value }}.", name="GET Template")
|
|
|
|
c = Context({"value": request.GET.get("success", "false")})
|
|
|
|
|
|
|
|
return HttpResponse(t.render(c))
|
|
|
|
|
|
|
|
|
2018-02-05 18:22:24 +08:00
|
|
|
def json_view(request):
|
|
|
|
"""
|
|
|
|
A view that expects a request with the header 'application/json' and JSON
|
2018-08-18 20:15:24 +08:00
|
|
|
data, which is deserialized and included in the context.
|
2018-02-05 18:22:24 +08:00
|
|
|
"""
|
|
|
|
if request.META.get("CONTENT_TYPE") != "application/json":
|
|
|
|
return HttpResponse()
|
2007-09-04 08:54:40 +08:00
|
|
|
|
2018-02-05 18:22:24 +08:00
|
|
|
t = Template("Viewing {} page. With data {{ data }}.".format(request.method))
|
|
|
|
data = json.loads(request.body.decode("utf-8"))
|
2018-08-18 20:15:24 +08:00
|
|
|
c = Context({"data": data})
|
2006-09-02 17:34:40 +08:00
|
|
|
return HttpResponse(t.render(c))
|
2007-09-04 08:54:40 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2008-07-12 14:16:42 +08:00
|
|
|
def view_with_header(request):
|
|
|
|
"A view that has a custom header"
|
|
|
|
response = HttpResponse()
|
2020-07-14 19:32:24 +08:00
|
|
|
response.headers["X-DJANGO-TEST"] = "Slartibartfast"
|
2008-07-12 14:16:42 +08:00
|
|
|
return response
|
2010-10-12 22:06:11 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2007-02-17 08:23:09 +08:00
|
|
|
def raw_post_view(request):
|
|
|
|
"""A view which expects raw XML to be posted and returns content extracted
|
|
|
|
from the XML"""
|
|
|
|
if request.method == "POST":
|
2011-12-17 07:40:32 +08:00
|
|
|
root = parseString(request.body)
|
2007-02-17 08:23:09 +08:00
|
|
|
first_book = root.firstChild.firstChild
|
|
|
|
title, author = [n.firstChild.nodeValue for n in first_book.childNodes]
|
|
|
|
t = Template("{{ title }} - {{ author }}", name="Book template")
|
|
|
|
c = Context({"title": title, "author": author})
|
|
|
|
else:
|
|
|
|
t = Template("GET request.", name="Book GET template")
|
|
|
|
c = Context()
|
|
|
|
|
|
|
|
return HttpResponse(t.render(c))
|
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2006-09-02 17:34:40 +08:00
|
|
|
def redirect_view(request):
|
|
|
|
"A view that redirects all requests to the GET view"
|
2007-08-31 19:37:28 +08:00
|
|
|
if request.GET:
|
|
|
|
query = "?" + urlencode(request.GET, True)
|
|
|
|
else:
|
|
|
|
query = ""
|
2014-01-14 23:43:27 +08:00
|
|
|
return HttpResponseRedirect("/get_view/" + query)
|
2007-03-22 18:23:52 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2020-05-27 15:16:01 +08:00
|
|
|
def method_saving_307_redirect_query_string_view(request):
|
|
|
|
return HttpResponseRedirect("/post_view/?hello=world", status=307)
|
|
|
|
|
|
|
|
|
|
|
|
def method_saving_308_redirect_query_string_view(request):
|
|
|
|
return HttpResponseRedirect("/post_view/?hello=world", status=308)
|
|
|
|
|
|
|
|
|
2017-05-22 18:49:39 +08:00
|
|
|
def _post_view_redirect(request, status_code):
|
|
|
|
"""Redirect to /post_view/ using the status code."""
|
|
|
|
redirect_to = request.GET.get("to", "/post_view/")
|
|
|
|
return HttpResponseRedirect(redirect_to, status=status_code)
|
|
|
|
|
|
|
|
|
|
|
|
def method_saving_307_redirect_view(request):
|
|
|
|
return _post_view_redirect(request, 307)
|
|
|
|
|
|
|
|
|
|
|
|
def method_saving_308_redirect_view(request):
|
|
|
|
return _post_view_redirect(request, 308)
|
|
|
|
|
|
|
|
|
2010-02-13 20:01:14 +08:00
|
|
|
def view_with_secure(request):
|
|
|
|
"A view that indicates if the request was secure"
|
|
|
|
response = HttpResponse()
|
|
|
|
response.test_was_secure_request = request.is_secure()
|
2013-10-28 22:00:54 +08:00
|
|
|
response.test_server_port = request.META.get("SERVER_PORT", 80)
|
2010-02-13 20:01:14 +08:00
|
|
|
return response
|
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2007-05-10 19:27:59 +08:00
|
|
|
def double_redirect_view(request):
|
|
|
|
"A view that redirects all requests to a redirection view"
|
2014-01-14 23:43:27 +08:00
|
|
|
return HttpResponseRedirect("/permanent_redirect_view/")
|
2007-05-10 19:27:59 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2007-05-10 19:27:59 +08:00
|
|
|
def bad_view(request):
|
|
|
|
"A view that returns a 404 with some error content"
|
|
|
|
return HttpResponseNotFound("Not found!. This page contains some MAGIC content")
|
|
|
|
|
2016-11-13 01:11:23 +08:00
|
|
|
|
2007-03-22 18:23:52 +08:00
|
|
|
TestChoices = (
|
|
|
|
("a", "First Choice"),
|
|
|
|
("b", "Second Choice"),
|
|
|
|
("c", "Third Choice"),
|
|
|
|
("d", "Fourth Choice"),
|
|
|
|
("e", "Fifth Choice"),
|
|
|
|
)
|
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2007-03-22 18:23:52 +08:00
|
|
|
class TestForm(Form):
|
|
|
|
text = fields.CharField()
|
|
|
|
email = fields.EmailField()
|
|
|
|
value = fields.IntegerField()
|
|
|
|
single = fields.ChoiceField(choices=TestChoices)
|
|
|
|
multi = fields.MultipleChoiceField(choices=TestChoices)
|
2007-09-04 08:54:40 +08:00
|
|
|
|
2013-02-09 07:45:26 +08:00
|
|
|
def clean(self):
|
|
|
|
cleaned_data = self.cleaned_data
|
|
|
|
if cleaned_data.get("text") == "Raise non-field error":
|
|
|
|
raise ValidationError("Non-field error.")
|
|
|
|
return cleaned_data
|
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2007-03-22 18:23:52 +08:00
|
|
|
def form_view(request):
|
|
|
|
"A view that tests a simple form"
|
|
|
|
if request.method == "POST":
|
|
|
|
form = TestForm(request.POST)
|
|
|
|
if form.is_valid():
|
|
|
|
t = Template("Valid POST data.", name="Valid POST Template")
|
|
|
|
c = Context()
|
|
|
|
else:
|
|
|
|
t = Template(
|
|
|
|
"Invalid POST data. {{ form.errors }}", name="Invalid POST Template"
|
|
|
|
)
|
|
|
|
c = Context({"form": form})
|
|
|
|
else:
|
2007-07-21 13:17:20 +08:00
|
|
|
form = TestForm(request.GET)
|
2007-03-22 18:23:52 +08:00
|
|
|
t = Template("Viewing base form. {{ form }}.", name="Form GET Template")
|
|
|
|
c = Context({"form": form})
|
2007-09-04 08:54:40 +08:00
|
|
|
|
2007-03-22 18:23:52 +08:00
|
|
|
return HttpResponse(t.render(c))
|
2007-05-07 20:34:18 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2007-05-07 20:34:18 +08:00
|
|
|
def form_view_with_template(request):
|
|
|
|
"A view that tests a simple form"
|
|
|
|
if request.method == "POST":
|
|
|
|
form = TestForm(request.POST)
|
|
|
|
if form.is_valid():
|
|
|
|
message = "POST data OK"
|
|
|
|
else:
|
|
|
|
message = "POST data has errors"
|
|
|
|
else:
|
|
|
|
form = TestForm()
|
|
|
|
message = "GET form page"
|
2015-12-23 02:50:16 +08:00
|
|
|
return render(
|
|
|
|
request,
|
|
|
|
"form_view.html",
|
|
|
|
{
|
|
|
|
"form": form,
|
|
|
|
"message": message,
|
|
|
|
},
|
|
|
|
)
|
2007-09-04 08:54:40 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2016-11-15 01:20:44 +08:00
|
|
|
@login_required
|
2006-09-02 17:34:40 +08:00
|
|
|
def login_protected_view(request):
|
|
|
|
"A simple view that is login protected."
|
|
|
|
t = Template(
|
|
|
|
"This is a login protected test. Username is {{ user.username }}.",
|
|
|
|
name="Login Template",
|
|
|
|
)
|
|
|
|
c = Context({"user": request.user})
|
2007-09-04 08:54:40 +08:00
|
|
|
|
2006-09-02 17:34:40 +08:00
|
|
|
return HttpResponse(t.render(c))
|
2007-02-09 21:47:36 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2016-11-15 01:20:44 +08:00
|
|
|
@login_required(redirect_field_name="redirect_to")
|
2007-09-15 03:25:37 +08:00
|
|
|
def login_protected_view_changed_redirect(request):
|
|
|
|
"A simple view that is login protected with a custom redirect field set"
|
|
|
|
t = Template(
|
|
|
|
"This is a login protected test. Username is {{ user.username }}.",
|
|
|
|
name="Login Template",
|
|
|
|
)
|
|
|
|
c = Context({"user": request.user})
|
|
|
|
return HttpResponse(t.render(c))
|
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2011-08-12 22:15:41 +08:00
|
|
|
def _permission_protected_view(request):
|
2007-11-08 06:45:07 +08:00
|
|
|
"A simple view that is permission protected."
|
|
|
|
t = Template(
|
|
|
|
"This is a permission protected test. "
|
|
|
|
"Username is {{ user.username }}. "
|
2013-10-27 09:27:42 +08:00
|
|
|
"Permissions are {{ user.get_all_permissions }}.",
|
2007-11-08 06:45:07 +08:00
|
|
|
name="Permissions Template",
|
|
|
|
)
|
|
|
|
c = Context({"user": request.user})
|
|
|
|
return HttpResponse(t.render(c))
|
2016-11-13 01:11:23 +08:00
|
|
|
|
|
|
|
|
2013-03-04 05:44:06 +08:00
|
|
|
permission_protected_view = permission_required("permission_not_granted")(
|
2015-09-12 07:33:12 +08:00
|
|
|
_permission_protected_view
|
|
|
|
)
|
|
|
|
permission_protected_view_exception = permission_required(
|
|
|
|
"permission_not_granted", raise_exception=True
|
2013-03-04 05:44:06 +08:00
|
|
|
)(_permission_protected_view)
|
2007-11-08 06:45:07 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2017-01-19 15:39:46 +08:00
|
|
|
class _ViewManager:
|
2010-02-09 23:02:39 +08:00
|
|
|
@method_decorator(login_required)
|
2007-11-08 06:45:07 +08:00
|
|
|
def login_protected_view(self, request):
|
|
|
|
t = Template(
|
|
|
|
"This is a login protected test using a method. "
|
|
|
|
"Username is {{ user.username }}.",
|
|
|
|
name="Login Method Template",
|
|
|
|
)
|
|
|
|
c = Context({"user": request.user})
|
|
|
|
return HttpResponse(t.render(c))
|
|
|
|
|
2013-03-04 05:44:06 +08:00
|
|
|
@method_decorator(permission_required("permission_not_granted"))
|
2007-11-08 06:45:07 +08:00
|
|
|
def permission_protected_view(self, request):
|
|
|
|
t = Template(
|
|
|
|
"This is a permission protected test using a method. "
|
|
|
|
"Username is {{ user.username }}. "
|
2013-10-27 09:27:42 +08:00
|
|
|
"Permissions are {{ user.get_all_permissions }}.",
|
2007-11-08 06:45:07 +08:00
|
|
|
name="Permissions Template",
|
|
|
|
)
|
|
|
|
c = Context({"user": request.user})
|
|
|
|
return HttpResponse(t.render(c))
|
|
|
|
|
2016-11-13 01:11:23 +08:00
|
|
|
|
2007-11-08 06:45:07 +08:00
|
|
|
_view_manager = _ViewManager()
|
|
|
|
login_protected_method_view = _view_manager.login_protected_view
|
|
|
|
permission_protected_method_view = _view_manager.permission_protected_view
|
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2007-02-09 21:47:36 +08:00
|
|
|
def session_view(request):
|
|
|
|
"A view that modifies the session"
|
|
|
|
request.session["tobacconist"] = "hovercraft"
|
2007-09-04 08:54:40 +08:00
|
|
|
|
|
|
|
t = Template(
|
|
|
|
"This is a view that modifies the session.",
|
2007-02-09 21:47:36 +08:00
|
|
|
name="Session Modifying View Template",
|
|
|
|
)
|
|
|
|
c = Context()
|
|
|
|
return HttpResponse(t.render(c))
|
2007-02-11 08:23:31 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2007-02-11 08:23:31 +08:00
|
|
|
def broken_view(request):
|
|
|
|
"""A view which just raises an exception, simulating a broken view."""
|
|
|
|
raise KeyError("Oops! Looks like you wrote some bad code.")
|
2007-05-08 19:19:34 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2007-05-08 19:19:34 +08:00
|
|
|
def mail_sending_view(request):
|
2010-10-12 22:06:11 +08:00
|
|
|
mail.EmailMessage(
|
2007-09-04 08:54:40 +08:00
|
|
|
"Test message",
|
|
|
|
"This is a test email",
|
|
|
|
"from@example.com",
|
2007-05-08 19:19:34 +08:00
|
|
|
["first@example.com", "second@example.com"],
|
|
|
|
).send()
|
|
|
|
return HttpResponse("Mail sent")
|
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2007-05-08 19:19:34 +08:00
|
|
|
def mass_mail_sending_view(request):
|
2010-10-12 22:06:11 +08:00
|
|
|
m1 = mail.EmailMessage(
|
2007-09-04 08:54:40 +08:00
|
|
|
"First Test message",
|
|
|
|
"This is the first test email",
|
|
|
|
"from@example.com",
|
2007-05-08 19:19:34 +08:00
|
|
|
["first@example.com", "second@example.com"],
|
|
|
|
)
|
2010-10-12 22:06:11 +08:00
|
|
|
m2 = mail.EmailMessage(
|
2007-09-04 08:54:40 +08:00
|
|
|
"Second Test message",
|
|
|
|
"This is the second test email",
|
|
|
|
"from@example.com",
|
2007-05-08 19:19:34 +08:00
|
|
|
["second@example.com", "third@example.com"],
|
|
|
|
)
|
2007-09-04 08:54:40 +08:00
|
|
|
|
2010-10-12 22:06:11 +08:00
|
|
|
c = mail.get_connection()
|
2013-10-27 03:15:03 +08:00
|
|
|
c.send_messages([m1, m2])
|
2007-09-04 08:54:40 +08:00
|
|
|
|
2007-05-08 19:19:34 +08:00
|
|
|
return HttpResponse("Mail sent")
|
2013-09-08 05:13:57 +08:00
|
|
|
|
2013-11-03 05:34:05 +08:00
|
|
|
|
2015-08-08 03:28:54 +08:00
|
|
|
def nesting_exception_view(request):
|
|
|
|
"""
|
|
|
|
A view that uses a nested client to call another view and then raises an
|
|
|
|
exception.
|
|
|
|
"""
|
|
|
|
client = Client()
|
|
|
|
client.get("/get_view/")
|
|
|
|
raise Exception("exception message")
|
|
|
|
|
|
|
|
|
2013-09-08 05:13:57 +08:00
|
|
|
def django_project_redirect(request):
|
|
|
|
return HttpResponseRedirect("https://www.djangoproject.com/")
|
2016-09-11 17:23:35 +08:00
|
|
|
|
|
|
|
|
2021-05-27 17:44:42 +08:00
|
|
|
def no_trailing_slash_external_redirect(request):
|
|
|
|
"""
|
2022-11-04 20:33:09 +08:00
|
|
|
RFC 3986 Section 6.2.3: Empty path should be normalized to "/".
|
2021-05-27 17:44:42 +08:00
|
|
|
|
|
|
|
Use https://testserver, rather than an external domain, in order to allow
|
|
|
|
use of follow=True, triggering Client._handle_redirects().
|
|
|
|
"""
|
|
|
|
return HttpResponseRedirect("https://testserver")
|
|
|
|
|
|
|
|
|
|
|
|
def index_view(request):
|
|
|
|
"""Target for no_trailing_slash_external_redirect with follow=True."""
|
|
|
|
return HttpResponse("Hello world")
|
|
|
|
|
|
|
|
|
2016-09-11 17:23:35 +08:00
|
|
|
def upload_view(request):
|
|
|
|
"""Prints keys of request.FILES to the response."""
|
2017-05-28 07:08:46 +08:00
|
|
|
return HttpResponse(", ".join(request.FILES))
|
2017-11-24 00:18:03 +08:00
|
|
|
|
|
|
|
|
|
|
|
class TwoArgException(Exception):
|
|
|
|
def __init__(self, one, two):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
def two_arg_exception(request):
|
|
|
|
raise TwoArgException("one", "two")
|
2022-06-17 00:04:13 +08:00
|
|
|
|
|
|
|
|
|
|
|
class CBView(TemplateView):
|
|
|
|
template_name = "base.html"
|