Запустите скрипт Python по расписанию в Google App Engine - PullRequest
0 голосов
/ 18 января 2019

Я ищу хорошего самаритянина, который может предоставить очень простой каркас для запуска скрипта Python с помощью Google App Engine.Я прочитал документацию, проверил соответствующие вопросы SO, но я потерял с форматом WebApp.Все, что я хочу сделать, - это запустить один скрипт Python, который принимает аргументы или несколько скриптов Python, 6 раз в неделю, чтобы прослушать изменения на веб-сайте, а затем опубликовать их в Firestore.

Я понимаю формат cron и большинствоиз файлов конфигурации.Я застрял в том, как упорядочить мои файлы для проекта и как работает URL.

Все, что я спрашиваю, - это очень простой пример того, как эффективно запускать скрипты Python. Это , безусловно, лучший ресурс, который я нашел, но я не могу понять, что происходит с этим кодом с этого сайта:

`#!/usr/bin/python
# -*- coding: utf-8 -*- 
from __future__ import unicode_literals   
from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.ext import db   
import feedparser  
import time   

class Item(db.Model): 
    title = db.StringProperty(required=False)
    link = db.StringProperty(required=False)
    date = db.StringProperty(required=False)   class Scrawler(webapp.RequestHandler):

    def get(self):
        self.read_feed()      
        self.response.out.write(self.print_items())

    def read_feed(self):

        feeds = feedparser.parse( "http://www.techrepublic.com/search?t=14&o=1&mode=rss" )

        for feed in feeds[ "items" ]:
            query = Item.gql("WHERE link = :1", feed[ "link" ])
            if(query.count() == 0):
                item = Item()
                item.title = feed[ "title" ]
                item.link = feed[ "link" ]
                item.date = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time()))
                item.put()

    def print_items(self):
        s = "All items:<br>"
        for item in Item.all():
            s += item.date + " - <a href='" + item.link + "'>" + item.title + "</a><br>"
        return s   application = webapp.WSGIApplication([('/', Scrawler)], debug=True)   def main():
    run_wsgi_app(application)   if __name__ == "__main__":
    main() `

Это скрипт на pythonЯ пытался запустить только для тестирования, используя python3.7:

import sys
from datetime import datetime

import firebase_admin
from firebase_admin import firestore

app = firebase_admin.initialize_app()
db = firestore.client()


def hello_firestore(user_name):
    db.collection('firestore_test').document('test').set({
        'time': str(datetime.now()),
        'user_name': user_name
    })


if __name__ == "__main__":
    try:
        user_name = sys.argv[1]
    except:
        print('Error with the argument', file=sys.stderr)
    try:
        hello_firestore(user_name)
    except:
        print('Error accessing the database', file=sys.stderr)
        sys.exit(0)

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

С наилучшими пожеланиями

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Наконец мои дети снова полюбят меня. Оказывается, я искал не тот ресурс GCP, поскольку @Dan_Cornilescu указал, что это может быть способ сделать это, но самый простой способ сделать это - «Облачные функции» в сочетании с «Облачным планировщиком», и я нашел его просто просто шанс.

Эта статья была самой первой, в которой упоминалось об этом, в тот момент, когда я перешел на нее, потому что автор снова использует веб-приложение, чтобы проиллюстрировать случай, для моих нужд и отсутствия технической аргументации. просто не мог выкопать это. Но это действительно так просто, как и должно было быть, в консоли Google Cloud:

  1. Перейти в раздел функций
  2. Выберите в качестве триггера «Cloud Pub / Sub»
  3. Добавить / Выбрать тему
  4. Выберите время выполнения (конечно, Python3.7)
  5. Выберите функцию для выполнения
  6. Создать
  7. Убедитесь, что вы заполнили файл "needs.txt" на следующей вкладке
  8. Перейдите в раздел Cloud Scheduler GCP и создайте задание (cron job)
  9. Выберите в качестве цели: "Pub / Sub"
  10. Введите тему, которую вы выбрали для своей функции
  11. Если вы хотите отправить аргументы для ваших функций, используйте полезную нагрузку для этой цели.

Чтобы использовать аргумент или аргументы для вашей функции Python, вы хотите использовать полезную нагрузку и использовать следующее из их исходной функции:

pubsub_message = base64.b64decode(event['data']).decode('utf-8')

Это pubsub_message, вы можете использовать его в качестве аргумента для ваших функций Python.

И это все, просто, очень легко, в конце я думаю, что это то же самое, что GAE без визуальной страницы, просто то, что мне было нужно, я знал, что должен быть лучший способ.

РЕДАКТИРОВАТЬ: Статья, которую я упоминаю здесь, описывает, как использовать gcloud для загрузки ваших функций непосредственно с вашего компьютера.

enter image description here

0 голосов
/ 19 января 2019

Ответ , о котором я упоминал, по-прежнему применяется - вы не сможете запускать свои сценарии автономно на GAE cron, просто потому, что служба cron на самом деле представляет собой просто набор запланированных запросов GET. Вы можете быть в состоянии достичь того же конечного результата, но:

  • установка скелетного приложения
  • разбивка ваших скриптов на код, который вы вставляете в обработчики приложения, с аргументами, передаваемыми в строках запроса запроса
  • настройка службы cron для создания и запуска этих запросов

Вы можете найти скелет Python 3 в Быстрый старт для Python 3 в стандартной среде App Engine

В качестве альтернативы вы можете, конечно, использовать службу IaaS вместо GAE, например, Google Compute Engine , где вы можете запускать свои сценарии напрямую, с помощью традиционной службы cron.

...