Определяет ли main.py или app.yaml URL-адрес, используемый задачей cron App Engine в этом примере? - PullRequest
1 голос
/ 12 июля 2009

В этом примере кода URL приложения определяется этой строкой в ​​приложении:

application = webapp.WSGIApplication([('/mailjob', MailJob)], debug=True)

но также этой строкой в ​​обработчике приложения app.yaml:

- url: /.*
  script: main.py

Однако URL-адрес задачи cron задается этой строкой:

url: /tasks/summary

Так что, похоже, утилита cron вызовет "/tasks/summary" и из-за обработчика приложения это вызовет main.py. Означает ли это, что с точки зрения cron строка в приложении, которая задает URL, является посторонней:

application = webapp.WSGIApplication([('/mailjob', MailJob)], debug=True)

. , , поскольку для задачи cron нужен только один URL-адрес, определенный в app.yaml.

app.yaml
application: yourappname
version: 1
runtime: python
api_version: 1

handlers:

- url: /.*
  script: main.py

cron.yaml
cron:
    - description: daily mailing job
    url: /tasks/summary
    schedule: every 24 hours

main.py
#!/usr/bin/env python  

import cgi
from google.appengine.ext import webapp
from google.appengine.api import mail
from google.appengine.api import urlfetch 

class MailJob(webapp.RequestHandler):
    def get(self):

        # Call your website using URL Fetch service ...
        url = "http://www.yoursite.com/page_or_service"
        result = urlfetch.fetch(url)

        if result.status_code == 200:
            doSomethingWithResult(result.content)

        # Send emails using Mail service ...
        mail.send_mail(sender="admin@gmail.com",
                to="someone@gmail.com",
                subject="Your account on YourSite.com has expired",
                body="Bla bla bla ...")
        return

application = webapp.WSGIApplication([
        ('/mailjob', MailJob)], debug=True)

def main():
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
    main()

Ответы [ 2 ]

3 голосов
/ 12 июля 2009

Вы можете сделать это так:

app.yaml
application: yourappname
version: 1
runtime: python
api_version: 1

handlers:

- url: /tasks/.*
  script: main.py

cron.yaml
cron:
    - description: daily mailing job
    url: /tasks/summary
    schedule: every 24 hours

main.py
#!/usr/bin/env python  

import cgi
from google.appengine.ext import webapp
from google.appengine.api import mail
from google.appengine.api import urlfetch 

class MailJob(webapp.RequestHandler):
    def get(self):

        # Call your website using URL Fetch service ...
        url = "http://www.yoursite.com/page_or_service"
        result = urlfetch.fetch(url)

        if result.status_code == 200:
                doSomethingWithResult(result.content)

        # Send emails using Mail service ...
        mail.send_mail(sender="admin@gmail.com",
                        to="someone@gmail.com",
                        subject="Your account on YourSite.com has expired",
                        body="Bla bla bla ...")
        return

application = webapp.WSGIApplication([
        ('/tasks/summary', MailJob)], debug=True)

def main():
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
    main()
1 голос
/ 12 июля 2009

Похоже, вы читаете эту страницу (даже если вы не указали нам URL). Представленная конфигурация и код не будут работать успешно: задача cron попытается посетить путь URL / tasks / summary, app.yaml выполнит этот файл main.py, но последний настроит только обработчик для / mailjob, поэтому попытка задачи cron завершится неудачно с кодом состояния 404.

...