2012-06-12 9 views
24

Mi sto davvero godendo il Bottle fino ad ora, ma il fatto di dover rimuovere CTRL + C dal server e riavviarlo ogni volta che eseguo un cambio di codice è un grosso problema per la mia produttività. Ho pensato di usare Watchdog per tenere traccia dei cambiamenti dei file e riavviare il server, ma come posso farlo quando la funzione bottle.run sta bloccando.Come posso riavviare Bottle in caso di cambio di file?

L'esecuzione del server da uno script esterno che controlla le modifiche dei file sembra un lotto di lavoro da configurare. Penserei che questo fosse un problema universale per gli sviluppatori Bottle, CherryPy ed eccetera.

Grazie per le vostre soluzioni al problema!

risposta

38

Partenza da tutorial una sezione intitolata "Auto Reloading"

Durante lo sviluppo, è necessario riavviare il server molto per testare le tue modifiche recenti. Il caricatore automatico può farlo per te. Ogni volta che si modifica un file di modulo , il reloader riavvia il processo del server e carica la versione più recente del codice.

Questo fornisce il seguente esempio:

from bottle import run 
run(reloader=True) 
+0

Oh, cool! Ci sono situazioni in cui questo non riuscirà a ricaricare un modulo? Presumo che guardi tutti i moduli importati – Hubro

+0

Purtroppo non ho abbastanza esperienza per poter dire in un modo o nell'altro. –

+2

Guarda tutti i moduli importati e poi riavvia completamente il processo del server. Al momento non è possibile aggiungere ulteriori file all'elenco di controllo (ad esempio modelli), ma i modelli non vengono comunque memorizzati nella modalità di debug. – defnull

3

Con

run(reloader=True) 

ci sono situazioni in cui non ricarica come quando l'importazione è all'interno di un def. Per forzare una ricarica ho usato

subprocess.call(['touch', 'mainpgm.py']) 

e si ricarica bene in linux.

1

Utilizzare reloader=True in run(). Tenere presente che in Windows questa deve essere inferiore a if __name__ == "__main__": a causa del modo in cui il modulo multiprocessing funziona.

from bottle import run 

if __name__ == "__main__": 
    run(reloader=True) 
0

Questi script dovrebbero fare ciò che stai cercando.

AUTOLOAD.PY

import os 
def cherche(dir): 
    FichList = [ f for f in os.listdir(dir) if os.path.isfile(os.path.join(dir,f)) ] 
    return FichList 

def read_file(file): 
    f = open(file,"r") 
    R=f.read() 
    f.close() 
    return R 

def load_html(dir="pages"): 
    FL = cherche(dir) 
    R={} 
    for f in FL: 
     if f.split('.')[1]=="html": 
      BUFF = read_file(dir+"/"+f) 
      R[f.split('.')[0]] = BUFF 
    return R 

MAIN.PY

# -*- coding: utf-8 -*- 

#Version 1.0 00:37 


import sys 
reload(sys) 
sys.setdefaultencoding("utf-8") 
import datetime 
import ast 
from bottle import route, run, template, get, post, request, response, static_file, redirect 

#AUTOLOAD by LAGVIDILO 
import autoload 
pages = autoload.load_html() 




BUFF = "" 
for key,i in pages.iteritems(): 
    BUFF=BUFF+"@get('/"+key+"')\n" 
    BUFF=BUFF+"def "+key+"():\n" 
    BUFF=BUFF+" return "+pages[key]+"\n" 

print "=====\n",BUFF,"\n=====" 
exec(BUFF) 


run(host='localhost', port=8000, reloader=True)