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