A Python3 replacement for the deprecated cgi module
Reason this release was yanked:
Superceded by later version
Project description
mycgi - A Python3 Replacement for the Deprecated cgi
Module
Other than using different class names (mycgi.Form
instead of cgi.FieldStorage
and mycgi.Field
instead of cgi.FieldStorage
) this module should be quite backward-compatible with the mycgi
module. Additionally, JSON-encoded PUT and POST requests are supported.
Note that this module depends on the python-multipart
package for handling POST and PUT requests that are not JSON-encoded.
Some Usage Examples
# Instead of:
#from cgi import FieldStorage
# Use:
from mycgi import Form
form = Form()
# name is a text input field:
name = form.getvalue('name') # this will be a list if the form has multiple 'name' fields
# or: name = form.getfirst('name')
# or: names = form.getlist('name')
# spreadsheet is a file input field:
fileitem = form['spreadsheet']
# The name of the uploaded file:
filename = fileitem.filename
# Get the file contents as bytes 3 different ways:
contents = fileitem.file.read()
contents = fileitem.value
contents = form.getvalue('spreadsheet')
Documentation
The initializer for the mycgi.Form
class is:
def __init__(self, environ=os.environ, fp=None, keep_blank_values=False):
"""
Initialize a Form instance.
Arguments (all are optional):
environ: environment dictionary
default: os.environ
fp: stream containing encoded POST and PUT data
default: None (in which case sys.stdin.buffer will be used for
POST and PUT requests)
keep_blank_values: flag indicating whether blank values in
percent-encoded forms should be treated as blank
strings.
default: False
"""
A mycgi.Form
instance is a specialized dictionary whose keys are the field names and whose values are either a mycgi.Field
instance or a list of these instances. A mycgi.Field
instance has the following attributes:
name
: The form field name.filename
: If this field is for an uploaded file, then the uploaded filename, else None.value
: The form field value (or an uploaded file's contents as bytes).file
: If the field value is a string or byte string,then a stream that can be read to get the field's value, else None.
The mycgi.Form
class supports the getvalue
, getlist
and getfirst
methods that behave identically to the like-named methods of the deprecated cgi.FieldStorage
class and which make it unnecessary to access the mycgi.Field
instances, although doing so can be useful for processing file uploads.
JSON-encoded PUT and POST requests
Also supported are POST and PUT requests where the data is a JSON-encoded dictionary.
WSGI Application Usage
To use mycgi.Form
with a WSGI application:
from mycgi import Form
def wsgiApp(environ, start_response):
form = Form(environ=environ, fp=environ['wsgi.input'])
...
Tests To Demonstrate mycgi
Usage
from mycgi import Form
import io
# Test a GET request:
form = Form(environ={'QUERY_STRING': 'x=1&x=2&y=3'})
assert form.getvalue('x') == ['1', '2']
assert form.getlist('x') == ['1', '2']
assert form.getfirst('x') == '1'
assert [field.filename for field in form['x']] == [None, None]
assert [field.value for field in form['x']] == ['1', '2']
assert [field.file.read() for field in form['x']] == ['1', '2']
assert form.getvalue('y') == '3'
assert form.getlist('y') == ['3']
assert form.getfirst('y') == '3'
assert form['y'].name == 'y'
assert form['y'].filename is None
assert form['y'].value == '3'
assert form['y'].file.read() == '3'
# Test a multipart POST request:
# We have here a text input field named 'act' whose value is 'abc' and two
# file input fields named 'the_file' where a file has been selected for only the
# first occurence:
# The following definition of fp is on a single line:
fp = io.BytesIO(b'------WebKitFormBoundarytQ0DkMXsDqxwxBlp\r\nContent-Disposition: form-data; name="act"\r\n\r\nTest\r\n------WebKitFormBoundarytQ0DkMXsDqxwxBlp\r\nContent-Disposition: form-data; name="the_file"; filename="test.txt"\r\nContent-Type: text/plain\r\n\r\nabc\r\n------WebKitFormBoundarytQ0DkMXsDqxwxBlp\r\nContent-Disposition: form-data; name="the_file"; filename=""\r\nContent-Type: application/octet-stream\r\n\r\n\r\n------WebKitFormBoundarytQ0DkMXsDqxwxBlp--\r\n')
environ = {
'CONTENT_LENGTH': '431',
'CONTENT_TYPE': 'multipart/form-data; boundary=----WebKitFormBoundarytQ0DkMXsDqxwxBlp',
}
form = Form(environ=environ, fp=fp)
assert form['act'].name == 'act'
assert form['act'].filename is None
assert form['act'].value == 'Test'
assert form['act'].file.read() == 'Test'
assert form['the_file'][0].name == 'the_file'
assert form['the_file'][0].filename == 'test.txt'
assert form['the_file'][0].value == b'abc'
assert form['the_file'][0].file.read() == b'abc'
assert form['the_file'][1].name == 'the_file'
assert form['the_file'][1].filename == ''
assert form['the_file'][1].value == b''
assert form['the_file'][1].file.read() == b''
assert form.getvalue('the_file') == [b'abc', b'']
# Test a JSON-encoded POST request:
fp = io.BytesIO(b'{"x": [1,2], "y": 3}')
environ = {
'CONTENT_LENGTH': '20',
'CONTENT_TYPE': 'application/json',
}
form = Form(environ=environ, fp=fp)
assert form.getvalue('x') == [1, 2]
assert form.getlist('x') == [1, 2]
assert form.getfirst('x') == 1
assert [field.filename for field in form['x']] == [None, None]
assert [field.value for field in form['x']] == [1, 2]
assert [field.file for field in form['x']] == [None, None]
assert form.getvalue('y') == 3
assert form.getlist('y') == [3]
assert form.getfirst('y') == 3
assert form['y'].name == 'y'
assert form['y'].filename is None
assert form['y'].value == 3
assert form['y'].file is None
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file mycgi-0.0.2.post2.tar.gz
.
File metadata
- Download URL: mycgi-0.0.2.post2.tar.gz
- Upload date:
- Size: 5.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.8.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 595960ef34d176e1cda94644ecc9ab1b90b93bec1aeb1028ab11567a8bbea7d8 |
|
MD5 | 2f76b6967c79adaedbbac1c91c423d83 |
|
BLAKE2b-256 | 9bfa15df711ac87e869762d8ea0f2f5a3221e37aaa5b9fad2fa0693e6a164fae |
Provenance
File details
Details for the file mycgi-0.0.2.post2-py3-none-any.whl
.
File metadata
- Download URL: mycgi-0.0.2.post2-py3-none-any.whl
- Upload date:
- Size: 7.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.8.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | acc1afa9a6e6012dbcdff6a68710acb0b01d2fb339e37c49be1cee19facb1870 |
|
MD5 | 04c035a7bcf1cf6dd96d14018248139b |
|
BLAKE2b-256 | d0ed457db8830e1cb6f4adcb04a382a605706cf962b81a5af0d2f7ced73dfb5c |