Назначить URL-адрес скрипту Python для запуска задания cron в Google Cloud? - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть простое приложение Django, которое отображает некоторые данные, которые оно извлекает из базы данных. У меня есть скрипт Python, который обновляет данные, и я хотел бы, чтобы он запускался каждый день. Я не могу понять, как отформатировать мои обработчики app.yaml, чтобы они отвечали на cron.yaml.

cron.yaml выглядит так:

cron:
- description: "daily update"
  url: /go
  schedule: every 24 hours

app.yaml выглядит так (за исключением некоторых чувствительных частей):

runtime: python
entrypoint: gunicorn -b :$PORT rcg_new.wsgi # specific to a GUnicorn HTTP server deployment
env: flex

handlers:
- url: /static
  static_dir: static
- url: /go
  script: scripto.app

runtime_config:
  python_version: 3

скрипт выглядит так:

import pandas as pd
import numpy as np
import requests
import webapp2
import urllib2
import urllib3
import certifi
import json
import re
from rcg_func_dj import pull_rc, pull_artists, artist_cycle, tally

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "rcg_new.settings")
import django
django.setup()
from rcg_app.models import Gender, Groups

http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())
spot_id = os.environ['SPOT_ID']
spot_sec = os.environ['SPOT_SEC']

class update_dbs(webapp2.RequestHandler):
    def get(self):

        self.response.headers["Content-Type"] = "text/html"
        self.response.write('running rcg...')
        rc = pull_rc(spot_id, spot_sec)
        artists_unprocessed = pull_artists(rc)
        artists_processed = artist_cycle(artists_unprocessed)
        tally(artists_processed)
        self.response.write('rcg done!')


routes = [('/go', update_dbs)]
app = webapp2.WSGIApplication(routes, debug=True) 

скрипт работает, так как я использовал его для заполнения БД!

он хорошо отображается в очереди задач, но дает мне статус «не выполнено», когда я пытаюсь его запустить. хотя в логах ничего не видно.

1 Ответ

0 голосов
/ 10 сентября 2018

Я никогда не получал эту работу через webapp и app.yaml, но я нашел обходной путь: я создал новое представление в приложении Django, которое запускало скрипт.

Потребовалось время, чтобы понять!

Сложность заключалась в том, что cron выполнял вызов, который включал перенаправление с чего-то вроде «url / script /» на «url / script», и выполнял только начальный вызов, а не перенаправление.

Поэтому, когда вы определяете свой путь в файле 'urls.py' приложения Django, убедитесь, что вы не ставите косую черту!

это должно выглядеть так:

urlpatterns = [
    path('script', views.script, name='script')
]

... НЕ так:

urlpatterns = [
    path('script/', views.script, name='script')
]

Пока cron.yaml выглядит так:

cron:
- description: "daily update"
  url: /app/script/
  schedule: every 24 hours

Я до сих пор не совсем понимаю, почему это сработало. Люди умнее меня, следите, если у вас есть записи.

...