python - Implementar aplicación de matraz en alojamiento compartido 1 & 1(con CGI)
flask (2)
¡Encontré una solución! Dejé /$1
lejos de mi .htaccess
y modifiqué werkzeug un poco porque las variables de entorno en CGI se nombran un poco diferentes en las aplicaciones WSGI. Informaré al desarrollador de werkzeug al respecto y tal vez él incluirá mi solución en werkzeug.
He escrito una aplicación web para mi club deportivo con el marco web del matraz. Hice todo en mi máquina local con el servidor de prueba incorporado.
Sepa que me pidieron que lo implemente en un espacio web de alojamiento compartido 1 & 1. Tienen soporte de Python, pero parece que solo permiten que CGI ejecute scripts de Python.
Intenté este tutorial: matraz a través de CGI
Ignoré las cosas de reescritura hasta ahora. Todas las solicitudes a mi script CGI resultaron en un error 404. Modifiqué mi controlador 404 en la aplicación para devolver request.path
. Cuando solicito /foo/runserver.cgi/ devuelve / como salida. No tengo idea de por qué no sirve para la vista de índice. No funciona con ninguna vista, siempre obtengo un 404.
Un cordial saludo, Sebastian
Escribo para dar una respuesta después de casi un año porque la respuesta dada es incompleta y porque la sugerencia de dejar el / $ 1 es incorrecta. Otros subprocesos de que se pueden alcanzar mediante una búsqueda en Internet utilizando la cadena "deploy flask on cgi" también han finalizado sin soluciones satisfactorias.
Para comenzar, mi archivo .htaccess es exactamente como en el documento "matraz a través de CGI" mencionado, excepto que el comentario en la segunda línea para RewriteCond debe eliminarse porque en .htaccess cualquier comentario debe ocupar toda una línea.
Puse el archivo .htaccess en la carpeta raíz del documento public_html y mi script cgi es /home/myusername/public_html/scgi-bin/moc/cgiappserver-prod.cgi.
Es Python, por supuesto, y el shebang en la parte superior debería estar en lo cierto. En mi ISP usan cpanel que tiene un contenedor para CGI al que llaman "scgi". No es lo real , desafortunadamente. Así que trátalo como CGI ordinario para ejecutar Flask.
Debo agregar que solo tengo una cuenta de alojamiento compartido.
Aquí está mi archivo cgiappserver-prod.cgi:
#!/home/myusername/local/bin/python
import cgitb; cgitb.enable() # This line enables CGI error reporting
from wsgiref.handlers import CGIHandler
import traceback
from settings import LGGR
app = None
try:
import moc
app = moc.app
except Exception, e:
LGGR.info( traceback.format_exc([10]) )
LGGR.info( ''Problem in cgiappserver-prod with moc import: %s'' % e )
class ScriptNameStripper(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ[''SCRIPT_NAME''] = ''''
return self.app(environ, start_response)
app = ScriptNameStripper(app)
try:
CGIHandler().run(app)
except Exception, e:
LGGR.info( traceback.format_exc([10]) )
LGGR.info( ''Problem in cgiappserver-prod with CGIHandler().run(): %s'' % e )
Así que mi aplicación se distribuye en algunos archivos, con setting.py y moc.py en particular, que se muestran en el código anterior.
Mis horas de coqueteo se debieron en parte a todas las publicaciones poco útiles sobre este tema que leí, pero principalmente debido a que no llegué al negocio de recibir mensajes de error lo suficientemente temprano. (Tengo acceso a un registro de errores proporcionado por el ISP, pero rara vez es útil).
Para comenzar, he confirmado que la función cgitb.enable () funciona. He mal escrito deliberadamente wsgiref y he visto una hermosa página de error y he comentado la línea cgitb (cgi traceback) para ver que el mensaje de error se convierta en un código de estado inútil 500.
Tenga en cuenta que también configuré en settings.py un registrador, un registrador de archivos rotativo LGGR. Con él descubrí que tenía que hacer algo extra, que no se muestra aquí, para decirle al intérprete de Python dónde está la biblioteca sqlite3.
Además, puede simplemente usar declaraciones de impresión, acerca de las cuales los documentos de Flask referenciados en CGI dicen:
- Con CGI, también deberá asegurarse de que su código no contenga ninguna instrucción de impresión, o que sys.stdout sea anulado por algo que no se escriba en la respuesta HTTP.
Eso es cierto, pero es útil al depurar para ver la escritura impresa en la respuesta HTTP.
Finalmente, cuando finalmente lo conseguí trabajando, lamentablemente, el cuadro de ubicación del navegador tenía cosas como www.misitio.es/scgi-bin/moc/cgiappserver-prod.cgi/contact, mientras que realmente necesitaba simplemente www.misitio.com /contacto.
La cura fue esa clase ScriptNameStripper en cgiappserver-prod.cgi. Lo obtuve de otros documentos de Flask .