Google app engine 获取TypeError,";“不可转位”;在webapp2.RequestHandler的POST方法内执行if self.request.POST[';file';]时

Google app engine 获取TypeError,";“不可转位”;在webapp2.RequestHandler的POST方法内执行if self.request.POST[';file';]时,google-app-engine,webapp2,Google App Engine,Webapp2,我正在尝试使用以下代码上载文件: <form id="form1" action="convert" enctype="multipart/form-data" method="post"> <input type="file" name="file"/> <div><input id="submit_button" type="submit" value="Upload"/></div> </form>

我正在尝试使用以下代码上载文件:

<form id="form1" action="convert" enctype="multipart/form-data" method="post">
    <input type="file" name="file"/>
    <div><input id="submit_button" type="submit" value="Upload"/></div>
</form>

class Convert(RequestHandler):
    @login_required
    def post(self):
        session = Session(writer="cookie", session_expire_time = 3600, set_cookie_expires = True)
        if session['id']:
            file = self.request.POST['file']
            if file and file.type and file.value:
有趣的是,这以前是有用的!这里怎么了?注意,我使用的是webapp2。

佩奇还说:FieldStorage实例可以像Python字典一样编制索引。它允许使用in运算符进行成员资格测试,还支持标准字典方法keys()和内置函数len()

完整堆栈跟踪:

Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3858, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3792, in _Dispatch
    base_env_dict=env_dict)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 580, in Dispatch
    base_env_dict=base_env_dict)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2918, in Dispatch
    self._module_dict)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2822, in ExecuteCGI
    reset_modules = exec_script(handler_path, cgi_path, hook)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2704, in ExecuteOrImportScript
    script_module.main()
  File "C:\myproject\main.py", line 16, in main
    run_wsgi_app(application)
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\util.py", line 98, in run_wsgi_app
    run_bare_wsgi_app(add_wsgi_middleware(application))
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\util.py", line 116, in run_bare_wsgi_app
    result = application(env, _start_response)
  File "C:\myproject\webapp2\__init__.py", line 1053, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\myproject\webapp2\__init__.py", line 1098, in wsgi_app
    self.handle_exception(request, response, e)
  File "C:\myproject\webapp2\__init__.py", line 1092, in wsgi_app
    self.router.dispatch(self, request, response, match)
  File "C:\myproject\webapp2\__init__.py", line 949, in dispatch
    handler.handle_exception(e, app.debug)
  File "C:\myproject\webapp2\__init__.py", line 942, in dispatch
    getattr(handler, method)(*args)
  File "C:\myproject\py\decorators.py", line 15, in decorated
    return _login_required (self) or func(self, *args, **kwargs)
  File "C:\myproject\py\document.py", line 42, in post
    if file and file.type and file.value:
  File "C:\Python25\lib\cgi.py", line 633, in __len__
    return len(self.keys())
  File "C:\Python25\lib\cgi.py", line 609, in keys
    raise TypeError, "not indexable"
TypeError: not indexable

我修复它的方法是删除
if file:
,然后使用python的has_key方法检查self.request.POST是否有key“file”

我在代码片段或堆栈跟踪中没有看到足够的数据来告诉错误的来源。作为替代,这里有一个完整的工作上传示例:


这就是我的代码所基于的帖子。我正在做file=self.request.POST['file'],后面跟着一个if-file:test,这就是异常发生的地方。我在这上面花了好几个小时。正如我所说的,这段代码以前是有效的。附加实际的堆栈跟踪。你能包含整个堆栈跟踪吗?我在使用wtforms调用form.validate()并上载文件时,在GAE上的webapp2中遇到了同样的问题。出于某种原因,cgi.FieldStorage的list属性为None,这会导致keys方法引发TypeError。当我从一个干净的shell列表实例化它时,它被设置为[],所以它是ok的。我今天没有时间进一步调查,但也许一两天后我就能确定下来。
Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3858, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3792, in _Dispatch
    base_env_dict=env_dict)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 580, in Dispatch
    base_env_dict=base_env_dict)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2918, in Dispatch
    self._module_dict)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2822, in ExecuteCGI
    reset_modules = exec_script(handler_path, cgi_path, hook)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2704, in ExecuteOrImportScript
    script_module.main()
  File "C:\myproject\main.py", line 16, in main
    run_wsgi_app(application)
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\util.py", line 98, in run_wsgi_app
    run_bare_wsgi_app(add_wsgi_middleware(application))
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\util.py", line 116, in run_bare_wsgi_app
    result = application(env, _start_response)
  File "C:\myproject\webapp2\__init__.py", line 1053, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\myproject\webapp2\__init__.py", line 1098, in wsgi_app
    self.handle_exception(request, response, e)
  File "C:\myproject\webapp2\__init__.py", line 1092, in wsgi_app
    self.router.dispatch(self, request, response, match)
  File "C:\myproject\webapp2\__init__.py", line 949, in dispatch
    handler.handle_exception(e, app.debug)
  File "C:\myproject\webapp2\__init__.py", line 942, in dispatch
    getattr(handler, method)(*args)
  File "C:\myproject\py\decorators.py", line 15, in decorated
    return _login_required (self) or func(self, *args, **kwargs)
  File "C:\myproject\py\document.py", line 42, in post
    if file and file.type and file.value:
  File "C:\Python25\lib\cgi.py", line 633, in __len__
    return len(self.keys())
  File "C:\Python25\lib\cgi.py", line 609, in keys
    raise TypeError, "not indexable"
TypeError: not indexable