2012-06-12 13 views
24

Hasta el momento estoy disfrutando Bottle, pero el hecho de que tengo que CTRL + C fuera del servidor y reiniciarlo cada vez que cambio de código es un gran golpe para mi productividad. He pensado en usar Watchdog para hacer un seguimiento de los archivos que cambian y luego reiniciar el servidor, pero ¿cómo puedo hacer eso cuando la función bottle.run está bloqueando?¿Cómo puedo hacer que Bottle se reinicie al cambiar el archivo?

Ejecutar el servidor desde un script externo que observa los cambios de archivos parece un lote de trabajo para configurar. Pensaría que esto era un problema universal para los desarrolladores de Bottle, CherryPy y etcétera.

¡Gracias por sus soluciones al problema!

Respuesta

38

Salida de la clase particular una sección titulada "Auto Reloading"

Durante el desarrollo, tiene que reiniciar el servidor mucho para poner a prueba sus cambios recientes. El recargador automático puede hacer esto por usted. Cada vez que edite un archivo de módulo, el recargador reinicia el proceso del servidor y carga la última versión de su código.

Esto da el siguiente ejemplo:

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

Oh, genial! ¿Hay alguna situación en la que esto no vuelva a cargar un módulo? Supongo que mira todos los módulos importados – Hubro

+0

Desafortunadamente no tengo suficiente experiencia para poder decir de una forma u otra. –

+2

Mira todos los módulos importados y luego reinicia por completo el proceso del servidor. Actualmente no hay forma de agregar archivos adicionales a la lista de observación (por ejemplo, plantillas), pero las plantillas no se almacenan en caché en modo de depuración de todos modos. – defnull

3

Con

run(reloader=True) 

hay situaciones en las que no se recarga como cuando la importación está dentro de una definición. Para forzar una recarga utilicé

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

y vuelve a cargar bien en linux.

1

Utilice reloader=True en run(). Tenga en cuenta que en Windows debe estar bajo if __name__ == "__main__": debido a la forma en que funciona el módulo multiprocessing.

from bottle import run 

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

Estos scripts deben hacer lo que está buscando.

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) 
Cuestiones relacionadas