{"title":"View decorators","version":"4.0","locale":"en","docname":"topics/http/decorators","url":"/en/4.0/topics/http/decorators/","canonical":"https://djangodocs.dev/en/4.0/topics/http/decorators/","summary":"Django provides several decorators that can be applied to views to support various HTTP features. See Decorating the class for how to use these decorators with…","html":"<span id=\"view-decorators\"></span><h1>View decorators<a class=\"heading-anchor\" href=\"#module-django.views.decorators.http\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django provides several decorators that can be applied to views to support\nvarious HTTP features.</p>\n<p>See <a class=\"reference internal\" href=\"/en/4.0/topics/class-based-views/intro/#id1\"><span class=\"std std-ref\">Decorating the class</span></a> for how to use these decorators with\nclass-based views.</p>\n<section id=\"allowed-http-methods\">\n<h2>Allowed HTTP methods<a class=\"heading-anchor\" href=\"#allowed-http-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The decorators in <a class=\"reference internal\" href=\"#module-django.views.decorators.http\" title=\"django.views.decorators.http\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http</span></code></a> can be used to restrict\naccess to views based on the request method. These decorators will return\na <a class=\"reference internal\" href=\"/en/4.0/ref/request-response/#django.http.HttpResponseNotAllowed\" title=\"django.http.HttpResponseNotAllowed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.http.HttpResponseNotAllowed</span></code></a> if the conditions are not met.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.http.require_http_methods\">\n<span class=\"sig-name descname\"><span class=\"pre\">require_http_methods</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request_method_list</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.http.require_http_methods\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Decorator to require that a view only accepts particular request\nmethods. Usage:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">require_http_methods</span>\n\n<span class=\"nd\">@require_http_methods</span><span class=\"p\">([</span><span class=\"s2\">&quot;GET&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">])</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># I can assume now that only GET or POST requests make it this far</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Note that request methods should be in uppercase.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.http.require_GET\">\n<span class=\"sig-name descname\"><span class=\"pre\">require_GET</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.http.require_GET\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Decorator to require that a view only accepts the GET method.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.http.require_POST\">\n<span class=\"sig-name descname\"><span class=\"pre\">require_POST</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.http.require_POST\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Decorator to require that a view only accepts the POST method.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.http.require_safe\">\n<span class=\"sig-name descname\"><span class=\"pre\">require_safe</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.http.require_safe\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Decorator to require that a view only accepts the GET and HEAD methods.\nThese methods are commonly considered “safe” because they should not have\nthe significance of taking an action other than retrieving the requested\nresource.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Web servers should automatically strip the content of responses to HEAD\nrequests while leaving the headers unchanged, so you may handle HEAD\nrequests exactly like GET requests in your views. Since some software,\nsuch as link checkers, rely on HEAD requests, you might prefer\nusing <code class=\"docutils literal notranslate\"><span class=\"pre\">require_safe</span></code> instead of <code class=\"docutils literal notranslate\"><span class=\"pre\">require_GET</span></code>.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"conditional-view-processing\">\n<h2>Conditional view processing<a class=\"heading-anchor\" href=\"#conditional-view-processing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The following decorators in <a class=\"reference internal\" href=\"#module-django.views.decorators.http\" title=\"django.views.decorators.http\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http</span></code></a> can be used to\ncontrol caching behavior on particular views.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.http.condition\">\n<span class=\"sig-name descname\"><span class=\"pre\">condition</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">etag_func</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">last_modified_func</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.http.condition\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.http.etag\">\n<span class=\"sig-name descname\"><span class=\"pre\">etag</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">etag_func</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.http.etag\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.http.last_modified\">\n<span class=\"sig-name descname\"><span class=\"pre\">last_modified</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">last_modified_func</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.http.last_modified\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>These decorators can be used to generate <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code>\nheaders; see\n<a class=\"reference internal\" href=\"/en/4.0/topics/conditional-view-processing/\"><span class=\"doc\">conditional view processing</span></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"gzip-compression\">\n<span id=\"module-django.views.decorators.gzip\"></span><h2>GZip compression<a class=\"heading-anchor\" href=\"#gzip-compression\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The decorators in <a class=\"reference internal\" href=\"#module-django.views.decorators.gzip\" title=\"django.views.decorators.gzip\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.views.decorators.gzip</span></code></a> control content\ncompression on a per-view basis.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.gzip.gzip_page\">\n<span class=\"sig-name descname\"><span class=\"pre\">gzip_page</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.gzip.gzip_page\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This decorator compresses content if the browser allows gzip compression.\nIt sets the <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header accordingly, so that caches will base their\nstorage on the <code class=\"docutils literal notranslate\"><span class=\"pre\">Accept-Encoding</span></code> header.</p>\n</dd></dl>\n\n</section>\n<section id=\"vary-headers\">\n<span id=\"module-django.views.decorators.vary\"></span><h2>Vary headers<a class=\"heading-anchor\" href=\"#vary-headers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The decorators in <a class=\"reference internal\" href=\"#module-django.views.decorators.vary\" title=\"django.views.decorators.vary\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.views.decorators.vary</span></code></a> can be used to control\ncaching based on specific request headers.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.vary.vary_on_cookie\">\n<span class=\"sig-name descname\"><span class=\"pre\">vary_on_cookie</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">func</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.vary.vary_on_cookie\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.vary.vary_on_headers\">\n<span class=\"sig-name descname\"><span class=\"pre\">vary_on_headers</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">headers</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.vary.vary_on_headers\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header defines which request headers a cache mechanism should take\ninto account when building its cache key.</p>\n<p>See <a class=\"reference internal\" href=\"/en/4.0/topics/cache/#using-vary-headers\"><span class=\"std std-ref\">using vary headers</span></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"caching\">\n<span id=\"module-django.views.decorators.cache\"></span><h2>Caching<a class=\"heading-anchor\" href=\"#caching\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The decorators in <a class=\"reference internal\" href=\"#module-django.views.decorators.cache\" title=\"django.views.decorators.cache\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.views.decorators.cache</span></code></a> control server and\nclient-side caching.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.cache.cache_control\">\n<span class=\"sig-name descname\"><span class=\"pre\">cache_control</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.cache.cache_control\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This decorator patches the response’s <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> header by adding\nall of the keyword arguments to it. See\n<a class=\"reference internal\" href=\"/en/4.0/ref/utils/#django.utils.cache.patch_cache_control\" title=\"django.utils.cache.patch_cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">patch_cache_control()</span></code></a> for the details of the\ntransformation.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.cache.never_cache\">\n<span class=\"sig-name descname\"><span class=\"pre\">never_cache</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">view_func</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.cache.never_cache\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This decorator adds an <code class=\"docutils literal notranslate\"><span class=\"pre\">Expires</span></code> header to the current date/time.</p>\n<p>This decorator adds a <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control:</span> <span class=\"pre\">max-age=0,</span> <span class=\"pre\">no-cache,</span> <span class=\"pre\">no-store,</span>\n<span class=\"pre\">must-revalidate,</span> <span class=\"pre\">private</span></code> header to a response to indicate that a page\nshould never be cached.</p>\n<p>Each header is only added if it isn’t already set.</p>\n</dd></dl>\n\n</section>\n<section id=\"common\">\n<span id=\"module-django.views.decorators.common\"></span><h2>Common<a class=\"heading-anchor\" href=\"#common\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"version-note version-added\" data-version=\"3.2\">\n<p class=\"version-note-title\">New in Django 3.2</p></aside>\n<p>The decorators in <a class=\"reference internal\" href=\"#module-django.views.decorators.common\" title=\"django.views.decorators.common\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.views.decorators.common</span></code></a> allow per-view\ncustomization of <a class=\"reference internal\" href=\"/en/4.0/ref/middleware/#django.middleware.common.CommonMiddleware\" title=\"django.middleware.common.CommonMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code></a> behavior.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.common.no_append_slash\">\n<span class=\"sig-name descname\"><span class=\"pre\">no_append_slash</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.common.no_append_slash\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This decorator allows individual views to be excluded from\n<a class=\"reference internal\" href=\"/en/4.0/ref/settings/#std-setting-APPEND_SLASH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APPEND_SLASH</span></code></a> URL normalization.</p>\n</dd></dl>\n\n</section>","rootId":"module-django.views.decorators.http","toc":[{"title":"Allowed HTTP methods","anchor":"allowed-http-methods","children":[]},{"title":"Conditional view processing","anchor":"conditional-view-processing","children":[]},{"title":"GZip compression","anchor":"gzip-compression","children":[]},{"title":"Vary headers","anchor":"vary-headers","children":[]},{"title":"Caching","anchor":"caching","children":[]},{"title":"Common","anchor":"common","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Using Django","url":"/en/4.0/topics/"},{"docname":"topics/http/index","title":"Handling HTTP requests","url":"/en/4.0/topics/http/"}],"prev":{"docname":"topics/http/views","title":"Writing views","url":"/en/4.0/topics/http/views/"},"next":{"docname":"topics/http/file-uploads","title":"File Uploads","url":"/en/4.0/topics/http/file-uploads/"},"formats":{"html":"/en/4.0/topics/http/decorators/","markdown":"/en/4.0/topics/http/decorators.md","json":"/en/4.0/topics/http/decorators.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/topics/http/decorators.txt","official":"https://docs.djangoproject.com/en/4.0/topics/http/decorators/","inVersions":["dev","6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9","1.8"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}