C'è un modo per controllare uno script Python in loop con Heroku?

0

Ho uno script Python che fa continuamente richieste GET e POST a un'API di terze parti a circa 1 richiesta al secondo. Utilizza un ciclo while, quindi tutte le richieste provengono dallo stesso processo. Attualmente, ho appena eseguito e ucciso lo script sul mio computer locale con python run.py , ma mi piacerebbe essere in grado di avviare e interrompere questo script da qualsiasi luogo (ad es. Il mio telefono), quindi stavo considerando di ospitarlo come app Django su Heroku. È possibile?

Ho preso in considerazione alcuni modi per ottenere questo risultato, ma non sono sicuro che nessuno di essi funzionerebbe. Un pensiero sarebbe avere un pulsante "Esegui" su una pagina Web che avvia un processo in background per eseguire lo script, ma:

  • Non saprei come uccidere questo processo da un browser una volta che è stato creato ( heroku ps:stop non è l'ideale poiché avrei bisogno di una console).
  • Non sono sicuro che Heroku avesse lo scopo di far eseguire uno script per diversi giorni.

Se tutto il resto fallisce, probabilmente finirò per eseguire lo script su un Raspberry Pi e per esporre localhost, ma sarebbe comodo usare Heroku per farlo.

    
posta Michael Hays 25.06.2016 - 17:14
fonte

1 risposta

0

RISPOSTA AGGIORNATA

Il modo migliore che ho trovato per controllare uno script di loop in Heroku è definire un tipo di processo per lo script nel Procfile. In questo modo, è sufficiente ridimensionare il numero di dynos per il tipo di processo su 1 e 0 per avviare e interrompere lo script, rispettivamente. Quindi per un tipo di processo chiamato "run":

Avvia lo script

heroku ps:scale run=1

Ferma lo script

heroku ps:scale run=0

- Demo -

Ecco una demo di un modo per scalare facilmente i dynos utilizzando un'applicazione Django e l'endpoint dell'Heroku API per il ridimensionamento. Ho creato un repository GitHub nel caso in cui potesse aiutare qualcuno, e ho incluso i pezzi importanti di seguito:

Procfile

web: gunicorn {project}.wsgi
run: python run.py {args}

run.py

def run():
    # looping code here


if __name__ == '__main__':
    run()

index.html

<label for="run-loop">Loop running: </label>
<input id="run-loop" type="checkbox">

main.js

// set the checkbox to checked if the dyno is up, unchecked otherwise
var getLoopStatus = function() {
    $.ajax({
        url: "/get-loop-status/",
        success: function(data) {
            if (data.quantity > 0) {
                $('#run-loop').prop('checked', 'checked');
            }
        }
    });
};

// make a request to the server to scale the "run" process type
var runLoop = function(quantity) {
    $.ajax({
        url: "/run-loop/",
        method: "POST",
        data: {
            quantity: quantity
        },
        headers: {
            "X-CSRFToken": Cookies.get('csrftoken'),
        }
    });
};


$(function() {
    // bind the checkbox to the runLoop function
    $('#run-loop').change(function() {
        runLoop(+$(this).is(':checked'));
    });

    getLoopStatus();
});

urls.py

urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='loopapp/index.html'), name='home'),
    url(r'^get-loop-status/$', LoopStatusView.as_view()),
    url(r'^run-loop/$', RunLoopView.as_view()),
    url(r'^admin/', include(admin.site.urls)),
]

views.py

class LoopStatusView(View):
    def get(self, request, *args, **kwargs):
        response = requests.get(HEROKU_RUN_URL, headers=HEROKU_HEADERS)
        return JsonResponse({'quantity': response.json()['quantity']})


class RunLoopView(View):
    def post(self, request, *args, **kwargs):
        data = request.POST.dict()
        payload = RUN_POST_PAYLOAD % data['quantity']
        response = requests.patch(HEROKU_RUN_URL, data=payload, headers=HEROKU_HEADERS)
        return JsonResponse({'new_quantity': response.json()['quantity']})

- Come trovare l'URL dell'API Heroku -

Dovresti avere Chrome DevTools aperto sulla scheda "Rete" per questo. Vai alla tua app nella dashboard di Heroku e fai clic sulla scheda "Risorse". Quindi fai clic sull'icona a forma di matita accanto al processo di looping:

Quindi,attivareunbancodiprovaperqueltipodiprocessofacendoclicsull'interruttoreequindifacendoclicsu"Conferma". L'endpoint dell'API Heroku apparirà in DevTools sotto forma di:

https://api.heroku.com/apps/{app ID}/formation/{process-ID}

Per poter fare richieste a questo endpoint, è necessario un token di accesso. Espandi la richiesta in DevTools e trova l'intestazione Authorization: Bearer {access token} sotto "Intestazioni richiesta" della scheda "Intestazioni".

Nota: questo token scade frequentemente. Probabilmente vorrai aggiornare questo token quando scade o utilizzare l'autenticazione di base, che non scade. Ho avuto postino per generare un token di autenticazione di base per me.

VECCHIA RISPOSTA

Ho trovato una risposta con cui sono un po 'felice. Non penso sia possibile avere un'interfaccia front-end che controlli l'esecuzione di loop continui su Heroku, ma ho trovato un'app chiamata Nezumi che ti permette di eseguire funzioni e controllare i processi di Heroku da il tuo telefono.

Ciò che ho finito è stato creare un file run.py nella mia directory principale di un'app Django e inviarlo a Heroku. Quindi, in Nezumi, posso fare clic sull'icona "run" e digitare python run.py {args} che crea un processo "run" ed esegue il ciclo. Posso interrompere il processo e visualizzare i log facendo clic sull'icona "ps" in Nezumi. Quindi, ora posso avviare e interrompere questo script da qualsiasi parte del mio telefono.

Visualizzazione dell'app Nezumi:

Nezumi http://nezumiapp.com/images/homepage2.jpg

    
risposta data 27.06.2016 - 08:28
fonte

Leggi altre domande sui tag