mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-27 03:54:01 +03:00
591 lines
25 KiB
HTML
591 lines
25 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
<meta charset="utf-8">
|
|
<title>Requests - Django REST framework</title>
|
|
<link href="../../img/favicon.ico" rel="icon" type="image/x-icon">
|
|
<link rel="canonical" href="http://www.django-rest-framework.org/api-guide/requests/" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta name="description" content="Django, API, REST, Requests">
|
|
<meta name="author" content="Tom Christie">
|
|
|
|
<!-- Le styles -->
|
|
<link href="../../css/prettify.css" rel="stylesheet">
|
|
<link href="../../css/bootstrap.css" rel="stylesheet">
|
|
<link href="../../css/bootstrap-responsive.css" rel="stylesheet">
|
|
<link href="../../css/default.css" rel="stylesheet">
|
|
|
|
<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
|
|
<!--[if lt IE 9]>
|
|
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
|
|
<![endif]-->
|
|
|
|
<script type="text/javascript">
|
|
var _gaq = _gaq || [];
|
|
_gaq.push(['_setAccount', 'UA-18852272-2']);
|
|
_gaq.push(['_trackPageview']);
|
|
|
|
(function() {
|
|
var ga = document.createElement('script');
|
|
ga.type = 'text/javascript';
|
|
ga.async = true;
|
|
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
|
var s = document.getElementsByTagName('script')[0];
|
|
s.parentNode.insertBefore(ga, s);
|
|
})();
|
|
</script>
|
|
|
|
<style>
|
|
span.fusion-wrap a {
|
|
display: block;
|
|
margin-top: 10px;
|
|
color: black;
|
|
}
|
|
a.fusion-poweredby {
|
|
display: block;
|
|
margin-top: 10px;
|
|
}
|
|
@media (max-width: 767px) {
|
|
div.promo {
|
|
display: none;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
<body onload="prettyPrint()" class="-page">
|
|
|
|
<div class="wrapper">
|
|
|
|
<div class="navbar navbar-inverse navbar-fixed-top">
|
|
<div class="navbar-inner">
|
|
<div class="container-fluid">
|
|
<a class="repo-link btn btn-primary btn-small" href="https://github.com/tomchristie/django-rest-framework/tree/master">GitHub</a>
|
|
<a class="repo-link btn btn-inverse btn-small " rel="prev" href="../responses">
|
|
Next <i class="icon-arrow-right icon-white"></i>
|
|
</a>
|
|
<a class="repo-link btn btn-inverse btn-small " rel="next" href="../../tutorial/6-viewsets-and-routers">
|
|
<i class="icon-arrow-left icon-white"></i> Previous
|
|
</a>
|
|
<a class="repo-link btn btn-inverse btn-small" href="#searchModal" data-toggle="modal"><i class="icon-search icon-white"></i> Search</a>
|
|
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
</a>
|
|
<a class="brand" href="http://www.django-rest-framework.org">Django REST framework</a>
|
|
<div class="nav-collapse collapse">
|
|
|
|
<!-- Main navigation -->
|
|
<ul class="nav navbar-nav">
|
|
<li ><a href="/">Home</a></li>
|
|
|
|
<li class="dropdown">
|
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Tutorial <b class="caret"></b></a>
|
|
<ul class="dropdown-menu">
|
|
|
|
<li >
|
|
<a href="../../tutorial/quickstart">Quickstart</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../tutorial/1-serialization">1 - Serialization</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../tutorial/2-requests-and-responses">2 - Requests and responses</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../tutorial/3-class-based-views">3 - Class based views</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../tutorial/4-authentication-and-permissions">4 - Authentication and permissions</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../tutorial/5-relationships-and-hyperlinked-apis">5 - Relationships and hyperlinked APIs</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../tutorial/6-viewsets-and-routers">6 - Viewsets and routers</a>
|
|
</li>
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
<li class="dropdown active">
|
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Guide <b class="caret"></b></a>
|
|
<ul class="dropdown-menu">
|
|
|
|
<li class="active" >
|
|
<a href=".">Requests</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../responses">Responses</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../views">Views</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../generic-views">Generic views</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../viewsets">Viewsets</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../routers">Routers</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../parsers">Parsers</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../renderers">Renderers</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../serializers">Serializers</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../fields">Serializer fields</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../relations">Serializer relations</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../validators">Validators</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../authentication">Authentication</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../permissions">Permissions</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../throttling">Throttling</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../filtering">Filtering</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../pagination">Pagination</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../content-negotiation">Content negotiation</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../format-suffixes">Format suffixes</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../reverse">Returning URLs</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../exceptions">Exceptions</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../status-codes">Status codes</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../testing">Testing</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../settings">Settings</a>
|
|
</li>
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
<li class="dropdown">
|
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Topics <b class="caret"></b></a>
|
|
<ul class="dropdown-menu">
|
|
|
|
<li >
|
|
<a href="../../topics/documenting-your-api">Documenting your API</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/ajax-csrf-cors">AJAX, CSRF & CORS</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/browser-enhancements">Browser enhancements</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/browsable-api">The Browsable API</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/rest-hypermedia-hateoas">REST, Hypermedia & HATEOAS</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/third-party-resources">Third Party Resources</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/contributing">Contributing to REST framework</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/rest-framework-2-announcement">2.0 Announcement</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/2.2-announcement">2.2 Announcement</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/2.3-announcement">2.3 Announcement</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/2.4-announcement">2.4 Announcement</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/3.0-announcement">3.0 Announcement</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/kickstarter-announcement">Kickstarter Announcement</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/release-notes">Release Notes</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="../../topics/credits">Credits</a>
|
|
</li>
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
<!--/.nav-collapse -->
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="body-content">
|
|
<div class="container-fluid">
|
|
|
|
<!-- Search Modal -->
|
|
<div id="searchModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
|
<h3 id="myModalLabel">Documentation search</h3>
|
|
</div>
|
|
|
|
<div class="modal-body">
|
|
<!-- Custom google search -->
|
|
<script>
|
|
(function() {
|
|
var cx = '015016005043623903336:rxraeohqk6w';
|
|
var gcse = document.createElement('script');
|
|
gcse.type = 'text/javascript';
|
|
gcse.async = true;
|
|
gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
|
|
'//www.google.com/cse/cse.js?cx=' + cx;
|
|
var s = document.getElementsByTagName('script')[0];
|
|
s.parentNode.insertBefore(gcse, s);
|
|
})();
|
|
</script>
|
|
<gcse:search></gcse:search>
|
|
</div>
|
|
|
|
<div class="modal-footer">
|
|
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row-fluid">
|
|
|
|
<div class="span3">
|
|
<!-- TODO
|
|
<p style="margin-top: -12px">
|
|
<a class="btn btn-mini btn-primary" style="width: 60px">« previous</a>
|
|
<a class="btn btn-mini btn-primary" style="float: right; margin-right: 8px; width: 60px;">next »</a>
|
|
</p>
|
|
-->
|
|
<div id="table-of-contents">
|
|
<ul class="nav nav-list side-nav well sidebar-nav-fixed">
|
|
|
|
|
|
|
|
|
|
|
|
<li class="main">
|
|
<a href="#requests">Requests</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
<li class="main">
|
|
<a href="#request-parsing">Request parsing</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a href="#data">.data</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="#query_params">.query_params</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="#data-and-files">.DATA and .FILES</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="#query_params_1">.QUERY_PARAMS</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="#parsers">.parsers</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li class="main">
|
|
<a href="#content-negotiation">Content negotiation</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a href="#accepted_renderer">.accepted_renderer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="#accepted_media_type">.accepted_media_type</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li class="main">
|
|
<a href="#authentication">Authentication</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a href="#user">.user</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="#auth">.auth</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="#authenticators">.authenticators</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li class="main">
|
|
<a href="#browser-enhancements">Browser enhancements</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a href="#method">.method</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="#content_type">.content_type</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="#stream">.stream</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li class="main">
|
|
<a href="#standard-httprequest-attributes">Standard HttpRequest attributes</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="main-content" class="span9">
|
|
|
|
|
|
<a class="github" href="https://github.com/tomchristie/django-rest-framework/tree/master/rest_framework/request.py">
|
|
<span class="label label-info">request.py</span>
|
|
</a>
|
|
|
|
|
|
|
|
<hr />
|
|
<p><strong>Note</strong>: This is the documentation for the <strong>version 3.0</strong> of REST framework. Documentation for <a href="http://tomchristie.github.io/rest-framework-2-docs/">version 2.4</a> is also available.</p>
|
|
<hr />
|
|
<h1 id="requests">Requests</h1>
|
|
<blockquote>
|
|
<p>If you're doing REST-based web service stuff ... you should ignore request.POST.</p>
|
|
<p>— Malcom Tredinnick, <a href="https://groups.google.com/d/topic/django-developers/dxI4qVzrBY4/discussion">Django developers group</a></p>
|
|
</blockquote>
|
|
<p>REST framework's <code>Request</code> class extends the standard <code>HttpRequest</code>, adding support for REST framework's flexible request parsing and request authentication.</p>
|
|
<hr />
|
|
<h1 id="request-parsing">Request parsing</h1>
|
|
<p>REST framework's Request objects provide flexible request parsing that allows you to treat requests with JSON data or other media types in the same way that you would normally deal with form data.</p>
|
|
<h2 id="data">.data</h2>
|
|
<p><code>request.data</code> returns the parsed content of the request body. This is similar to the standard <code>request.POST</code> and <code>request.FILES</code> attributes except that:</p>
|
|
<ul>
|
|
<li>It includes all parsed content, including <em>file and non-file</em> inputs.</li>
|
|
<li>It supports parsing the content of HTTP methods other than <code>POST</code>, meaning that you can access the content of <code>PUT</code> and <code>PATCH</code> requests.</li>
|
|
<li>It supports REST framework's flexible request parsing, rather than just supporting form data. For example you can handle incoming JSON data in the same way that you handle incoming form data.</li>
|
|
</ul>
|
|
<p>For more details see the <a href="../parsers">parsers documentation</a>.</p>
|
|
<h2 id="query_params">.query_params</h2>
|
|
<p><code>request.query_params</code> is a more correctly named synonym for <code>request.GET</code>.</p>
|
|
<p>For clarity inside your code, we recommend using <code>request.query_params</code> instead of the Django's standard <code>request.GET</code>. Doing so will help keep your codebase more correct and obvious - any HTTP method type may include query parameters, not just <code>GET</code> requests.</p>
|
|
<h2 id="data-and-files">.DATA and .FILES</h2>
|
|
<p>The old-style version 2.x <code>request.data</code> and <code>request.FILES</code> attributes are still available, but are now pending deprecation in favor of the unified <code>request.data</code> attribute.</p>
|
|
<h2 id="query_params_1">.QUERY_PARAMS</h2>
|
|
<p>The old-style version 2.x <code>request.QUERY_PARAMS</code> attribute is still available, but is now pending deprecation in favor of the more pythonic <code>request.query_params</code>.</p>
|
|
<h2 id="parsers">.parsers</h2>
|
|
<p>The <code>APIView</code> class or <code>@api_view</code> decorator will ensure that this property is automatically set to a list of <code>Parser</code> instances, based on the <code>parser_classes</code> set on the view or based on the <code>DEFAULT_PARSER_CLASSES</code> setting.</p>
|
|
<p>You won't typically need to access this property.</p>
|
|
<hr />
|
|
<p><strong>Note:</strong> If a client sends malformed content, then accessing <code>request.data</code> may raise a <code>ParseError</code>. By default REST framework's <code>APIView</code> class or <code>@api_view</code> decorator will catch the error and return a <code>400 Bad Request</code> response.</p>
|
|
<p>If a client sends a request with a content-type that cannot be parsed then a <code>UnsupportedMediaType</code> exception will be raised, which by default will be caught and return a <code>415 Unsupported Media Type</code> response.</p>
|
|
<hr />
|
|
<h1 id="content-negotiation">Content negotiation</h1>
|
|
<p>The request exposes some properties that allow you to determine the result of the content negotiation stage. This allows you to implement behaviour such as selecting a different serialisation schemes for different media types.</p>
|
|
<h2 id="accepted_renderer">.accepted_renderer</h2>
|
|
<p>The renderer instance what was selected by the content negotiation stage.</p>
|
|
<h2 id="accepted_media_type">.accepted_media_type</h2>
|
|
<p>A string representing the media type that was accepted by the content negotiation stage.</p>
|
|
<hr />
|
|
<h1 id="authentication">Authentication</h1>
|
|
<p>REST framework provides flexible, per-request authentication, that gives you the ability to:</p>
|
|
<ul>
|
|
<li>Use different authentication policies for different parts of your API.</li>
|
|
<li>Support the use of multiple authentication policies.</li>
|
|
<li>Provide both user and token information associated with the incoming request.</li>
|
|
</ul>
|
|
<h2 id="user">.user</h2>
|
|
<p><code>request.user</code> typically returns an instance of <code>django.contrib.auth.models.User</code>, although the behavior depends on the authentication policy being used.</p>
|
|
<p>If the request is unauthenticated the default value of <code>request.user</code> is an instance of <code>django.contrib.auth.models.AnonymousUser</code>.</p>
|
|
<p>For more details see the <a href="../authentication">authentication documentation</a>.</p>
|
|
<h2 id="auth">.auth</h2>
|
|
<p><code>request.auth</code> returns any additional authentication context. The exact behavior of <code>request.auth</code> depends on the authentication policy being used, but it may typically be an instance of the token that the request was authenticated against.</p>
|
|
<p>If the request is unauthenticated, or if no additional context is present, the default value of <code>request.auth</code> is <code>None</code>.</p>
|
|
<p>For more details see the <a href="../authentication">authentication documentation</a>.</p>
|
|
<h2 id="authenticators">.authenticators</h2>
|
|
<p>The <code>APIView</code> class or <code>@api_view</code> decorator will ensure that this property is automatically set to a list of <code>Authentication</code> instances, based on the <code>authentication_classes</code> set on the view or based on the <code>DEFAULT_AUTHENTICATORS</code> setting.</p>
|
|
<p>You won't typically need to access this property.</p>
|
|
<hr />
|
|
<h1 id="browser-enhancements">Browser enhancements</h1>
|
|
<p>REST framework supports a few browser enhancements such as browser-based <code>PUT</code>, <code>PATCH</code> and <code>DELETE</code> forms.</p>
|
|
<h2 id="method">.method</h2>
|
|
<p><code>request.method</code> returns the <strong>uppercased</strong> string representation of the request's HTTP method.</p>
|
|
<p>Browser-based <code>PUT</code>, <code>PATCH</code> and <code>DELETE</code> forms are transparently supported.</p>
|
|
<p>For more information see the <a href="../../topics/browser-enhancements">browser enhancements documentation</a>.</p>
|
|
<h2 id="content_type">.content_type</h2>
|
|
<p><code>request.content_type</code>, returns a string object representing the media type of the HTTP request's body, or an empty string if no media type was provided.</p>
|
|
<p>You won't typically need to directly access the request's content type, as you'll normally rely on REST framework's default request parsing behavior.</p>
|
|
<p>If you do need to access the content type of the request you should use the <code>.content_type</code> property in preference to using <code>request.META.get('HTTP_CONTENT_TYPE')</code>, as it provides transparent support for browser-based non-form content.</p>
|
|
<p>For more information see the <a href="../../topics/browser-enhancements">browser enhancements documentation</a>.</p>
|
|
<h2 id="stream">.stream</h2>
|
|
<p><code>request.stream</code> returns a stream representing the content of the request body.</p>
|
|
<p>You won't typically need to directly access the request's content, as you'll normally rely on REST framework's default request parsing behavior.</p>
|
|
<p>If you do need to access the raw content directly, you should use the <code>.stream</code> property in preference to using <code>request.content</code>, as it provides transparent support for browser-based non-form content.</p>
|
|
<p>For more information see the <a href="../../topics/browser-enhancements">browser enhancements documentation</a>.</p>
|
|
<hr />
|
|
<h1 id="standard-httprequest-attributes">Standard HttpRequest attributes</h1>
|
|
<p>As REST framework's <code>Request</code> extends Django's <code>HttpRequest</code>, all the other standard attributes and methods are also available. For example the <code>request.META</code> and <code>request.session</code> dictionaries are available as normal.</p>
|
|
<p>Note that due to implementation reasons the <code>Request</code> class does not inherit from <code>HttpRequest</code> class, but instead extends the class using composition.</p>
|
|
|
|
</div>
|
|
<!--/span-->
|
|
</div>
|
|
<!--/row-->
|
|
</div>
|
|
<!--/.fluid-container-->
|
|
</div>
|
|
<!--/.body content-->
|
|
<div id="push"></div>
|
|
</div>
|
|
<!--/.wrapper -->
|
|
|
|
<footer class="span12">
|
|
<p>Documentation built with <a href="http://www.mkdocs.org/">MkDocs</a>.</a>
|
|
</p>
|
|
</footer>
|
|
|
|
<!-- Le javascript
|
|
================================================== -->
|
|
<!-- Placed at the end of the document so the pages load faster -->
|
|
<script src="../../js/jquery-1.8.1-min.js"></script>
|
|
<script src="../../js/prettify-1.0.js"></script>
|
|
<script src="../../js/bootstrap-2.1.1-min.js"></script>
|
|
|
|
<script>
|
|
//$('.side-nav').scrollspy()
|
|
var shiftWindow = function() {
|
|
scrollBy(0, -50)
|
|
};
|
|
if (location.hash) shiftWindow();
|
|
window.addEventListener("hashchange", shiftWindow);
|
|
|
|
$('.dropdown-menu').on('click touchstart', function(event) {
|
|
event.stopPropagation();
|
|
});
|
|
|
|
// Dynamically force sidenav to no higher than browser window
|
|
$('.side-nav').css('max-height', window.innerHeight - 130);
|
|
|
|
$(function() {
|
|
$(window).resize(function() {
|
|
$('.side-nav').css('max-height', window.innerHeight - 130);
|
|
});
|
|
});
|
|
</script>
|
|
</body>
|
|
|
|
</html> |