在谷歌应用程序引擎不工作的cron工作

问题描述:

我已经从这个google cloud tutorial烧瓶基本python 3教程网站,我能够设置和网站工作得很好。在谷歌应用程序引擎不工作的cron工作

另外,我还想运行一个python脚本,每天运行一次以收集一些数据,但cron作业不起作用。我还增加了登录:admin限制任何人直接使用该网址

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. 我做错了什么?任何帮助表示赞赏

您的app.yaml文件正在将标准环境Handlers元素混合到flexible environment configuration中,因此可能会忽略它。您可以在开发人员控制台中的应用程序日志中看到cron请求(尽管可能有错误)。

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

更新:

我可能不完全正确,我根据我的文档的答案,但我只注意到一些不一致的地方(我派了一些文档反馈给谷歌为它)。

灵活的环境Securing URLs for cron(这似乎大多来自the standard environment equivalent复制)提到了几个解决方案:

  • 一个确实根据的login: admin选项handler

您可以限制通过将login: admin添加到app.yaml中的处理程序 配置部分的URL。欲了解更多信息,请参阅 Securing URLs

handler没有在Configuring your App with app.yaml所提及Securing URLs指向一个不存在的标签。所以我不确定这是否确实有效。

  • 第二个是基于X-Appengine-Cron报头(与在标准环境):从Cron服务

请求还将包含一个HTTP标头:

X-Appengine-Cron: true 

X-Appengine-Cron标头由Google App Engine在内部设置。 如果您的请求处理程序发现此头文件,它可以相信 请求是一个cron请求。如果标题出现在对您的应用的外部 用户请求中,则会将其除去,除了登录到应用管理员的 的请求被允许为测试目的设置 标头。

但在Removed headers需提到的是:

  • X-Appengine-*

此外,符合下列图案 ,一些选定的报头被从请求中删除

目前尚不清楚这是否延伸至X-Appengine-Cron。值得一试。这是我在(基于标准环境,基于webapp2的)cron处理程序代码中的检查:

if self.request.headers.get('X-AppEngine-Cron') is None: 
     self.abort(403) # HTTPForbidden 
+0

谢谢丹。如果我把处理程序直接放在应用程序中,Cron可以正常工作。但我不希望外部世界称这个URL。这应该只能通过cron访问。任何想法如何限制? – user1251323

+1

感谢Dan的详细回复。我如前所述在头文件中使用X-app engine-cron进行了测试,但看起来它并未在灵活环境中与头部一起发送。我会用google打开一张票。 – user1251323

+0

我不知道现在发生了什么。但新项目的全新部署似乎与X-AppEngine-Cron解决方案一起工作。再次感谢你的帮助。 – user1251323