<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang=""> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>django.test.client — Django 1.8.19 documentation</title> <link rel="stylesheet" href="../../../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../../../', VERSION: '1.8.19', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../../../_static/jquery.js"></script> <script type="text/javascript" src="../../../_static/underscore.js"></script> <script type="text/javascript" src="../../../_static/doctools.js"></script> <link rel="index" title="Index" href="../../../genindex.html" /> <link rel="search" title="Search" href="../../../search.html" /> <link rel="top" title="Django 1.8.19 documentation" href="../../../contents.html" /> <link rel="up" title="django" href="../../django.html" /> <script type="text/javascript" src="../../../templatebuiltins.js"></script> <script type="text/javascript"> (function($) { if (!django_template_builtins) { // templatebuiltins.js missing, do nothing. return; } $(document).ready(function() { // Hyperlink Django template tags and filters var base = "../../../ref/templates/builtins.html"; if (base == "#") { // Special case for builtins.html itself base = ""; } // Tags are keywords, class '.k' $("div.highlight\\-html\\+django span.k").each(function(i, elem) { var tagname = $(elem).text(); if ($.inArray(tagname, django_template_builtins.ttags) != -1) { var fragment = tagname.replace(/_/, '-'); $(elem).html("<a href='" + base + "#" + fragment + "'>" + tagname + "</a>"); } }); // Filters are functions, class '.nf' $("div.highlight\\-html\\+django span.nf").each(function(i, elem) { var filtername = $(elem).text(); if ($.inArray(filtername, django_template_builtins.tfilters) != -1) { var fragment = filtername.replace(/_/, '-'); $(elem).html("<a href='" + base + "#" + fragment + "'>" + filtername + "</a>"); } }); }); })(jQuery); </script> </head> <body role="document"> <div class="document"> <div id="custom-doc" class="yui-t6"> <div id="hd"> <h1><a href="../../../index.html">Django 1.8.19 documentation</a></h1> <div id="global-nav"> <a title="Home page" href="../../../index.html">Home</a> | <a title="Table of contents" href="../../../contents.html">Table of contents</a> | <a title="Global index" href="../../../genindex.html">Index</a> | <a title="Module index" href="../../../py-modindex.html">Modules</a> </div> <div class="nav"> <a href="../../index.html" title="Module code" accesskey="U">up</a></div> </div> <div id="bd"> <div id="yui-main"> <div class="yui-b"> <div class="yui-g" id="_modules-django-test-client"> <h1>Source code for django.test.client</h1><div class="highlight"><pre> <span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">unicode_literals</span> <span class="kn">import</span> <span class="nn">mimetypes</span> <span class="kn">import</span> <span class="nn">os</span> <span class="kn">import</span> <span class="nn">re</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="kn">from</span> <span class="nn">copy</span> <span class="k">import</span> <span class="n">copy</span> <span class="kn">from</span> <span class="nn">importlib</span> <span class="k">import</span> <span class="n">import_module</span> <span class="kn">from</span> <span class="nn">io</span> <span class="k">import</span> <span class="n">BytesIO</span> <span class="kn">from</span> <span class="nn">django.apps</span> <span class="k">import</span> <span class="n">apps</span> <span class="kn">from</span> <span class="nn">django.conf</span> <span class="k">import</span> <span class="n">settings</span> <span class="kn">from</span> <span class="nn">django.core</span> <span class="k">import</span> <span class="n">urlresolvers</span> <span class="kn">from</span> <span class="nn">django.core.handlers.base</span> <span class="k">import</span> <span class="n">BaseHandler</span> <span class="kn">from</span> <span class="nn">django.core.handlers.wsgi</span> <span class="k">import</span> <span class="n">ISO_8859_1</span><span class="p">,</span> <span class="n">UTF_8</span><span class="p">,</span> <span class="n">WSGIRequest</span> <span class="kn">from</span> <span class="nn">django.core.signals</span> <span class="k">import</span> <span class="p">(</span> <span class="n">got_request_exception</span><span class="p">,</span> <span class="n">request_finished</span><span class="p">,</span> <span class="n">request_started</span><span class="p">,</span> <span class="p">)</span> <span class="kn">from</span> <span class="nn">django.db</span> <span class="k">import</span> <span class="n">close_old_connections</span> <span class="kn">from</span> <span class="nn">django.http</span> <span class="k">import</span> <span class="n">HttpRequest</span><span class="p">,</span> <span class="n">QueryDict</span><span class="p">,</span> <span class="n">SimpleCookie</span> <span class="kn">from</span> <span class="nn">django.template</span> <span class="k">import</span> <span class="n">TemplateDoesNotExist</span> <span class="kn">from</span> <span class="nn">django.test</span> <span class="k">import</span> <span class="n">signals</span> <span class="kn">from</span> <span class="nn">django.test.utils</span> <span class="k">import</span> <span class="n">ContextList</span> <span class="kn">from</span> <span class="nn">django.utils</span> <span class="k">import</span> <span class="n">six</span> <span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="k">import</span> <span class="n">force_bytes</span><span class="p">,</span> <span class="n">force_str</span><span class="p">,</span> <span class="n">uri_to_iri</span> <span class="kn">from</span> <span class="nn">django.utils.functional</span> <span class="k">import</span> <span class="n">SimpleLazyObject</span><span class="p">,</span> <span class="n">curry</span> <span class="kn">from</span> <span class="nn">django.utils.http</span> <span class="k">import</span> <span class="n">urlencode</span> <span class="kn">from</span> <span class="nn">django.utils.itercompat</span> <span class="k">import</span> <span class="n">is_iterable</span> <span class="kn">from</span> <span class="nn">django.utils.six.moves.urllib.parse</span> <span class="k">import</span> <span class="n">urlparse</span><span class="p">,</span> <span class="n">urlsplit</span> <span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'Client'</span><span class="p">,</span> <span class="s1">'RedirectCycleError'</span><span class="p">,</span> <span class="s1">'RequestFactory'</span><span class="p">,</span> <span class="s1">'encode_file'</span><span class="p">,</span> <span class="s1">'encode_multipart'</span><span class="p">)</span> <span class="n">BOUNDARY</span> <span class="o">=</span> <span class="s1">'BoUnDaRyStRiNg'</span> <span class="n">MULTIPART_CONTENT</span> <span class="o">=</span> <span class="s1">'multipart/form-data; boundary=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">BOUNDARY</span> <span class="n">CONTENT_TYPE_RE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'.*; charset=([\w\d-]+);?'</span><span class="p">)</span> <span class="k">class</span> <span class="nc">RedirectCycleError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> The test client has been asked to follow a redirect loop.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">last_response</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">RedirectCycleError</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">message</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">last_response</span> <span class="o">=</span> <span class="n">last_response</span> <span class="bp">self</span><span class="o">.</span><span class="n">redirect_chain</span> <span class="o">=</span> <span class="n">last_response</span><span class="o">.</span><span class="n">redirect_chain</span> <span class="k">class</span> <span class="nc">FakePayload</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> A wrapper around BytesIO that restricts what can be read since data from</span> <span class="sd"> the network can't be seeked and cannot be read outside of its content</span> <span class="sd"> length. This makes sure that views can't do anything under the test client</span> <span class="sd"> that wouldn't work in Real Life.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">__content</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">__len</span> <span class="o">=</span> <span class="mi">0</span> <span class="bp">self</span><span class="o">.</span><span class="n">read_started</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">if</span> <span class="n">content</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__len</span> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">num_bytes</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">read_started</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__content</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">read_started</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">num_bytes</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">num_bytes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__len</span> <span class="ow">or</span> <span class="mi">0</span> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">__len</span> <span class="o">>=</span> <span class="n">num_bytes</span><span class="p">,</span> <span class="s2">"Cannot read more than the available bytes from the HTTP incoming data."</span> <span class="n">content</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__content</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">num_bytes</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">__len</span> <span class="o">-=</span> <span class="n">num_bytes</span> <span class="k">return</span> <span class="n">content</span> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">read_started</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Unable to write a payload after he's been read"</span><span class="p">)</span> <span class="n">content</span> <span class="o">=</span> <span class="n">force_bytes</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">__content</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">__len</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="k">def</span> <span class="nf">closing_iterator_wrapper</span><span class="p">(</span><span class="n">iterable</span><span class="p">,</span> <span class="n">close</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">iterable</span><span class="p">:</span> <span class="k">yield</span> <span class="n">item</span> <span class="k">finally</span><span class="p">:</span> <span class="n">request_finished</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">close_old_connections</span><span class="p">)</span> <span class="n">close</span><span class="p">()</span> <span class="c1"># will fire request_finished</span> <span class="n">request_finished</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">close_old_connections</span><span class="p">)</span> <span class="k">class</span> <span class="nc">ClientHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> A HTTP Handler that can be used for testing purposes. Uses the WSGI</span> <span class="sd"> interface to compose requests, but returns the raw HttpResponse object with</span> <span class="sd"> the originating WSGIRequest attached to its ``wsgi_request`` attribute.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">enforce_csrf_checks</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_csrf_checks</span> <span class="o">=</span> <span class="n">enforce_csrf_checks</span> <span class="nb">super</span><span class="p">(</span><span class="n">ClientHandler</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">environ</span><span class="p">):</span> <span class="c1"># Set up middleware if needed. We couldn't do this earlier, because</span> <span class="c1"># settings weren't available.</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_request_middleware</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_middleware</span><span class="p">()</span> <span class="n">request_started</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">close_old_connections</span><span class="p">)</span> <span class="n">request_started</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">environ</span><span class="o">=</span><span class="n">environ</span><span class="p">)</span> <span class="n">request_started</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">close_old_connections</span><span class="p">)</span> <span class="n">request</span> <span class="o">=</span> <span class="n">WSGIRequest</span><span class="p">(</span><span class="n">environ</span><span class="p">)</span> <span class="c1"># sneaky little hack so that we can easily get round</span> <span class="c1"># CsrfViewMiddleware. This makes life easier, and is probably</span> <span class="c1"># required for backwards compatibility with external tests against</span> <span class="c1"># admin views.</span> <span class="n">request</span><span class="o">.</span><span class="n">_dont_enforce_csrf_checks</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_csrf_checks</span> <span class="c1"># Request goes through middleware.</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_response</span><span class="p">(</span><span class="n">request</span><span class="p">)</span> <span class="c1"># Attach the originating request to the response so that it could be</span> <span class="c1"># later retrieved.</span> <span class="n">response</span><span class="o">.</span><span class="n">wsgi_request</span> <span class="o">=</span> <span class="n">request</span> <span class="c1"># We're emulating a WSGI server; we must call the close method</span> <span class="c1"># on completion.</span> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">streaming</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">streaming_content</span> <span class="o">=</span> <span class="n">closing_iterator_wrapper</span><span class="p">(</span> <span class="n">response</span><span class="o">.</span><span class="n">streaming_content</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">close</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">request_finished</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">close_old_connections</span><span class="p">)</span> <span class="n">response</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="c1"># will fire request_finished</span> <span class="n">request_finished</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">close_old_connections</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span> <span class="k">def</span> <span class="nf">store_rendered_templates</span><span class="p">(</span><span class="n">store</span><span class="p">,</span> <span class="n">signal</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="n">template</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Stores templates and contexts that are rendered.</span> <span class="sd"> The context is copied so that it is an accurate representation at the time</span> <span class="sd"> of rendering.</span> <span class="sd"> """</span> <span class="n">store</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'templates'</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">template</span><span class="p">)</span> <span class="n">store</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'context'</span><span class="p">,</span> <span class="n">ContextList</span><span class="p">())</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">copy</span><span class="p">(</span><span class="n">context</span><span class="p">))</span> <span class="k">def</span> <span class="nf">encode_multipart</span><span class="p">(</span><span class="n">boundary</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Encodes multipart POST data from a dictionary of form values.</span> <span class="sd"> The key will be used as the form data name; the value will be transmitted</span> <span class="sd"> as content. If the value is a file, the contents of the file will be sent</span> <span class="sd"> as an application/octet-stream; otherwise, str(value) will be sent.</span> <span class="sd"> """</span> <span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">to_bytes</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">force_bytes</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_CHARSET</span><span class="p">)</span> <span class="c1"># Not by any means perfect, but good enough for our purposes.</span> <span class="n">is_file</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">thing</span><span class="p">:</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="s2">"read"</span><span class="p">)</span> <span class="ow">and</span> <span class="n">callable</span><span class="p">(</span><span class="n">thing</span><span class="o">.</span><span class="n">read</span><span class="p">)</span> <span class="c1"># Each bit of the multipart form data could be either a form value or a</span> <span class="c1"># file, or a *list* of form values and/or files. Remember that HTTP field</span> <span class="c1"># names can be duplicated!</span> <span class="k">for</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="k">if</span> <span class="n">is_file</span><span class="p">(</span><span class="n">value</span><span class="p">):</span> <span class="n">lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">encode_file</span><span class="p">(</span><span class="n">boundary</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span> <span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_iterable</span><span class="p">(</span><span class="n">value</span><span class="p">):</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span> <span class="k">if</span> <span class="n">is_file</span><span class="p">(</span><span class="n">item</span><span class="p">):</span> <span class="n">lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">encode_file</span><span class="p">(</span><span class="n">boundary</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">item</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="n">lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">to_bytes</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="p">[</span> <span class="s1">'--</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">boundary</span><span class="p">,</span> <span class="s1">'Content-Disposition: form-data; name="</span><span class="si">%s</span><span class="s1">"'</span> <span class="o">%</span> <span class="n">key</span><span class="p">,</span> <span class="s1">''</span><span class="p">,</span> <span class="n">item</span> <span class="p">])</span> <span class="k">else</span><span class="p">:</span> <span class="n">lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">to_bytes</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="p">[</span> <span class="s1">'--</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">boundary</span><span class="p">,</span> <span class="s1">'Content-Disposition: form-data; name="</span><span class="si">%s</span><span class="s1">"'</span> <span class="o">%</span> <span class="n">key</span><span class="p">,</span> <span class="s1">''</span><span class="p">,</span> <span class="n">value</span> <span class="p">])</span> <span class="n">lines</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span> <span class="n">to_bytes</span><span class="p">(</span><span class="s1">'--</span><span class="si">%s</span><span class="s1">--'</span> <span class="o">%</span> <span class="n">boundary</span><span class="p">),</span> <span class="n">b</span><span class="s1">''</span><span class="p">,</span> <span class="p">])</span> <span class="k">return</span> <span class="n">b</span><span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="k">def</span> <span class="nf">encode_file</span><span class="p">(</span><span class="n">boundary</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span> <span class="n">to_bytes</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">force_bytes</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_CHARSET</span><span class="p">)</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">file</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s1">'name'</span><span class="p">)</span> <span class="k">else</span> <span class="s1">''</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s1">'content_type'</span><span class="p">):</span> <span class="n">content_type</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">content_type</span> <span class="k">elif</span> <span class="n">filename</span><span class="p">:</span> <span class="n">content_type</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_type</span><span class="p">(</span><span class="n">filename</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">content_type</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="n">content_type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">content_type</span> <span class="o">=</span> <span class="s1">'application/octet-stream'</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">filename</span><span class="p">:</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">key</span> <span class="k">return</span> <span class="p">[</span> <span class="n">to_bytes</span><span class="p">(</span><span class="s1">'--</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">boundary</span><span class="p">),</span> <span class="n">to_bytes</span><span class="p">(</span><span class="s1">'Content-Disposition: form-data; name="</span><span class="si">%s</span><span class="s1">"; filename="</span><span class="si">%s</span><span class="s1">"'</span> <span class="o">%</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">filename</span><span class="p">)),</span> <span class="n">to_bytes</span><span class="p">(</span><span class="s1">'Content-Type: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">content_type</span><span class="p">),</span> <span class="n">b</span><span class="s1">''</span><span class="p">,</span> <span class="n">to_bytes</span><span class="p">(</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">())</span> <span class="p">]</span> <div class="viewcode-block" id="RequestFactory"><a class="viewcode-back" href="../../../topics/testing/advanced.html#django.test.RequestFactory">[docs]</a><span class="k">class</span> <span class="nc">RequestFactory</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Class that lets you create mock Request objects for use in testing.</span> <span class="sd"> Usage:</span> <span class="sd"> rf = RequestFactory()</span> <span class="sd"> get_request = rf.get('/hello/')</span> <span class="sd"> post_request = rf.post('/submit/', {'foo': 'bar'})</span> <span class="sd"> Once you have a request object you can pass it to any view function,</span> <span class="sd"> just as if that view had been hooked up using a URLconf.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">defaults</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">defaults</span> <span class="o">=</span> <span class="n">defaults</span> <span class="bp">self</span><span class="o">.</span><span class="n">cookies</span> <span class="o">=</span> <span class="n">SimpleCookie</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">()</span> <span class="k">def</span> <span class="nf">_base_environ</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">request</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> The base environment for a request.</span> <span class="sd"> """</span> <span class="c1"># This is a minimal valid WSGI environ dictionary, plus:</span> <span class="c1"># - HTTP_COOKIE: for cookie support,</span> <span class="c1"># - REMOTE_ADDR: often useful, see #8551.</span> <span class="c1"># See http://www.python.org/dev/peps/pep-3333/#environ-variables</span> <span class="n">environ</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'HTTP_COOKIE'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">cookies</span><span class="o">.</span><span class="n">output</span><span class="p">(</span><span class="n">header</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s1">'; '</span><span class="p">),</span> <span class="s1">'PATH_INFO'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'/'</span><span class="p">),</span> <span class="s1">'REMOTE_ADDR'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'127.0.0.1'</span><span class="p">),</span> <span class="s1">'REQUEST_METHOD'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'GET'</span><span class="p">),</span> <span class="s1">'SCRIPT_NAME'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="s1">''</span><span class="p">),</span> <span class="s1">'SERVER_NAME'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'testserver'</span><span class="p">),</span> <span class="s1">'SERVER_PORT'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'80'</span><span class="p">),</span> <span class="s1">'SERVER_PROTOCOL'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'HTTP/1.1'</span><span class="p">),</span> <span class="s1">'wsgi.version'</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="s1">'wsgi.url_scheme'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'http'</span><span class="p">),</span> <span class="s1">'wsgi.input'</span><span class="p">:</span> <span class="n">FakePayload</span><span class="p">(</span><span class="n">b</span><span class="s1">''</span><span class="p">),</span> <span class="s1">'wsgi.errors'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="p">,</span> <span class="s1">'wsgi.multiprocess'</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">'wsgi.multithread'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s1">'wsgi.run_once'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="p">}</span> <span class="n">environ</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">defaults</span><span class="p">)</span> <span class="n">environ</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">request</span><span class="p">)</span> <span class="k">return</span> <span class="n">environ</span> <span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">request</span><span class="p">):</span> <span class="s2">"Construct a generic request object."</span> <span class="k">return</span> <span class="n">WSGIRequest</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_base_environ</span><span class="p">(</span><span class="o">**</span><span class="n">request</span><span class="p">))</span> <span class="k">def</span> <span class="nf">_encode_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="p">):</span> <span class="k">if</span> <span class="n">content_type</span> <span class="ow">is</span> <span class="n">MULTIPART_CONTENT</span><span class="p">:</span> <span class="k">return</span> <span class="n">encode_multipart</span><span class="p">(</span><span class="n">BOUNDARY</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># Encode the content so that the byte representation is correct.</span> <span class="n">match</span> <span class="o">=</span> <span class="n">CONTENT_TYPE_RE</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">content_type</span><span class="p">)</span> <span class="k">if</span> <span class="n">match</span><span class="p">:</span> <span class="n">charset</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">charset</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_CHARSET</span> <span class="k">return</span> <span class="n">force_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="n">charset</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_get_path</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parsed</span><span class="p">):</span> <span class="n">path</span> <span class="o">=</span> <span class="n">force_str</span><span class="p">(</span><span class="n">parsed</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="c1"># If there are parameters, add them</span> <span class="k">if</span> <span class="n">parsed</span><span class="p">[</span><span class="mi">3</span><span class="p">]:</span> <span class="n">path</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="s2">";"</span><span class="p">)</span> <span class="o">+</span> <span class="n">force_str</span><span class="p">(</span><span class="n">parsed</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="n">path</span> <span class="o">=</span> <span class="n">uri_to_iri</span><span class="p">(</span><span class="n">path</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">UTF_8</span><span class="p">)</span> <span class="c1"># Under Python 3, non-ASCII values in the WSGI environ are arbitrarily</span> <span class="c1"># decoded with ISO-8859-1. We replicate this behavior here.</span> <span class="c1"># Refs comment in `get_bytes_from_wsgi()`.</span> <span class="k">return</span> <span class="n">path</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">ISO_8859_1</span><span class="p">)</span> <span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY3</span> <span class="k">else</span> <span class="n">path</span> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="s2">"Construct a GET request."</span> <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">data</span> <span class="n">r</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'QUERY_STRING'</span><span class="p">:</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">doseq</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span> <span class="p">}</span> <span class="n">r</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic</span><span class="p">(</span><span class="s1">'GET'</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">r</span><span class="p">)</span> <span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="n">MULTIPART_CONTENT</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="s2">"Construct a POST request."</span> <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">data</span> <span class="n">post_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_encode_data</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic</span><span class="p">(</span><span class="s1">'POST'</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">post_data</span><span class="p">,</span> <span class="n">content_type</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">def</span> <span class="nf">head</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="s2">"Construct a HEAD request."</span> <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">data</span> <span class="n">r</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'QUERY_STRING'</span><span class="p">:</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">doseq</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span> <span class="p">}</span> <span class="n">r</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic</span><span class="p">(</span><span class="s1">'HEAD'</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">r</span><span class="p">)</span> <span class="k">def</span> <span class="nf">trace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="s2">"Construct a TRACE request."</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic</span><span class="p">(</span><span class="s1">'TRACE'</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="s1">'application/octet-stream'</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="s2">"Construct an OPTIONS request."</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic</span><span class="p">(</span><span class="s1">'OPTIONS'</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">def</span> <span class="nf">put</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="s1">'application/octet-stream'</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="s2">"Construct a PUT request."</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic</span><span class="p">(</span><span class="s1">'PUT'</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">def</span> <span class="nf">patch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="s1">'application/octet-stream'</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="s2">"Construct a PATCH request."</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic</span><span class="p">(</span><span class="s1">'PATCH'</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="s1">'application/octet-stream'</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="s2">"Construct a DELETE request."</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic</span><span class="p">(</span><span class="s1">'DELETE'</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">def</span> <span class="nf">generic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="s1">'application/octet-stream'</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="sd">"""Constructs an arbitrary HTTP request."""</span> <span class="n">parsed</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="n">data</span> <span class="o">=</span> <span class="n">force_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_CHARSET</span><span class="p">)</span> <span class="n">r</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'PATH_INFO'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_path</span><span class="p">(</span><span class="n">parsed</span><span class="p">),</span> <span class="s1">'REQUEST_METHOD'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">),</span> <span class="s1">'SERVER_PORT'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'443'</span><span class="p">)</span> <span class="k">if</span> <span class="n">secure</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'80'</span><span class="p">),</span> <span class="s1">'wsgi.url_scheme'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'https'</span><span class="p">)</span> <span class="k">if</span> <span class="n">secure</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'http'</span><span class="p">),</span> <span class="p">}</span> <span class="k">if</span> <span class="n">data</span><span class="p">:</span> <span class="n">r</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s1">'CONTENT_LENGTH'</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="s1">'CONTENT_TYPE'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">content_type</span><span class="p">),</span> <span class="s1">'wsgi.input'</span><span class="p">:</span> <span class="n">FakePayload</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="p">})</span> <span class="n">r</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">extra</span><span class="p">)</span> <span class="c1"># If QUERY_STRING is absent or empty, we want to extract it from the URL.</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">r</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'QUERY_STRING'</span><span class="p">):</span> <span class="n">query_string</span> <span class="o">=</span> <span class="n">force_bytes</span><span class="p">(</span><span class="n">parsed</span><span class="p">[</span><span class="mi">4</span><span class="p">])</span> <span class="c1"># WSGI requires latin-1 encoded strings. See get_path_info().</span> <span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY3</span><span class="p">:</span> <span class="n">query_string</span> <span class="o">=</span> <span class="n">query_string</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'iso-8859-1'</span><span class="p">)</span> <span class="n">r</span><span class="p">[</span><span class="s1">'QUERY_STRING'</span><span class="p">]</span> <span class="o">=</span> <span class="n">query_string</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="o">**</span><span class="n">r</span><span class="p">)</span></div> <div class="viewcode-block" id="Client"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client">[docs]</a><span class="k">class</span> <span class="nc">Client</span><span class="p">(</span><span class="n">RequestFactory</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> A class that can act as a client for testing purposes.</span> <span class="sd"> It allows the user to compose GET and POST requests, and</span> <span class="sd"> obtain the response that the server gave to those requests.</span> <span class="sd"> The server Response objects are annotated with the details</span> <span class="sd"> of the contexts and templates that were rendered during the</span> <span class="sd"> process of serving the request.</span> <span class="sd"> Client objects are stateful - they will retain cookie (and</span> <span class="sd"> thus session) details for the lifetime of the Client instance.</span> <span class="sd"> This is not intended as a replacement for Twill/Selenium or</span> <span class="sd"> the like - it is here to allow testing against the</span> <span class="sd"> contexts and templates produced by a view, rather than the</span> <span class="sd"> HTML rendered to the end-user.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">enforce_csrf_checks</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">defaults</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">ClientHandler</span><span class="p">(</span><span class="n">enforce_csrf_checks</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">exc_info</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">store_exc_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Stores exceptions when they are generated by a view.</span> <span class="sd"> """</span> <span class="bp">self</span><span class="o">.</span><span class="n">exc_info</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span> <span class="k">def</span> <span class="nf">_session</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Obtains the current session variables.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">apps</span><span class="o">.</span><span class="n">is_installed</span><span class="p">(</span><span class="s1">'django.contrib.sessions'</span><span class="p">):</span> <span class="n">engine</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">SESSION_ENGINE</span><span class="p">)</span> <span class="n">cookie</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cookies</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">SESSION_COOKIE_NAME</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">cookie</span><span class="p">:</span> <span class="k">return</span> <span class="n">engine</span><span class="o">.</span><span class="n">SessionStore</span><span class="p">(</span><span class="n">cookie</span><span class="o">.</span><span class="n">value</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">s</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">SessionStore</span><span class="p">()</span> <span class="n">s</span><span class="o">.</span><span class="n">save</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">cookies</span><span class="p">[</span><span class="n">settings</span><span class="o">.</span><span class="n">SESSION_COOKIE_NAME</span><span class="p">]</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">session_key</span> <span class="k">return</span> <span class="n">s</span> <span class="k">return</span> <span class="p">{}</span> <span class="n">session</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_session</span><span class="p">)</span> <span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">request</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> The master request method. Composes the environment dictionary</span> <span class="sd"> and passes to the handler, returning the result of the handler.</span> <span class="sd"> Assumes defaults for the query environment, which can be overridden</span> <span class="sd"> using the arguments to the request.</span> <span class="sd"> """</span> <span class="n">environ</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_base_environ</span><span class="p">(</span><span class="o">**</span><span class="n">request</span><span class="p">)</span> <span class="c1"># Curry a data dictionary into an instance of the template renderer</span> <span class="c1"># callback function.</span> <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">on_template_render</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="n">store_rendered_templates</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="n">signal_uid</span> <span class="o">=</span> <span class="s2">"template-render-</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">id</span><span class="p">(</span><span class="n">request</span><span class="p">)</span> <span class="n">signals</span><span class="o">.</span><span class="n">template_rendered</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">on_template_render</span><span class="p">,</span> <span class="n">dispatch_uid</span><span class="o">=</span><span class="n">signal_uid</span><span class="p">)</span> <span class="c1"># Capture exceptions created by the handler.</span> <span class="n">got_request_exception</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">store_exc_info</span><span class="p">,</span> <span class="n">dispatch_uid</span><span class="o">=</span><span class="s2">"request-exception"</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handler</span><span class="p">(</span><span class="n">environ</span><span class="p">)</span> <span class="k">except</span> <span class="n">TemplateDoesNotExist</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="c1"># If the view raises an exception, Django will attempt to show</span> <span class="c1"># the 500.html template. If that template is not available,</span> <span class="c1"># we should ignore the error in favor of re-raising the</span> <span class="c1"># underlying exception that caused the 500 error. Any other</span> <span class="c1"># template found to be missing during view error handling</span> <span class="c1"># should be reported as-is.</span> <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">args</span> <span class="o">!=</span> <span class="p">(</span><span class="s1">'500.html'</span><span class="p">,):</span> <span class="k">raise</span> <span class="c1"># Look for a signalled exception, clear the current context</span> <span class="c1"># exception data, then re-raise the signalled exception.</span> <span class="c1"># Also make sure that the signalled exception is cleared from</span> <span class="c1"># the local cache!</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exc_info</span><span class="p">:</span> <span class="n">exc_info</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">exc_info</span> <span class="bp">self</span><span class="o">.</span><span class="n">exc_info</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">six</span><span class="o">.</span><span class="n">reraise</span><span class="p">(</span><span class="o">*</span><span class="n">exc_info</span><span class="p">)</span> <span class="c1"># Save the client and request that stimulated the response.</span> <span class="n">response</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="bp">self</span> <span class="n">response</span><span class="o">.</span><span class="n">request</span> <span class="o">=</span> <span class="n">request</span> <span class="c1"># Add any rendered template detail to the response.</span> <span class="n">response</span><span class="o">.</span><span class="n">templates</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"templates"</span><span class="p">,</span> <span class="p">[])</span> <span class="n">response</span><span class="o">.</span><span class="n">context</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"context"</span><span class="p">)</span> <span class="c1"># Attach the ResolverMatch instance to the response</span> <span class="n">response</span><span class="o">.</span><span class="n">resolver_match</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">urlresolvers</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="n">request</span><span class="p">[</span><span class="s1">'PATH_INFO'</span><span class="p">]))</span> <span class="c1"># Flatten a single context. Not really necessary anymore thanks to</span> <span class="c1"># the __getattr__ flattening in ContextList, but has some edge-case</span> <span class="c1"># backwards-compatibility implications.</span> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">context</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">context</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">context</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">context</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># Update persistent cookie data.</span> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">cookies</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">cookies</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">cookies</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span> <span class="k">finally</span><span class="p">:</span> <span class="n">signals</span><span class="o">.</span><span class="n">template_rendered</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">dispatch_uid</span><span class="o">=</span><span class="n">signal_uid</span><span class="p">)</span> <span class="n">got_request_exception</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">dispatch_uid</span><span class="o">=</span><span class="s2">"request-exception"</span><span class="p">)</span> <div class="viewcode-block" id="Client.get"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client.get">[docs]</a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">follow</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Requests a response from the server using GET.</span> <span class="sd"> """</span> <span class="n">response</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">if</span> <span class="n">follow</span><span class="p">:</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_redirects</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span></div> <div class="viewcode-block" id="Client.post"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client.post">[docs]</a> <span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="n">MULTIPART_CONTENT</span><span class="p">,</span> <span class="n">follow</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Requests a response from the server using POST.</span> <span class="sd"> """</span> <span class="n">response</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">if</span> <span class="n">follow</span><span class="p">:</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_redirects</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span></div> <div class="viewcode-block" id="Client.head"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client.head">[docs]</a> <span class="k">def</span> <span class="nf">head</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">follow</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Request a response from the server using HEAD.</span> <span class="sd"> """</span> <span class="n">response</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">head</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">if</span> <span class="n">follow</span><span class="p">:</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_redirects</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span></div> <div class="viewcode-block" id="Client.options"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client.options">[docs]</a> <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="s1">'application/octet-stream'</span><span class="p">,</span> <span class="n">follow</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Request a response from the server using OPTIONS.</span> <span class="sd"> """</span> <span class="n">response</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">options</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">if</span> <span class="n">follow</span><span class="p">:</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_redirects</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span></div> <div class="viewcode-block" id="Client.put"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client.put">[docs]</a> <span class="k">def</span> <span class="nf">put</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="s1">'application/octet-stream'</span><span class="p">,</span> <span class="n">follow</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Send a resource to the server using PUT.</span> <span class="sd"> """</span> <span class="n">response</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">if</span> <span class="n">follow</span><span class="p">:</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_redirects</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span></div> <div class="viewcode-block" id="Client.patch"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client.patch">[docs]</a> <span class="k">def</span> <span class="nf">patch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="s1">'application/octet-stream'</span><span class="p">,</span> <span class="n">follow</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Send a resource to the server using PATCH.</span> <span class="sd"> """</span> <span class="n">response</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">if</span> <span class="n">follow</span><span class="p">:</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_redirects</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span></div> <div class="viewcode-block" id="Client.delete"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client.delete">[docs]</a> <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="s1">'application/octet-stream'</span><span class="p">,</span> <span class="n">follow</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Send a DELETE request to the server.</span> <span class="sd"> """</span> <span class="n">response</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">if</span> <span class="n">follow</span><span class="p">:</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_redirects</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span></div> <div class="viewcode-block" id="Client.trace"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client.trace">[docs]</a> <span class="k">def</span> <span class="nf">trace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">follow</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Send a TRACE request to the server.</span> <span class="sd"> """</span> <span class="n">response</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">trace</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">secure</span><span class="o">=</span><span class="n">secure</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">if</span> <span class="n">follow</span><span class="p">:</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_redirects</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span></div> <div class="viewcode-block" id="Client.login"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client.login">[docs]</a> <span class="k">def</span> <span class="nf">login</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">credentials</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Sets the Factory to appear as if it has successfully logged into a site.</span> <span class="sd"> Returns True if login is possible; False if the provided credentials</span> <span class="sd"> are incorrect, or the user is inactive, or if the sessions framework is</span> <span class="sd"> not available.</span> <span class="sd"> """</span> <span class="kn">from</span> <span class="nn">django.contrib.auth</span> <span class="k">import</span> <span class="n">authenticate</span><span class="p">,</span> <span class="n">login</span> <span class="n">user</span> <span class="o">=</span> <span class="n">authenticate</span><span class="p">(</span><span class="o">**</span><span class="n">credentials</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="n">user</span> <span class="ow">and</span> <span class="n">user</span><span class="o">.</span><span class="n">is_active</span> <span class="ow">and</span> <span class="n">apps</span><span class="o">.</span><span class="n">is_installed</span><span class="p">(</span><span class="s1">'django.contrib.sessions'</span><span class="p">)):</span> <span class="n">engine</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">SESSION_ENGINE</span><span class="p">)</span> <span class="c1"># Create a fake request to store login details.</span> <span class="n">request</span> <span class="o">=</span> <span class="n">HttpRequest</span><span class="p">()</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="k">else</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">SessionStore</span><span class="p">()</span> <span class="n">login</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">user</span><span class="p">)</span> <span class="c1"># Save the session values.</span> <span class="n">request</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">save</span><span class="p">()</span> <span class="c1"># Set the cookie to represent the session.</span> <span class="n">session_cookie</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">SESSION_COOKIE_NAME</span> <span class="bp">self</span><span class="o">.</span><span class="n">cookies</span><span class="p">[</span><span class="n">session_cookie</span><span class="p">]</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">session_key</span> <span class="n">cookie_data</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'max-age'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span> <span class="s1">'path'</span><span class="p">:</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'domain'</span><span class="p">:</span> <span class="n">settings</span><span class="o">.</span><span class="n">SESSION_COOKIE_DOMAIN</span><span class="p">,</span> <span class="s1">'secure'</span><span class="p">:</span> <span class="n">settings</span><span class="o">.</span><span class="n">SESSION_COOKIE_SECURE</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">,</span> <span class="s1">'expires'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span> <span class="p">}</span> <span class="bp">self</span><span class="o">.</span><span class="n">cookies</span><span class="p">[</span><span class="n">session_cookie</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">cookie_data</span><span class="p">)</span> <span class="k">return</span> <span class="kc">True</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="kc">False</span></div> <div class="viewcode-block" id="Client.logout"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.Client.logout">[docs]</a> <span class="k">def</span> <span class="nf">logout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Removes the authenticated user's cookies and session object.</span> <span class="sd"> Causes the authenticated user to be logged out.</span> <span class="sd"> """</span> <span class="kn">from</span> <span class="nn">django.contrib.auth</span> <span class="k">import</span> <span class="n">get_user</span><span class="p">,</span> <span class="n">logout</span> <span class="n">request</span> <span class="o">=</span> <span class="n">HttpRequest</span><span class="p">()</span> <span class="n">engine</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">SESSION_ENGINE</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">get_user</span><span class="p">(</span><span class="n">request</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">SessionStore</span><span class="p">()</span> <span class="n">logout</span><span class="p">(</span><span class="n">request</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">cookies</span> <span class="o">=</span> <span class="n">SimpleCookie</span><span class="p">()</span></div> <span class="k">def</span> <span class="nf">_handle_redirects</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span> <span class="s2">"Follows any redirects by requesting responses from the server using GET."</span> <span class="n">response</span><span class="o">.</span><span class="n">redirect_chain</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">while</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">301</span><span class="p">,</span> <span class="mi">302</span><span class="p">,</span> <span class="mi">303</span><span class="p">,</span> <span class="mi">307</span><span class="p">):</span> <span class="n">response_url</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">url</span> <span class="n">redirect_chain</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">redirect_chain</span> <span class="n">redirect_chain</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">response_url</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">))</span> <span class="n">url</span> <span class="o">=</span> <span class="n">urlsplit</span><span class="p">(</span><span class="n">response_url</span><span class="p">)</span> <span class="k">if</span> <span class="n">url</span><span class="o">.</span><span class="n">scheme</span><span class="p">:</span> <span class="n">extra</span><span class="p">[</span><span class="s1">'wsgi.url_scheme'</span><span class="p">]</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">scheme</span> <span class="k">if</span> <span class="n">url</span><span class="o">.</span><span class="n">hostname</span><span class="p">:</span> <span class="n">extra</span><span class="p">[</span><span class="s1">'SERVER_NAME'</span><span class="p">]</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">hostname</span> <span class="k">if</span> <span class="n">url</span><span class="o">.</span><span class="n">port</span><span class="p">:</span> <span class="n">extra</span><span class="p">[</span><span class="s1">'SERVER_PORT'</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">port</span><span class="p">)</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="n">QueryDict</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">query</span><span class="p">),</span> <span class="n">follow</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span> <span class="n">response</span><span class="o">.</span><span class="n">redirect_chain</span> <span class="o">=</span> <span class="n">redirect_chain</span> <span class="k">if</span> <span class="n">redirect_chain</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="n">redirect_chain</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span> <span class="c1"># Check that we're not redirecting to somewhere we've already</span> <span class="c1"># been to, to prevent loops.</span> <span class="k">raise</span> <span class="n">RedirectCycleError</span><span class="p">(</span><span class="s2">"Redirect loop detected."</span><span class="p">,</span> <span class="n">last_response</span><span class="o">=</span><span class="n">response</span><span class="p">)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">redirect_chain</span><span class="p">)</span> <span class="o">></span> <span class="mi">20</span><span class="p">:</span> <span class="c1"># Such a lengthy chain likely also means a loop, but one with</span> <span class="c1"># a growing path, changing view, or changing query argument;</span> <span class="c1"># 20 is the value of "network.http.redirection-limit" from Firefox.</span> <span class="k">raise</span> <span class="n">RedirectCycleError</span><span class="p">(</span><span class="s2">"Too many redirects."</span><span class="p">,</span> <span class="n">last_response</span><span class="o">=</span><span class="n">response</span><span class="p">)</span> <span class="k">return</span> <span class="n">response</span></div> </pre></div> </div> </div> </div> <div class="yui-b" id="sidebar"> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <h3>Browse</h3> <ul> </ul> <h3>You are here:</h3> <ul> <li> <a href="../../../index.html">Django 1.8.19 documentation</a> <ul><li><a href="../../index.html">Module code</a> <ul><li><a href="../../django.html">django</a> <ul><li>django.test.client</li></ul> </li></ul></li></ul> </li> </ul> <div id="searchbox" style="display: none" role="search"> <h3>Quick search</h3> <form class="search" action="../../../search.html" method="get"> <div><input type="text" name="q" /></div> <div><input type="submit" value="Go" /></div> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <h3>Last update:</h3> <p class="topless">Mar 10, 2018</p> </div> </div> <div id="ft"> <div class="nav"> <a href="../../index.html" title="Module code" accesskey="U">up</a></div> </div> </div> <div class="clearer"></div> </div> </body> </html>