最近由于项目的需要,开始研究web.py框架的使用。在开发的过程中,遇到一些问题,就把解决的办法记录下来。
项目中有一个登陆接口,即login。而当验证用户名和密码正确之后,需要用session来记录用户的合法性,而web.py.3中没有内置session ,因此下载flup并安装,可以使用flup模块中的session。
在文件上传模块中,在windows环境下当文件大小大过10M时就会抛出Memory error 或timeout异常,自己在查看源代码之后,感觉是在webapi.py的input函数中调用cgi.FieldStorage()的问题。自己动手修改了input函数如下:
def input(*requireds, **defaults):
"""
Returns a `storage` object with the GET and POST arguments.
See `storify` for how `requireds` and `defaults` work.
"""
from cStringIO import StringIO
def dictify(fs): return dict([(k, fs[k]) for k in fs.keys()])
_method = defaults.pop('_method', 'both')
e = ctx.env.copy()
a = b = {}
if _method.lower() in ['both', 'post']:
if e['REQUEST_METHOD'] == 'POST':
if 'CONTENT_TYPE' in e.keys( ):
ctype, pdict = cgi.parse_header(e['CONTENT_TYPE'])
if ctype == 'multipart/form-data':
a = webcgi.parse_multipart(e['wsgi.input'], pdict)
elif ctype == 'application/x-www-form-urlencoded':
a = cgi.FieldStorage(fp=StringIO(data()), environ=e,keep_blank_values=1)
if not 'CONTENT_TYPE' in e.keys( ):
a = cgi.FieldStorage(fp=StringIO(data()), environ=e,keep_blank_values=1)
a = dictify(a)
修改之后,不再抛出异常,但是会出现丢包现象。就到cgi.py里面把parse_multipart()函数中修改代码如下:
while 1:
line = fp.readline()
if not line:
terminator = lastpart # End outer loop
break
if line[:2] == "--":
terminator = line.strip()
if terminator in (nextpart, lastpart):
break
time.sleep(0.00005) #此处为自己添加的。
lines.append(line)
现在上传的问题解决了,但是具体原因还是不太明白,也不知道这样改对不对,但是至少它可以解决目前的问题。
转载请注明出处。
作者:lf8289
地址: