post(path, data=None, content_type=MULTIPART_CONTENT, follow=False, secure=False, **extra)
[source]
Makes a POST request on the provided path
and returns a Response
object, which is documented below.
The key-value pairs in the data
dictionary are used to submit POST data. For example:
>>> c = Client() >>> c.post('/login/', {'name': 'fred', 'passwd': 'secret'})
...will result in the evaluation of a POST request to this URL:
/login/
...with this POST data:
name=fred&passwd=secret
If you provide content_type
(e.g. text/xml for an XML payload), the contents of data
will be sent as-is in the POST request, using content_type
in the HTTP Content-Type
header.
If you don’t provide a value for content_type
, the values in data
will be transmitted with a content type of multipart/form-data. In this case, the key-value pairs in data
will be encoded as a multipart message and used to create the POST data payload.
To submit multiple values for a given key – for example, to specify the selections for a <select multiple>
– provide the values as a list or tuple for the required key. For example, this value of data
would submit three selected values for the field named choices
:
{'choices': ('a', 'b', 'd')}
Submitting files is a special case. To POST a file, you need only provide the file field name as a key, and a file handle to the file you wish to upload as a value. For example:
>>> c = Client() >>> with open('wishlist.doc') as fp: ... c.post('/customers/wishes/', {'name': 'fred', 'attachment': fp})
(The name attachment
here is not relevant; use whatever name your file-processing code expects.)
You may also provide any file-like object (e.g., StringIO
or BytesIO
) as a file handle.
Note that if you wish to use the same file handle for multiple post()
calls then you will need to manually reset the file pointer between posts. The easiest way to do this is to manually close the file after it has been provided to post()
, as demonstrated above.
You should also ensure that the file is opened in a way that allows the data to be read. If your file contains binary data such as an image, this means you will need to open the file in rb
(read binary) mode.
The extra
argument acts the same as for Client.get()
.
If the URL you request with a POST contains encoded parameters, these parameters will be made available in the request.GET data. For example, if you were to make the request:
>>> c.post('/login/?visitor=true', {'name': 'fred', 'passwd': 'secret'})
... the view handling this request could interrogate request.POST to retrieve the username and password, and could interrogate request.GET to determine if the user was a visitor.
If you set follow
to True
the client will follow any redirects and a redirect_chain
attribute will be set in the response object containing tuples of the intermediate urls and status codes.
If you set secure
to True
the client will emulate an HTTPS request.
Please login to continue.