2017-07-28 167 views
2

我已經從這個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. 我做錯了什麼?任何幫助表示讚賞

回答

2

您的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

相關問題