Google App Engine Python Cron - PullRequest
       7

Google App Engine Python Cron

3 голосов
/ 10 мая 2011

Я уже несколько дней пытаюсь заставить Google App Engine запустить скрипт cron Python, который просто выполнит скрипт, размещенный на моем сервере.

Не нужно публиковать какие-либо данные на странице, просто откройте соединение, дождитесь его завершения и напишите мне.

Код, который я ранее написал, был отмечен как «успешный», но я так и не получил электронное письмо и не увидел ни одного кода logging.info, который я добавил для проверки.

Идеи

Оригинальный и неправильный код, который я изначально написал, можно найти по адресу Google AppEngine Python Cron для задания urllib - просто чтобы вы знали, что я пытался сделать это раньше.

1 Ответ

4 голосов
/ 10 мая 2011

Здесь происходило множество странных вещей.

Во-первых, app.yaml Мне пришлось разместить обработчик /cron до того, как был установлен корень:

handlers:
- url: /cron
  script: assets/backup/main.py

- url: /
  static_files: assets/index.html
  upload: assets/index.html

В противном случае я получу сумасшедшие ошибки из-за невозможности найти файл. Этот бит на самом деле имеет смысл.

Следующим битом был код Python. Не уверен, что здесь происходит, но, в конце концов, мне удалось заставить его работать так:

#!/usr/bin/env python  
# import logging
from google.appengine.ext import webapp
from google.appengine.api import mail
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import urlfetch

import logging

class CronMailer(webapp.RequestHandler):
    def get(self):
        logging.info("Backups: Started!")
        urlStr = "http://example.com/file.php"

        rpc = urlfetch.create_rpc()
        urlfetch.make_fetch_call(rpc, urlStr)
        mail.send_mail(sender="example@example.com",
            to="email@example.co.uk",
            subject="Backups complete!",
            body="Daily backups have been completed!")
        logging.info("Backups: Finished!")

application = webapp.WSGIApplication([('/cron', CronMailer)],debug=True)
def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

Что бы это ни вызывало проблемы, теперь оно исправлено.

...