Python & GAE - анализ типа аргумента StringType write () - PullRequest
0 голосов
/ 11 декабря 2018

При запуске dev_appserver.py . я получаю следующую ошибку при попытке доступа к http://localhost:8080:

Traceback (most recent call last):
  File "/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 86, in run
    self.finish_response()
  File "/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 128, in finish_response
    self.write(data)
  File "/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions 2.7/lib/python2.7/wsgiref/handlers.py", line 204, in write
    assert type(data) is StringType,"write() argument must be string"
AssertionError: write() argument must be string

Я искал и, кажется, возвращается в мой файл app.yaml, в соответствии с этимиссылки:

Я просто не знаю, как отладить его.Ниже мой файл app.yaml и мой файл main.py.Я новичок в платформе GAE, и любая помощь будет оценена.

файл app.yaml:

application: gqtimer
version: 1-56
runtime: python27
api_version: 1
threadsafe: false

handlers:
- url: /favicon.ico
  static_files: static/images/favicon.ico
  upload: static/images/favicon.ico

- url: /_ah/login_required
  script: main.py

- url: /static
  static_dir: static

- url: /player.*
  script: main.py
  login: required

- url: /stat.*
  script: main.py
  login: required

- url: .*
  script: main.py

libraries:
- name: django
  version: "1.11"

файл main.py:

#!/usr/bin/env python
#

import config
import os
import sys

# Force sys.path to have our own directory first, so we can import from it.
sys.path.insert(0, config.APP_ROOT_DIR)
sys.path.insert(1, os.path.join(config.APP_ROOT_DIR, 'externals'))
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"


import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.dist import use_library

use_library('django', '1.2')


from handlers import error, timer, do_openid_login


def main():

    application = webapp.WSGIApplication([('/', timer.ExportHandler),
        ('/_ah/login_required', do_openid_login.OpenIdLoginHandler),
        ('/player/([-\w]+)', timer.PlayerHandler),
        ('/player/([-\w]+)/archives', timer.ArchivesHandler),
        ('/stat/([-\w]+)', timer.StatHandler),
        ('/stat/([-\w]+)/delete', timer.StatDeleteHandler),                                          
        # If we make it this far then the page we are looking
        # for does not exist
        ('/.*', error.Error404Handler),
        ],
        debug=True)
    wsgiref.handlers.CGIHandler().run(application)


    if __name__ == '__main__':
        main()

1 Ответ

0 голосов
/ 12 декабря 2018

Действительно, ваш app.yaml файл может неправильно отображать код вашего приложения.Вам необходимо:

  • взять переменную application вне функции main(), чтобы она стала глобальной переменной в модуле main.py (и, возможно, также переименовать ее в app- просто чтобы оставаться в курсе официальных соглашений и примеров документации)
  • замените script: main.py утверждения из ваших app.yaml handlers на main.application (или main.app, если переименовано, как упомянуто выше)- это ссылка на вышеупомянутую глобальную переменную.Из строки script в элементе Handlers таблица:

A script : директива должна быть путем импорта Python, например, package.module.app , указывающий на приложение WSGI.Последний компонент директивы script : с использованием Python module path - это имя глобальной переменной в модуле: эта переменная должна быть приложением WSGI и обычно называется app по соглашению.

Я бы также рекомендовал явно передавать app.yaml в качестве аргумента dev_appserver.py вместо каталога приложения (. в вашем случае) - иногдаавтоопределение работает не так, как ожидалось.Это также единственный способ запустить несколько служб и / или использовать файл dispatch.yaml для маршрутизации, так что это хорошая привычка.

...