|
|
Documentation - Modules
3.8.2. Request (implicit)
The request module is loaded implicitly into every Spyce environment.
The spyce configuration file gives two lists that affect the request module:
param_filters and file_filters. param_filters is a list of functions to run
against the GET and POST variables in the request; file filters is the same,
only for files uploaded. Each function will be passed the request module
and a dictionary when it is called; each will be called once for GET and once for POST
with each new request.
These hooks exist because the request dictionaries should not be modified
in an ad-hoc manner; these allow you to set an application-wide policy
in a well-defined manner. You might, for instance, disallow all file uploads
over 1 MB.
Here's an example that calls either Html.clean
or Html.escape (not shown) to ensure that no potentially harmful html can
be injected in user-editable areas of a site:
examples/filter.py
|
def htmlFilter(request, d):
try:
toClean = request._post['__htmlfields'][0].split(',')
except KeyError:
toClean = []
for key in d:
if key in toClean:
d[key] = [Html.clean(s) for s in d[key]]
else:
d[key] = [Html.escape(s) for s in d[key]]
|
The request module provides the following methods:
- login_id:
Returns the id generated by your validator function if the user has logged in
via spy:login or spy:login_required, or None if the user is unvalidated. (See the
core tag library for details on
the login tags.)
- uri( [component] ):
Returns the request URI, or some
component thereof. If the optional component parameter is specified,
it should be one of the following strings:
'scheme',
'location',
'path',
'parameters',
'query' or
'fragment'.
- method():
Returns request method type (GET, POST,
...)
- query():
Returns the request query string
- get( [name], [default], [ignoreCase] ):
Returns request GET
information. If name is specified then a single list of values is
returned if the parameter exists, or default, which defaults to an
empty list,
if the parameter does not exist. Parameters without values are skipped,
though empty string values are allowed. If name is omitted, then a
dictionary of lists is returned. If ignoreCase is true, then the
above behaviour is performed in a case insensitive manner (all parameters
are treated as lowercase).
- get1( [name], [default], [ignoreCase] ):
Returns request GET
information, similarly to (though slightly differently from) the function
above. If name is specified then a single string is returned if the
parameter exists, or default, which default to None, if the parameter
does not exist. If there is more than one value for a parameter, then only
one is returned. Parameters without values are skipped, though empty string
values are allowed. If name is omitted, then a dictionary of strings is
returned. If the optional ignoreCase flag is true, then the above
behaviour is performed in a case insensitive manner (all parameters are
treated as lowercase).
- post( [name], [default], [ignoreCase] ):
Returns request
POST information. If name is specified then a single list of values
is returned if the parameter exists, or default, which defaults to
an empty list, if the parameter does not exist. Parameters without values are
skipped, though empty string values are allowed. If name is omitted, then a
dictionary of lists is returned. If ignoreCase is true, then the
above behaviour is performed in a case insensitive manner (all parameters
are treated as lowercase). This function understands form information
encoded either as 'application/x-www-form-urlencoded' or
'multipart/form-data'. Uploaded file parameters are not included in this
dictionary; they can be accessed via the file method.
- post1( [name], [default], [ignoreCase] ):
Returns request
POST information, similarly to (though slightly differently from) the
function above. If name is specified then a single string is returned
if the parameter exists, or default, which defaults to None, if the
parameter does not exist. If there is more than one value for a parameter,
then only one is returned. Parameters without values are skipped, though
empty string values are allowed. If name is omitted, then a dictionary of
strings is returned. If the optional ignoreCase flag is true, then
the above behaviour is performed in a case insensitive manner (all
parameters are treated as lowercase). This function understands form
information encoded either as 'application/x-www-form-urlencoded' or
'multipart/form-data'. Uploaded file parameters are not included in this
dictionary; they can be accessed via the file method.
- file( [name], [ignoreCase] ):
Returns files POSTed in the
request. If name is specified then a single cgi.FieldStorage class is
returned if such a file parameter exists, otherwise None. If name is
omitted, then a dictionary of file entries is returned. If the optional
ignoreCase flag is true, then the above behaviour is performed in a
case insensitive manner (all parameters are treated as lowercase). The
interesting fields of the FieldStorage class are:
- name: the field name, if specified; otherwise None
- filename: the filename, if specified; otherwise None; this is
the client-side filename, not the filename in which the content is stored
- a temporary file you don't deal with
- value: the value as a string; for file uploads, this
transparently reads the file every time you request the value
- file: the file(-like) object from which you can read the data;
None if the data is stored a simple string
- type: the content-type, or None if not specified
- type_options: dictionary of options specified on the
content-type line
- disposition: content-disposition, or None if not specified
- disposition_options: dictionary of corresponding options
- headers: a dictionary(-like) object (sometimes rfc822.Message
or a subclass thereof) containing *all* headers
- __getitem__( key ):
The request module can be used as a
dictionary: i.e. request['foo']. This method first calls the get1() method,
then the post1() method and lastly the file() method trying to find the
first non-None value to return. If no value is found, then this method
returns None. Note: Throwing an exception seemed too strong a semantics, and
so this is a break from Python. One can also iterate over the request
object, as if over a dictionary of field names in the get1 and post1
dictionaries. In the case of overlap, the get1() dictionary takes
precedence.
- getpost( [name], [default], [ignoreCase] ):
Using given
parameters, return get() result if not None, otherwise return post() result
if not None, otherwise default.
- getpost1( [name], [default], [ignoreCase] ):
Using given
parameters, return get1() result if not None, otherwise return post1()
result if not None, otherwise default.
- postget( [name], [default], [ignoreCase] ):
Using given
parameters, return post() result if not None, otherwise return get() result
if not None, otherwise default.
- postget1( [name], [default], [ignoreCase] ):
Using given
parameters, return post1() result if not None, otherwise return get1()
result if not None, otherwise default.
- env( [name], [default] ):
Returns a dictionary with CGI-like
environment information of this request. If name is specified then a
single entry is returned if the parameter exists, otherwise default,
which defaults to None, if omitted.
- getHeader( [type] ):
Return a specific header sent by the
browser. If optional type is omitted, a dictionary of all headers is
returned.
- filename( [path] ):
Return the Spyce filename of the request
currently being processed. If an optional path parameter is provided,
then that path is made relative to the Spyce filename of the request
currently being processed.
- stack( [i] ):
Returns a stack of files processed by the
Spyce runtime. If i is provided, then a given frame is returned,
with negative numbers wrapping from the back as per Python convention.
The first (index zero) item on the stack is the filename
corresponding to the URL originally requested. The last (index -1) item
on the stack is the current filename being processed. Items are added
to the stack by includes,
Spyce lambdas, and
internal redirects.
- default( value, value2 ):
(convenience method) Return
value if it is not None, otherwise return value2.
The example below presents the results of all the method calls list above. Run
it to understand the information available.
examples/request.spy
|
<html><body>
Using the Spyce request object, we can obtain
information sent along with the request. The
table below shows some request methods and their
return values. Use the form below to post form
data via GET or POST. <br>
<hr>
[[-- input forms --]]
<form action="[[=request.uri('path')]]" method=get>
get: <input type=text name=name>
<input type=submit value=ok>
</form>
<form action="[[=request.uri('path')]]" method=post>
post: <input type=text name=name>
<input type=submit value=ok>
</form>
<hr>
[[-- tabulate response information --]]
<table border=1>
<tr>
<td><b>Method</b></td>
<td><b>Return value</b></td>
</tr>
[[ for method in ['uri()', 'uri("path")',
'uri("query")', 'method()','query()',
'get()','get1()', 'post()','post1()',
'getHeader()','env()', 'filename()']: {
]]
<tr>
<td valign=top>request.[[=method]]</td>
<td>[[=eval('request.%s' % method)]]</td>
</tr>
[[ } ]]
</table>
</body></html>
|
Run this code
|
Lastly, the following example shows how to deal with uploaded files.
examples/fileupload.spy
|
[[\
if request.post('ct'):
response.setContentType(request.post1('ct'))
if request.file('upfile')!=None:
response.write(request.file('upfile').value)
else:
print 'file not properly uploaded'
raise spyceDone
]]
<html><body>
Upload a file and it will be sent back to you.<br>
[[-- input forms --]]
<hr>
<table>
<form action="[[=request.uri('path')]]" method=post
enctype="multipart/form-data">
<tr>
<td>file:</td>
<td><input type=file name=upfile></td>
</tr><tr>
<td>content-type:</td>
<td><input type=text name=ct value="text/html"></td>
</tr><tr>
<td><input type=submit value=ok></td>
</tr>
</form>
</table>
</body></html>
|
Run this code
|
|