2011-09-06 23 views
8

He escrito una pequeña aplicación utilizando el marco de Flask. Intento alojar esto usando cgi. A raíz de la documentación que he creado un archivo .cgi con el siguiente contenido:Despliegue de una aplicación Flask con CGI

#!/usr/bin/python 
from wsgiref.handlers import CGIHandler 
from yourapplication import app 

CGIHandler().run(app) 

Ejecución de los resultados del archivo de error siguiente:

...

File "/usr/lib/pymodules/python2.7/werkzeug/routing.py", line 1075, in bind_to_environ wsgi_server_name = environ.get('HTTP_HOST', environ['SERVER_NAME'])
KeyError: 'SERVER_NAME'
Status: 500 Internal Server Error
Content-Type: text/plain
Content-Length: 59

en mi solicitud me he propuesto:

app.config['SERVER_NAME'] = 'localhost:5000' 

Cuando ejecuto la aplicación con el servidor de desarrollo Frasco funciona perfectamente bien. Como puedes ver, soy muy nuevo en esto y busco otros con errores similares pero sin suerte. Toda la ayuda es apreciada.

+1

¿Lo ejecuta en algún servidor http? Esos valores de ambiente deben ser configurados por el servidor http que ejecuta el cgi. – mkriheli

+0

Gracias por el comentario. Estoy ejecutando Apache para alojamiento. No creí necesitar configurar el servidor solo para ejecutar los comandos localmente. Intentaré de nuevo después de haber hecho las configuraciones necesarias. – monostop

+0

¿Pudo reparar este error? – Shadkhan

Respuesta

0

Esto se publica como respuesta después de los comentarios anteriores para completar.

Como se mencionó anteriormente, las secuencias de comandos cgi deberían ser ejecutadas por algún servidor. Aquí está el resumen from CGI 1.1 RFC:

The Common Gateway Interface (CGI) is a simple interface for running external programs, software or gateways under an information server in a platform-independent manner. Currently, the supported information servers are HTTP servers.

Para las variables de entorno (que faltaban y provocó el error) ver sectuib 4.1 en el RFC.

2

Esta pregunta tiene tres años y nunca se marcó como respondida. Si está buscando una discusión bastante completa sobre cómo hacerlo, vea la publicación más reciente, por mí, al this related stackoverflow question. Debería funcionar para usted.

Ciertamente mkriheli tiene la idea correcta; monostop no debería intentar ejecutar el archivo cgi (deje que el servidor lo haga en respuesta a una solicitud HTTP entrante).

+0

De hecho, http://stackoverflow.com/a/24848407/2371522 funcionó para mí. – One

0

voy a tratar de mostrar lo que he hecho y está trabajando en GoDaddy compartir cuenta de host:

En la carpeta cgi-bin en la carpeta Mi sitio, que añade el siguiente archivo de CGI:

#!/home/USERNAME/.local/bin/python3 
from wsgiref.handlers import CGIHandler 

from sys import path 
path.insert(0, '/home/USERNAME/public_html/MYSITE/') 
from __init__ import app 

class ProxyFix(object): 
    def __init__(self, app): 
     self.app = app 

    def __call__(self, environ, start_response): 
     environ['SERVER_NAME'] = "" 
     environ['SERVER_PORT'] = "80" 
     environ['REQUEST_METHOD'] = "GET" 
     environ['SCRIPT_NAME'] = "" 
     environ['PATH_INFO'] = "/" 
     environ['QUERY_STRING'] = "" 
     environ['SERVER_PROTOCOL'] = "HTTP/1.1" 
     return self.app(environ, start_response) 

if __name__ == '__main__': 
    app.wsgi_app = ProxyFix(app.wsgi_app) 
    CGIHandler().run(app) 

Como puede ver, el archivo init en la carpeta MYSITE tiene la aplicación del matraz.

Lo más importante es establecer los permisos correctos. Configuré 755 en este permiso de carpeta ASÍ COMO en la carpeta "/home/USERNAME/.local/bin/python3" !! Recuerde que el sistema necesita este permiso para abrir el matraz.

Para abrir el cgi Tengo el siguiente archivo .htaccess en la carpeta mysite:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /home/USERNAME/public_html/MYSITE/cgi-bin/application.cgi/$1 [L] 

Por lo que hará que el archivo cgi cuando alguien entra en su página.

Cuestiones relacionadas