<!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>File Uploads — 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="Handling HTTP requests" href="index.html" /> <link rel="next" title="Django shortcut functions" href="shortcuts.html" /> <link rel="prev" title="View decorators" href="decorators.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="decorators.html" title="View decorators">previous</a> | <a href="../index.html" title="Using Django" accesskey="U">up</a> | <a href="shortcuts.html" title="Django shortcut functions">next</a> »</div> </div> <div id="bd"> <div id="yui-main"> <div class="yui-b"> <div class="yui-g" id="topics-http-file-uploads"> <div class="section" id="s-file-uploads"> <span id="file-uploads"></span><h1>File Uploads<a class="headerlink" href="#file-uploads" title="Permalink to this headline">¶</a></h1> <p>When Django handles a file upload, the file data ends up placed in <a class="reference internal" href="../../ref/request-response.html#django.http.HttpRequest.FILES" title="django.http.HttpRequest.FILES"><code class="xref py py-attr docutils literal"><span class="pre">request.FILES</span></code></a> (for more on the <code class="docutils literal"><span class="pre">request</span></code> object see the documentation for <a class="reference internal" href="../../ref/request-response.html"><span class="doc">request and response objects</span></a>). This document explains how files are stored on disk and in memory, and how to customize the default behavior.</p> <div class="admonition warning"> <p class="first admonition-title">Warning</p> <p class="last">There are security risks if you are accepting uploaded content from untrusted users! See the security guide’s topic on <a class="reference internal" href="../security.html#user-uploaded-content-security"><span class="std std-ref">User-uploaded content</span></a> for mitigation details.</p> </div> <div class="section" id="s-basic-file-uploads"> <span id="basic-file-uploads"></span><h2>Basic file uploads<a class="headerlink" href="#basic-file-uploads" title="Permalink to this headline">¶</a></h2> <p>Consider a simple form containing a <a class="reference internal" href="../../ref/forms/fields.html#django.forms.FileField" title="django.forms.FileField"><code class="xref py py-class docutils literal"><span class="pre">FileField</span></code></a>:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="c1"># In forms.py...</span> <span class="kn">from</span> <span class="nn">django</span> <span class="k">import</span> <span class="n">forms</span> <span class="k">class</span> <span class="nc">UploadFileForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">Form</span><span class="p">):</span> <span class="n">title</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">50</span><span class="p">)</span> <span class="n">file</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">FileField</span><span class="p">()</span> </pre></div> </div> <p>A view handling this form will receive the file data in <a class="reference internal" href="../../ref/request-response.html#django.http.HttpRequest.FILES" title="django.http.HttpRequest.FILES"><code class="xref py py-attr docutils literal"><span class="pre">request.FILES</span></code></a>, which is a dictionary containing a key for each <a class="reference internal" href="../../ref/forms/fields.html#django.forms.FileField" title="django.forms.FileField"><code class="xref py py-class docutils literal"><span class="pre">FileField</span></code></a> (or <a class="reference internal" href="../../ref/forms/fields.html#django.forms.ImageField" title="django.forms.ImageField"><code class="xref py py-class docutils literal"><span class="pre">ImageField</span></code></a>, or other <a class="reference internal" href="../../ref/forms/fields.html#django.forms.FileField" title="django.forms.FileField"><code class="xref py py-class docutils literal"><span class="pre">FileField</span></code></a> subclass) in the form. So the data from the above form would be accessible as <code class="docutils literal"><span class="pre">request.FILES['file']</span></code>.</p> <p>Note that <a class="reference internal" href="../../ref/request-response.html#django.http.HttpRequest.FILES" title="django.http.HttpRequest.FILES"><code class="xref py py-attr docutils literal"><span class="pre">request.FILES</span></code></a> will only contain data if the request method was <code class="docutils literal"><span class="pre">POST</span></code> and the <code class="docutils literal"><span class="pre"><form></span></code> that posted the request has the attribute <code class="docutils literal"><span class="pre">enctype="multipart/form-data"</span></code>. Otherwise, <code class="docutils literal"><span class="pre">request.FILES</span></code> will be empty.</p> <p>Most of the time, you’ll simply pass the file data from <code class="docutils literal"><span class="pre">request</span></code> into the form as described in <a class="reference internal" href="../../ref/forms/api.html#binding-uploaded-files"><span class="std std-ref">Binding uploaded files to a form</span></a>. This would look something like:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.http</span> <span class="k">import</span> <span class="n">HttpResponseRedirect</span> <span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="k">import</span> <span class="n">render_to_response</span> <span class="kn">from</span> <span class="nn">.forms</span> <span class="k">import</span> <span class="n">UploadFileForm</span> <span class="c1"># Imaginary function to handle an uploaded file.</span> <span class="kn">from</span> <span class="nn">somewhere</span> <span class="k">import</span> <span class="n">handle_uploaded_file</span> <span class="k">def</span> <span class="nf">upload_file</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">'POST'</span><span class="p">:</span> <span class="n">form</span> <span class="o">=</span> <span class="n">UploadFileForm</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">FILES</span><span class="p">)</span> <span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span> <span class="n">handle_uploaded_file</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">FILES</span><span class="p">[</span><span class="s1">'file'</span><span class="p">])</span> <span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span><span class="s1">'/success/url/'</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">form</span> <span class="o">=</span> <span class="n">UploadFileForm</span><span class="p">()</span> <span class="k">return</span> <span class="n">render_to_response</span><span class="p">(</span><span class="s1">'upload.html'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'form'</span><span class="p">:</span> <span class="n">form</span><span class="p">})</span> </pre></div> </div> <p>Notice that we have to pass <a class="reference internal" href="../../ref/request-response.html#django.http.HttpRequest.FILES" title="django.http.HttpRequest.FILES"><code class="xref py py-attr docutils literal"><span class="pre">request.FILES</span></code></a> into the form’s constructor; this is how file data gets bound into a form.</p> <p>Here’s a common way you might handle an uploaded file:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">handle_uploaded_file</span><span class="p">(</span><span class="n">f</span><span class="p">):</span> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'some/file/name.txt'</span><span class="p">,</span> <span class="s1">'wb+'</span><span class="p">)</span> <span class="k">as</span> <span class="n">destination</span><span class="p">:</span> <span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="n">f</span><span class="o">.</span><span class="n">chunks</span><span class="p">():</span> <span class="n">destination</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span> </pre></div> </div> <p>Looping over <code class="docutils literal"><span class="pre">UploadedFile.chunks()</span></code> instead of using <code class="docutils literal"><span class="pre">read()</span></code> ensures that large files don’t overwhelm your system’s memory.</p> <p>There are a few other methods and attributes available on <code class="docutils literal"><span class="pre">UploadedFile</span></code> objects; see <a class="reference internal" href="../../ref/files/uploads.html#django.core.files.uploadedfile.UploadedFile" title="django.core.files.uploadedfile.UploadedFile"><code class="xref py py-class docutils literal"><span class="pre">UploadedFile</span></code></a> for a complete reference.</p> <div class="section" id="s-handling-uploaded-files-with-a-model"> <span id="handling-uploaded-files-with-a-model"></span><h3>Handling uploaded files with a model<a class="headerlink" href="#handling-uploaded-files-with-a-model" title="Permalink to this headline">¶</a></h3> <p>If you’re saving a file on a <a class="reference internal" href="../../ref/models/instances.html#django.db.models.Model" title="django.db.models.Model"><code class="xref py py-class docutils literal"><span class="pre">Model</span></code></a> with a <a class="reference internal" href="../../ref/models/fields.html#django.db.models.FileField" title="django.db.models.FileField"><code class="xref py py-class docutils literal"><span class="pre">FileField</span></code></a>, using a <a class="reference internal" href="../forms/modelforms.html#django.forms.ModelForm" title="django.forms.ModelForm"><code class="xref py py-class docutils literal"><span class="pre">ModelForm</span></code></a> makes this process much easier. The file object will be saved to the location specified by the <a class="reference internal" href="../../ref/models/fields.html#django.db.models.FileField.upload_to" title="django.db.models.FileField.upload_to"><code class="xref py py-attr docutils literal"><span class="pre">upload_to</span></code></a> argument of the corresponding <a class="reference internal" href="../../ref/models/fields.html#django.db.models.FileField" title="django.db.models.FileField"><code class="xref py py-class docutils literal"><span class="pre">FileField</span></code></a> when calling <code class="docutils literal"><span class="pre">form.save()</span></code>:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.http</span> <span class="k">import</span> <span class="n">HttpResponseRedirect</span> <span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="k">import</span> <span class="n">render</span> <span class="kn">from</span> <span class="nn">.forms</span> <span class="k">import</span> <span class="n">ModelFormWithFileField</span> <span class="k">def</span> <span class="nf">upload_file</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">'POST'</span><span class="p">:</span> <span class="n">form</span> <span class="o">=</span> <span class="n">ModelFormWithFileField</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">FILES</span><span class="p">)</span> <span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span> <span class="c1"># file is saved</span> <span class="n">form</span><span class="o">.</span><span class="n">save</span><span class="p">()</span> <span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span><span class="s1">'/success/url/'</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">form</span> <span class="o">=</span> <span class="n">ModelFormWithFileField</span><span class="p">()</span> <span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="s1">'upload.html'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'form'</span><span class="p">:</span> <span class="n">form</span><span class="p">})</span> </pre></div> </div> <p>If you are constructing an object manually, you can simply assign the file object from <a class="reference internal" href="../../ref/request-response.html#django.http.HttpRequest.FILES" title="django.http.HttpRequest.FILES"><code class="xref py py-attr docutils literal"><span class="pre">request.FILES</span></code></a> to the file field in the model:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.http</span> <span class="k">import</span> <span class="n">HttpResponseRedirect</span> <span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="k">import</span> <span class="n">render</span> <span class="kn">from</span> <span class="nn">.forms</span> <span class="k">import</span> <span class="n">UploadFileForm</span> <span class="kn">from</span> <span class="nn">.models</span> <span class="k">import</span> <span class="n">ModelWithFileField</span> <span class="k">def</span> <span class="nf">upload_file</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">'POST'</span><span class="p">:</span> <span class="n">form</span> <span class="o">=</span> <span class="n">UploadFileForm</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">FILES</span><span class="p">)</span> <span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span> <span class="n">instance</span> <span class="o">=</span> <span class="n">ModelWithFileField</span><span class="p">(</span><span class="n">file_field</span><span class="o">=</span><span class="n">request</span><span class="o">.</span><span class="n">FILES</span><span class="p">[</span><span class="s1">'file'</span><span class="p">])</span> <span class="n">instance</span><span class="o">.</span><span class="n">save</span><span class="p">()</span> <span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span><span class="s1">'/success/url/'</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">form</span> <span class="o">=</span> <span class="n">UploadFileForm</span><span class="p">()</span> <span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="s1">'upload.html'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'form'</span><span class="p">:</span> <span class="n">form</span><span class="p">})</span> </pre></div> </div> </div> </div> <div class="section" id="s-upload-handlers"> <span id="upload-handlers"></span><h2>Upload Handlers<a class="headerlink" href="#upload-handlers" title="Permalink to this headline">¶</a></h2> <p>When a user uploads a file, Django passes off the file data to an <em>upload handler</em> – a small class that handles file data as it gets uploaded. Upload handlers are initially defined in the <a class="reference internal" href="../../ref/settings.html#std:setting-FILE_UPLOAD_HANDLERS"><code class="xref std std-setting docutils literal"><span class="pre">FILE_UPLOAD_HANDLERS</span></code></a> setting, which defaults to:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">(</span><span class="s2">"django.core.files.uploadhandler.MemoryFileUploadHandler"</span><span class="p">,</span> <span class="s2">"django.core.files.uploadhandler.TemporaryFileUploadHandler"</span><span class="p">,)</span> </pre></div> </div> <p>Together <a class="reference internal" href="../../ref/files/uploads.html#django.core.files.uploadhandler.MemoryFileUploadHandler" title="django.core.files.uploadhandler.MemoryFileUploadHandler"><code class="xref py py-class docutils literal"><span class="pre">MemoryFileUploadHandler</span></code></a> and <a class="reference internal" href="../../ref/files/uploads.html#django.core.files.uploadhandler.TemporaryFileUploadHandler" title="django.core.files.uploadhandler.TemporaryFileUploadHandler"><code class="xref py py-class docutils literal"><span class="pre">TemporaryFileUploadHandler</span></code></a> provide Django’s default file upload behavior of reading small files into memory and large ones onto disk.</p> <p>You can write custom handlers that customize how Django handles files. You could, for example, use custom handlers to enforce user-level quotas, compress data on the fly, render progress bars, and even send data to another storage location directly without storing it locally. See <a class="reference internal" href="../../ref/files/uploads.html#custom-upload-handlers"><span class="std std-ref">Writing custom upload handlers</span></a> for details on how you can customize or completely replace upload behavior.</p> <div class="section" id="s-where-uploaded-data-is-stored"> <span id="s-modifying-upload-handlers-on-the-fly"></span><span id="where-uploaded-data-is-stored"></span><span id="modifying-upload-handlers-on-the-fly"></span><h3>Where uploaded data is stored<a class="headerlink" href="#where-uploaded-data-is-stored" title="Permalink to this headline">¶</a></h3> <p>Before you save uploaded files, the data needs to be stored somewhere.</p> <p>By default, if an uploaded file is smaller than 2.5 megabytes, Django will hold the entire contents of the upload in memory. This means that saving the file involves only a read from memory and a write to disk and thus is very fast.</p> <p>However, if an uploaded file is too large, Django will write the uploaded file to a temporary file stored in your system’s temporary directory. On a Unix-like platform this means you can expect Django to generate a file called something like <code class="docutils literal"><span class="pre">/tmp/tmpzfp6I6.upload</span></code>. If an upload is large enough, you can watch this file grow in size as Django streams the data onto disk.</p> <p>These specifics – 2.5 megabytes; <code class="docutils literal"><span class="pre">/tmp</span></code>; etc. – are simply “reasonable defaults” which can be customized as described in the next section.</p> </div> <div class="section" id="s-changing-upload-handler-behavior"> <span id="changing-upload-handler-behavior"></span><h3>Changing upload handler behavior<a class="headerlink" href="#changing-upload-handler-behavior" title="Permalink to this headline">¶</a></h3> <p>There are a few settings which control Django’s file upload behavior. See <a class="reference internal" href="../../ref/settings.html#file-upload-settings"><span class="std std-ref">File Upload Settings</span></a> for details.</p> </div> <div class="section" id="s-id1"> <span id="id1"></span><h3>Modifying upload handlers on the fly<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3> <p>Sometimes particular views require different upload behavior. In these cases, you can override upload handlers on a per-request basis by modifying <code class="docutils literal"><span class="pre">request.upload_handlers</span></code>. By default, this list will contain the upload handlers given by <a class="reference internal" href="../../ref/settings.html#std:setting-FILE_UPLOAD_HANDLERS"><code class="xref std std-setting docutils literal"><span class="pre">FILE_UPLOAD_HANDLERS</span></code></a>, but you can modify the list as you would any other list.</p> <p>For instance, suppose you’ve written a <code class="docutils literal"><span class="pre">ProgressBarUploadHandler</span></code> that provides feedback on upload progress to some sort of AJAX widget. You’d add this handler to your upload handlers like this:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">request</span><span class="o">.</span><span class="n">upload_handlers</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">ProgressBarUploadHandler</span><span class="p">(</span><span class="n">request</span><span class="p">))</span> </pre></div> </div> <p>You’d probably want to use <code class="docutils literal"><span class="pre">list.insert()</span></code> in this case (instead of <code class="docutils literal"><span class="pre">append()</span></code>) because a progress bar handler would need to run <em>before</em> any other handlers. Remember, the upload handlers are processed in order.</p> <p>If you want to replace the upload handlers completely, you can just assign a new list:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">request</span><span class="o">.</span><span class="n">upload_handlers</span> <span class="o">=</span> <span class="p">[</span><span class="n">ProgressBarUploadHandler</span><span class="p">(</span><span class="n">request</span><span class="p">)]</span> </pre></div> </div> <div class="admonition note"> <p class="first admonition-title">Note</p> <p>You can only modify upload handlers <em>before</em> accessing <code class="docutils literal"><span class="pre">request.POST</span></code> or <code class="docutils literal"><span class="pre">request.FILES</span></code> – it doesn’t make sense to change upload handlers after upload handling has already started. If you try to modify <code class="docutils literal"><span class="pre">request.upload_handlers</span></code> after reading from <code class="docutils literal"><span class="pre">request.POST</span></code> or <code class="docutils literal"><span class="pre">request.FILES</span></code> Django will throw an error.</p> <p>Thus, you should always modify uploading handlers as early in your view as possible.</p> <p>Also, <code class="docutils literal"><span class="pre">request.POST</span></code> is accessed by <a class="reference internal" href="../../ref/middleware.html#django.middleware.csrf.CsrfViewMiddleware" title="django.middleware.csrf.CsrfViewMiddleware"><code class="xref py py-class docutils literal"><span class="pre">CsrfViewMiddleware</span></code></a> which is enabled by default. This means you will need to use <a class="reference internal" href="../../ref/csrf.html#django.views.decorators.csrf.csrf_exempt" title="django.views.decorators.csrf.csrf_exempt"><code class="xref py py-func docutils literal"><span class="pre">csrf_exempt()</span></code></a> on your view to allow you to change the upload handlers. You will then need to use <a class="reference internal" href="../../ref/csrf.html#django.views.decorators.csrf.csrf_protect" title="django.views.decorators.csrf.csrf_protect"><code class="xref py py-func docutils literal"><span class="pre">csrf_protect()</span></code></a> on the function that actually processes the request. Note that this means that the handlers may start receiving the file upload before the CSRF checks have been done. Example code:</p> <div class="last highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.views.decorators.csrf</span> <span class="k">import</span> <span class="n">csrf_exempt</span><span class="p">,</span> <span class="n">csrf_protect</span> <span class="nd">@csrf_exempt</span> <span class="k">def</span> <span class="nf">upload_file_view</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="n">request</span><span class="o">.</span><span class="n">upload_handlers</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">ProgressBarUploadHandler</span><span class="p">(</span><span class="n">request</span><span class="p">))</span> <span class="k">return</span> <span class="n">_upload_file_view</span><span class="p">(</span><span class="n">request</span><span class="p">)</span> <span class="nd">@csrf_protect</span> <span class="k">def</span> <span class="nf">_upload_file_view</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="o">...</span> <span class="c1"># Process request</span> </pre></div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="yui-b" id="sidebar"> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <h3><a href="../../contents.html">Table Of Contents</a></h3> <ul> <li><a class="reference internal" href="#">File Uploads</a><ul> <li><a class="reference internal" href="#basic-file-uploads">Basic file uploads</a><ul> <li><a class="reference internal" href="#handling-uploaded-files-with-a-model">Handling uploaded files with a model</a></li> </ul> </li> <li><a class="reference internal" href="#upload-handlers">Upload Handlers</a><ul> <li><a class="reference internal" href="#where-uploaded-data-is-stored">Where uploaded data is stored</a></li> <li><a class="reference internal" href="#changing-upload-handler-behavior">Changing upload handler behavior</a></li> <li><a class="reference internal" href="#id1">Modifying upload handlers on the fly</a></li> </ul> </li> </ul> </li> </ul> <h3>Browse</h3> <ul> <li>Prev: <a href="decorators.html">View decorators</a></li> <li>Next: <a href="shortcuts.html">Django shortcut functions</a></li> </ul> <h3>You are here:</h3> <ul> <li> <a href="../../index.html">Django 1.8.19 documentation</a> <ul><li><a href="../index.html">Using Django</a> <ul><li><a href="index.html">Handling HTTP requests</a> <ul><li>File Uploads</li></ul> </li></ul></li></ul> </li> </ul> <div role="note" aria-label="source link"> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="../../_sources/topics/http/file-uploads.txt" rel="nofollow">Show Source</a></li> </ul> </div> <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="decorators.html" title="View decorators">previous</a> | <a href="../index.html" title="Using Django" accesskey="U">up</a> | <a href="shortcuts.html" title="Django shortcut functions">next</a> »</div> </div> </div> <div class="clearer"></div> </div> </body> </html>