2011-09-06 13 views
8

Ho scritto una piccola applicazione utilizzando il framework Flask. Cerco di ospitare questo utilizzando cgi. In seguito la documentazione che ho creato un file .cgi con il seguente contenuto:Distribuzione di un'applicazione Flask con CGI

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

CGIHandler().run(app) 

Esecuzione dei risultati di file in errore seguente:

...

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

nella mia applicazione ho esposto:

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

Quando si esegue l'applicazione con il server di sviluppo Flask, funziona perfettamente bene. Come puoi dire sono molto nuovo a questa roba e ho cercato altri con errori simili ma senza fortuna. Tutto l'aiuto è apprezzato.

+1

Lo si esegue con un server http? Quelle vars di ambiente dovrebbero essere impostate dal server http che esegue il cgi. – mkriheli

+0

Grazie per il commento. Sto eseguendo apache per l'hosting. Non pensavo di aver bisogno di configurare il server solo per eseguire i comandi localmente. Proverò di nuovo dopo aver effettuato le configurazioni necessarie. – monostop

+0

Sei riuscito a correggere questo errore? – Shadkhan

risposta

0

Questo è pubblicato come risposta seguendo i commenti di cui sopra per motivi di completezza.

Come discusso sopra, gli script cgi dovrebbero essere eseguiti da qualche server. Ecco l'abstract 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.

Per le variabili d'ambiente (che mancavano e attivate l'errore) vedono sectuib 4.1 nella RFC.

2

Questa domanda ha tre anni e non è mai stata contrassegnata come risposta. Se stai cercando una discussione abbastanza completa su come farlo vedi il post più recente, da parte mia, a this related stackoverflow question. Dovrebbe funzionare per te.

Certamente mkriheli ha l'idea giusta; monostop non dovrebbe provare a eseguire il file cgi (lasciare che il server lo faccia in risposta a una richiesta HTTP in arrivo).

+0

Infatti, http://stackoverflow.com/a/24848407/2371522 ha funzionato per me. – One

0

cercherò di mostrare quello che ho fatto e sta funzionando in Godaddy condivisione account ospite:

Nella cartella cgi-bin nella cartella MYSITE, ho aggiunto il seguente file 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) 

Come si può vedere il file init nella cartella MYSITE avere l'app pallone.

La cosa più importante è impostare le autorizzazioni corrette. Ho settato 755 per questa cartella, così come per la cartella "/home/USERNAME/.local/bin/python3" !! Ricorda che il sistema ha bisogno di questa autorizzazione per aprire il pallone.

Per aprire il cgi Ho il seguente file .htaccess nella cartella MYSITE:

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

Così sarà rendere il file cgi quando qualcuno entra nella vostra pagina.