原创-web.py开发

来源:互联网 发布:淘宝新势力周是干嘛的 编辑:程序博客网 时间:2024/04/29 12:30

    最近由于项目的需要,开始研究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

地址:

原创粉丝点击