This group is for discussion of mod_wsgi, the Apache module which supports WSGI. The group is not really for talking about WSGI in itself. If you are after general WSGI or Python programming help, you would be better off going to:
http://groups.google.com/group/comp.lang.python/topics?lnk That said, why are you doing forms processing yourself. Why aren't you using the FieldStorage class from Python cgi module. Although in cgi module it can still be used in WSGI application. The standard FieldStorage class is likely to be more correct than your short version and would better deal with large uploads as it pushes file uploads into a file on the file system. You still may need to wrap it to implement file upload size limits. Graham 2009/1/4 Dutov Anton <[email protected]>: > > it is simple wsgi application handles GET and POST methods > but i think someone can optimize algorithm for lesser code > > #!/usr/bin/env python > """ > (c) Anton Dutov > WSGI example python 2.5.2 > """ > > import os ,re, time, cgi, StringIO > from wsgiref.simple_server import make_server > > #============================================================================== > # Maximum line length for reading. (64KB) > # Fixes memory error when upload large files such as 700+MB ISOs. > readBlockSize = 65368 > #============================================================================== > > class WSGIReturn(Exception): > def __init__(self, value): > self.value = value > > > MAX_SIZE_POST = 2000000 > def test_wsgi_app(env, response): > GET = {} > POST = {} > FILES = {} > headers = {'Content-Type':'text/html; charset=UTF-8'} > try: > # Parsing query sting as GET > for name, value in cgi.parse_qsl( env['QUERY_STRING'], True): > GET[ name ] = value > # If current method not POST > if env['REQUEST_METHOD'] != 'POST': > raise WSGIReturn('200 OK') > try: cLen = int( env['CONTENT_LENGTH'] ) > except: > raise WSGIReturn('411 Length Required') > if cLen > MAX_SIZE_POST: > raise WSGIReturn('413 Request Entity Too Large') > > cType, cTypeOpt = cgi.parse_header( env.get('CONTENT_TYPE', > 'application/x-www-form-urlencoded') ) > if cType.startswith("application/x-www-form-urlencoded"): > for name, value in cgi.parse_qsl( env['wsgi.input'].read > ( cLen ), True): > POST[ name ] = value > raise WSGIReturn('200 OK') > if not cType.startswith("multipart/"): raise WSGIReturn('501 > Not Implemented') > if 'boundary' not in cTypeOpt: raise WSGIReturn('400 > Bad Request') > > iBnd = re.compile("--" + re.escape( cTypeOpt['boundary'] ) + > "(--)?\r?\n") > iSock = env['wsgi.input'] > iEnd = False > iHead = {} > iData = None > pLine = '' > tFile = '' > while not iEnd: > iLine = iSock.readline( readBlockSize ) > iMatch = iBnd.match(iLine) > if (not iLine) or iMatch: > if iData: > iData.write( pLine[-2:]=='\r\n' and pLine[:-2] or > pLine[-1:]=='\n' and pLine[:-1]) > dSize = iData.tell() > iData.seek(0) > iName = iHead['Content-Disposition'][1]['name'] > if 'filename' in iHead['Content-Disposition'] > [1].keys(): > fName = iHead['Content-Disposition'][1] > ['filename'] > cType = iHead['Content-Type'][0] > FILES[ iName ] = { 'filename': fName, > 'tmp_name': tFile, 'type': cType, 'size': dSize} > else: > POST[ iName ] = iData.read() > iData.close() > iHead = {} > iData = None > pLine = '' > iEnd = (not iLine) or (iMatch.group(1) is not None) > continue > if iData: > iData.write( pLine ) > pLine = iLine > continue > if iLine not in ('\n','\r\n'): > h, v = iLine.split(":", 1) > iHead[ h.strip() ] = cgi.parse_header( v ) > continue > elif len(iHead.keys()) == 0: > continue > tFile = '/tmp/wsgi_tmp_%.07f' % time.time() > if 'filename' in iHead['Content-Disposition'][1].keys()\ > and iHead['Content-Disposition'][1]['filename']: > iData = open( tFile, 'w+b') > else: > iData = StringIO.StringIO() > raise WSGIReturn('200 OK') > except WSGIReturn, e: > response( e.value, headers.items() ) > yield ''' > Simple Form: > <form method="post"> > <input name="test_note" type="text"> > <input type="submit"> > </form>''' > yield ''' > File form > <form enctype="multipart/form-data" method="post"> > <input name="test_file" type="file"> > <input name="test_note" type="text"> > <input type="submit"> > </form>''' > yield '<h1>%s</h1><br>' % e.value > yield '<b>GET</b><hr>%s<hr>' % str(GET) > yield '<b>POST</b><hr>%s<hr>' % str(POST) > yield '<b>FILES</b><hr>%s<hr>' % str(FILES) > > httpd = make_server('', 8000, test_wsgi_app ) > httpd.serve_forever() > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "modwsgi" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/modwsgi?hl=en -~----------~----~----~----~------~----~------~--~---
