2009-07-11 1 views
1

Dans cet exemple de code l'URL de l'application semble être déterminé par cette ligne dans l'application:Main.py ou app.yaml détermine-t-il l'URL utilisée par la tâche périodique App Engine dans cet exemple?

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

mais aussi par cette ligne dans le gestionnaire d'application de app.yaml:

- url: /.* 
    script: main.py 

Cependant, l'URL de la tâche cron est définie par cette ligne:

url: /tasks/summary 

il semble donc l'utilitaire cron appellera « /tasks/summary » et en raison de l'application h andler, cela provoquera l'invocation de main.py. Est-ce que cela signifie que, pour autant que l'Cron concerne, la ligne dans l'application qui définit l'URL est étrangère:

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

. . . puisque la seule URL requise par la tâche cron est celle définie dans 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="[email protected]", 
       to="[email protected]", 
       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() 

Répondre

3

Vous pouvez le faire comme ceci:

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="[email protected]", 
         to="[email protected]", 
         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

On dirait que vous lisez this page (même si vous ne nous donnez pas l'URL). La configuration et le code tels que présentés ne fonctionneront pas correctement: la tâche cron essaiera de visiter l'URL path/tasks/summary, app.yaml fera exécuter execute.py, mais ce dernier n'établit qu'un gestionnaire pour/mailjob, donc La tentative de la tâche cron échouera avec un code d'état 404.

+0

contexte Assez a été fourni sans ajouter l'URL. Vous êtes grincheux et faites des histoires inutiles. –

+2

@David, l'URL aurait aidé - J'ai dû le localiser avec une recherche pour confirmer que le code & config il est en effet incomplète, donc la réponse à la question posée dans le titre est "ni ce main.py ni cette app.yaml définit quel code doit être exécuté pour servir cette URL "(c'est-à-dire, tel que présenté, cet ensemble de fichiers de code et de configuration ne fonctionnera pas correctement). –

Questions connexes