谷歌应用引擎中的 cron 工作不起作用

use*_*323 5 google-app-engine app.yaml google-cloud-platform

我从这个谷歌云教程中获取了flask上的基本python 3教程网站,我能够设置它并且该网站运行良好。

另外,我还想运行一个每天运行的python脚本来收集一些数据,但是cron作业不起作用。我还添加了 login: admin 以限制任何人直接使用该 url

cron.yaml

cron:
- description: test dispatch vs target
  url: /cronapp
  schedule: every 5 hours
Run Code Online (Sandbox Code Playgroud)

应用程序.yaml

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

runtime_config:
  python_version: 3

handlers:
- url: /cronapp
  script: cronapp.py
  login: admin
Run Code Online (Sandbox Code Playgroud)

我将其称为http://myproject.appspot.com/cronapp也不起作用并返回 404。我做错了什么?任何帮助表示赞赏

Dan*_*scu 4

您的 app.yaml 文件将标准环境Handlers元素混合到灵活的环境配置中,因此它可能会被忽略。您可能可以在开发者控制台的应用程序日志中看到 cron 请求(不过可能有错误)。

您需要/cronapp 在应用程序代码内部添加处理程序,而不是在app.yaml. 不完全确定你如何做到这一点(我仍然只使用标准环境),这取决于你的应用程序和/或其框架。查看烧瓶示例的Hello World 代码审查。

更新:

我可能不完全正确,我的答案是基于文档的,但我只是注意到一些不一致的地方(我向谷歌发送了一些文档反馈)。

灵活的环境Securing URLs for cron(看起来大部分是从标准环境等效项复制的)提到了几个解决方案:

  • 确实基于login: admin以下选项handler

login: admin您可以通过添加到 中的处理程序配置部分来限制 URL app.yaml。有关详细信息,请参阅 保护 URL

但在使用 app.yaml 配置您的应用程序handler中并未提及,并且安全 URL指向不存在的标签。所以我不确定这是否确实有效。

  • 第二个基于X-Appengine-Cron标头(与标准环境中相同):

来自 Cron 服务的请求还将包含 HTTP 标头:

X-Appengine-Cron: true
Run Code Online (Sandbox Code Playgroud)

X-Appengine-Cron头由 Google App Engine 内部设置。如果您的请求处理程序找到此标头,它可以相信该请求是 cron 请求。如果标头存在于对您的应用程序的外部用户请求中,则会将其删除,但来自应用程序登录管理员的请求除外,他们可以出于测试目的设置标头。

但在“已删除的标头”中提到:

此外,一些与以下模式匹配的选定标头将从请求中删除:

  • X-Appengine-*

目前还不清楚这X-Appengine-Cron是否会延续到。值得一试。这是我检查(标准环境,基于 webapp2) cron 处理程序代码:

    if self.request.headers.get('X-AppEngine-Cron') is None:
        self.abort(403)  # HTTPForbidden
Run Code Online (Sandbox Code Playgroud)