Как перенести мой app.yaml на 2.7?

#python #google-app-engine #python-2.7 #yaml

# #python #google-app-engine #python-2.7 #yaml

Вопрос:

Я переношу свое приложение gae на python 2.7. Это мое новое приложение.yaml:

 application: webfaze
version: main
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /mapreduce(/.*)?
  script: mapreduce/main.application

- url: /(.*.(html|css|js|gif|jpg|png|ico|swf))
  static_files: static/1
  upload: static/.*
  expiration: "1d"

- url: .*
  script: main.application

- url: /task/.*
  script: main.application
  login: admin
 

Но я получаю это сообщение об ошибке:

 Error parsing yaml file:
Invalid object:
threadsafe cannot be enabled with CGI handler: mapreduce/main.application
  in "webfaze/app.yaml", line 22, column 1
 

Можете ли вы сказать мне, как устранить ошибку?

Ответ №1:

Проверяя исходный код, похоже, что вам нужно определить путь ваших обработчиков без какой-либо косой черты:

    if (handler.script and (handler.script.endswith('.py') or 
       '/' in handler.script)):
       raise appinfo_errors.ThreadsafeWithCgiHandler(
                    'threadsafe cannot be enabled with CGI handler: %s' %
                    handler.script)
 

Перейдите application.py в корень вашего проекта и соответствующим образом измените путь обработчика.

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

1. Спасибо, это правда, что я мог бы просто опустить часть mapreduce, поскольку в данный момент я ее не использую. Теперь обновление прошло проверку синтаксиса, и мне любопытно посмотреть, что произошло теперь, когда я только что запустил set_default_version

2. Или назовите его mapreduce.main.application .

3. Спасибо @Nick Johnson за полное решение. Я мог бы перенести все приложение на python 2.7 без особых усилий 🙂

4. У меня все еще были проблемы с именованием mapreduce.main.application после поиска в Интернете, я нашел script: google.appengine.ext.mapreduce.main.APP from: groups.google.com/forum/?fromgroups #!тема/google-appengine/…

Ответ №2:

Изменить:

 - url: /mapreduce(/.*)?
  script: mapreduce/main.application
 

Для:

 - url: /mapreduce(/.*)?
  script: mapreduce.main.application
 

Вам также может потребоваться добавить __init__.py в папку ‘mapreduce’, если она там еще не существует. Это заставит python интерпретировать папку как модуль.

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

1. Я попробовал последнюю версию, и, похоже, она менялась от приложения к приложению

2. @wonglik По «последней версии», какая это будет версия. Я запускаю версию 1.7.0 SDK и меняю «application» на «app», что выдает ошибку 500 (Server).

3. Извините. Я имел в виду последнюю версию пакета MapReduce — 1.6.2, взятую отсюда developers.google.com/appengine/downloads

4. @wonglik Возможно, это изменится, чтобы соответствовать другим версиям, как только они будут обновлены. Согласно developers.google.com/appengine/docs/python/dataprocessing /… пакет MapReduce по-прежнему считается экспериментальным.

5. Я обнаружил, что вам также необходимо внести аналогичные изменения в mapreduce / include.yaml