Задание Cron не выполняется с appengine

#python #facebook #google-app-engine #cron

#python #Facebook #google-app-engine #cron

Вопрос:

В appengine я создал задание cron, которое выполняется через 2 минуты с интервалом и публикует некоторые данные на моей стене Facebook.

Но через каждые две минуты, когда я вижу журналы в appengine, он показывает мне следующие строки ,

 This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.
  

И на моей стене Facebook ничего не опубликовано.

Но когда я вручную выполняю URL задания cron (нажимая непосредственно в браузере), приложение публикует что-то на моей стене.

Вот мой app.yaml ,

 application: thisisreallyappname
version: 1
runtime: python27
api_version: 1
threadsafe: yes

builtins:
- remote_api: on

inbound_services:
- warmup

libraries:
- name: django
  version: latest

handlers:
- url: /_ah/queue/deferred
  script: djangoappengine.deferred.handler.application
  login: admin

- url: /_ah/stats/.*
  script: djangoappengine.appstats.application

- url: /media/admin
  static_dir: django/contrib/admin/media
  expiration: '0'

- url: /static/admin
  static_dir: django/contrib/admin/static/admin
  expiration: '0'

- url: /static
  static_dir: static
  expiration: '0'

- url: /.*
  script: djangoappengine.main.application
  

Вот мой urls.py

 from django.conf.urls import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    url(r'^crona/$', 'testapp.views.crona', name='crona'),
    url(r'^admin/', include(admin.site.urls)),
)  static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
  

И вот вид ,

 def crona(request):
   logging.info("hello")
   croned=CronEntries.objects.all().order_by('posted_datetime')[0]

   if croned.email_id=='n*******@gmail.com':
      try:
         access_token="##############################################################"
         graph = facebook.GraphAPI(access_token)
         graph.put_object("me", "feed", message=croned.status_cron)
         croned.delete()
      except Exception as e:
         logging.info(e)
      else:
         return HttpResponse("ok")
  

Вот cron.yaml

 cron:
- description: post on fb
  url: /crona
  schedule: every 2 minutes
  

Комментарии:

1. Где ваш cron.yaml?

Ответ №1:

Вашему обработчику URL url(r'^crona/$', ... требуется косая черта в конце, которую ваш URL-адрес cron опускает. Даже если вы настроили свое приложение на добавление завершающей косой черты, вы не хотите делать это с помощью cron или taskqueue, потому что вы хотите, чтобы они возвращали 200 , а не 301 a.

Комментарии:

1. Спасибо, не могли бы вы, пожалуйста, объяснить это немного подробнее?

2. Конечно. $ Вход url(r'^crona/$'... означает, что / это последний символ в URL. /crona не соответствует. /crona/ выполняется. Решение состоит в том, чтобы либо добавить косую черту в конце к URL задания cron: url: /crona/ , либо удалить знак доллара и косую черту из обработчика URL: url(r'^crona'...