получение TypeError, «не индексируется» при выполнении if self.request.POST[‘file’] внутри метода post webapp2.RequestHandler

#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>

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:
  

но я продолжаю получать эту ошибку:

 if file and file.type and file.value:
  File "C:Python25libcgi.py", line 633, in __len__
    return len(self.keys())
  File "C:Python25libcgi.py", line 609, in keys
    raise TypeError, "not indexable"
  

забавно, что раньше это работало! что здесь не так? обратите внимание, я использую webapp2.
введите описание изображения здесь

также на этой странице говорится: Экземпляр FieldStorage может быть проиндексирован как словарь Python. Это позволяет проверять членство с помощью оператора in, а также поддерживает стандартный словарный метод keys() и встроенную функцию len()

полная трассировка стека:

 Traceback (most recent call last):
  File "C:Program FilesGooglegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 3858, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "C:Program FilesGooglegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 3792, in _Dispatch
    base_env_dict=env_dict)
  File "C:Program FilesGooglegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 580, in Dispatch
    base_env_dict=base_env_dict)
  File "C:Program FilesGooglegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 2918, in Dispatch
    self._module_dict)
  File "C:Program FilesGooglegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 2822, in ExecuteCGI
    reset_modules = exec_script(handler_path, cgi_path, hook)
  File "C:Program FilesGooglegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 2704, in ExecuteOrImportScript
    script_module.main()
  File "C:myprojectmain.py", line 16, in main
    run_wsgi_app(application)
  File "C:Program FilesGooglegoogle_appenginegoogleappengineextwebapputil.py", line 98, in run_wsgi_app
    run_bare_wsgi_app(add_wsgi_middleware(application))
  File "C:Program FilesGooglegoogle_appenginegoogleappengineextwebapputil.py", line 116, in run_bare_wsgi_app
    result = application(env, _start_response)
  File "C:myprojectwebapp2__init__.py", line 1053, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:myprojectwebapp2__init__.py", line 1098, in wsgi_app
    self.handle_exception(request, response, e)
  File "C:myprojectwebapp2__init__.py", line 1092, in wsgi_app
    self.router.dispatch(self, request, response, match)
  File "C:myprojectwebapp2__init__.py", line 949, in dispatch
    handler.handle_exception(e, app.debug)
  File "C:myprojectwebapp2__init__.py", line 942, in dispatch
    getattr(handler, method)(*args)
  File "C:myprojectpydecorators.py", line 15, in decorated
    return _login_required (self) or func(self, *args, **kwargs)
  File "C:myprojectpydocument.py", line 42, in post
    if file and file.type and file.value:
  File "C:Python25libcgi.py", line 633, in __len__
    return len(self.keys())
  File "C:Python25libcgi.py", line 609, in keys
    raise TypeError, "not indexable"
TypeError: not indexable
  

способ, которым я это исправил, — вырвать if file: и вместо этого проверить, является ли self.request.POST имеет ключ ‘file’ с использованием метода python has_key

Комментарии:

1. Не могли бы вы, пожалуйста, включить всю трассировку стека?

2. У меня такая же проблема в webapp2 в GAE с использованием wtforms, когда я вызываю form.validate() при загрузке файла. По какой-то причине свойство list cgi. Значение FieldStorage равно None, что приводит к тому, что метод keys выдает ошибку типа. Когда я создаю его экземпляр из чистой оболочки, для списка установлено значение [], так что все в порядке. У меня нет времени изучать это подробнее сегодня, но, возможно, через день или два я смогу это определить.

Ответ №1:

Я не вижу достаточно данных в вашем фрагменте кода или трассировке вашего стека, чтобы определить, откуда исходит ошибка. Вместо этого, вот полный рабочий пример загрузки:

http://blog.notdot.net/2009/9/Handling-file-uploads-in-App-Engine

Комментарии:

1. это сообщение, на котором основан мой код. я выполняю file = self.request. ОПУБЛИКУЙТЕ [‘file’], как в том сообщении, за которым следует if file: test, и именно здесь происходит исключение. я потратил на это довольно много часов. И, как я уже сказал, этот код работал раньше.

2. Прикрепите фактическую трассировку стека.