Работа cron в движке приложений Google не работает

Я взял веб-сайт с базовым учебным курсом по python 3 на flask из этого руководства по облаку Google и я могу это настроить, и веб-сайт работает нормально.

Кроме того, я также хотел запустить скрипт python, который запускается каждый день для сбора некоторых данных, но задание cron просто не работает. Я также добавил логин: администратор, чтобы запретить кому-либо напрямую использовать этот URL

cron.yaml

cron:
- description: test dispatch vs target
  url: /cronapp
  schedule: every 5 hours

app.yaml

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
  python_version: 3

handlers:
- url: /cronapp
  script: cronapp.py
  login: admin

Я называю это, поскольку http://myproject.appspot.com/cronapp также не работает и возвращает а 404. что я делаю не так? приветствуется любая помощь


person user1251323    schedule 28.07.2017    source источник


Ответы (1)


Ваш файл app.yaml смешивает стандартные обработчики в гибкую конфигурацию среды, поэтому, вероятно, его игнорируют. Вы, вероятно, можете увидеть запросы cron в журналах приложения в консоли разработчика (хотя, вероятно, с ошибками).

Вам нужно добавить обработчик для /cronapp внутри кода вашего приложения, а не в app.yaml. Не совсем уверен, как вы это делаете (я все еще использую только стандартную среду), это зависит от вашего приложения и / или его фреймворка. Взгляните на обзор кода Hello World для фляги. пример.

Обновление:

Возможно, я не совсем прав, я основывал свой ответ на документации, но я просто заметил некоторые несоответствия (я отправил некоторые отзывы о документации в Google по этому поводу).

Гибкая среда Защита URL-адресов для cron (который в основном скопирован из эквивалента стандартной среды) упоминает несколько решений:

  • один действительно основан на опции login: admin для handler:

Вы можете ограничить URL, добавив login: admin в раздел конфигурации обработчика в app.yaml. Для получения дополнительной информации см. Защита URL-адресов.

Но handler не упоминается в настройке ваше приложение с app.yaml и Защита URL-адресов указывает на несуществующий тег. Так что я не уверен, действительно ли это работает или нет.

  • второй основан на заголовке X-Appengine-Cron (как и в стандартной среде):

Запросы от службы Cron также будут содержать заголовок HTTP:

X-Appengine-Cron: true

Заголовок X-Appengine-Cron устанавливается внутри Google App Engine. Если ваш обработчик запросов находит этот заголовок, он может доверять тому, что запрос является запросом cron. Если заголовок присутствует в запросе внешнего пользователя к вашему приложению, он удаляется, за исключением запросов от зарегистрированных администраторов приложения, которым разрешено устанавливать заголовок для целей тестирования.

Но в удаленных заголовках это упомянул, что:

Кроме того, из запроса удаляются некоторые выбранные заголовки, соответствующие следующему шаблону:

  • X-Appengine-*

Неясно, распространяется ли это на X-Appengine-Cron или нет. Стоит попробовать. Это моя проверка в (стандартном env, на основе webapp2) коде обработчика cron:

    if self.request.headers.get('X-AppEngine-Cron') is None:
        self.abort(403)  # HTTPForbidden
person Dan Cornilescu    schedule 28.07.2017
comment
Спасибо, Дэн. Cron отлично работает, если я помещаю обработчик прямо в приложение. Но я не хочу, чтобы внешний мир называл этот URL. Это должно быть доступно только через cron. Есть идеи, как это ограничить? - person user1251323; 28.07.2017
comment
Спасибо Дэну за подробный ответ. Я тестировал X-app engine-cron в заголовках, как вы сказали, но похоже, что он не отправляется с заголовком в гибкой среде. Открою тикет с гуглом. - person user1251323; 29.07.2017
comment
Я не уверен, что случилось сейчас. но новое развертывание в новом новом проекте, похоже, сработало с решением X-AppEngine-Cron. В очередной раз благодарим за помощь. - person user1251323; 29.07.2017