2012-04-02 13 views
9

Voglio eseguire un CGI Python su un ambiente di hosting condiviso. Ho seguito l'esempio di Flask e si avvicinò con una piccola applicazione come di seguito:Instradamento percorso nel pallone

from flask import Flask 
app = Flask(__name__) 

@app.route("/") 
def hello(): 
    return "Hello World!" 

@app.route("/pi") 
def pi(): 
    return "3.1416" 

if __name__ == "__main__": 
    app.run() 

mio .htaccess contiene:

Options +ExecCGI 
AddHandler cgi-script .cgi .py .rb 
DirectoryIndex index.cgi index.htm 

E il mio index.cgi è

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

CGIHandler().run(app) 

Esso mappa con successo il percorso / a index(), tuttavia non riesce a mappare il percorso /pi a pi(), invece di girando un errore 404. Credo che mi manchi qualcosa di ovvio. Grazie per l'aiuto.

+0

È questo con Apache? Penso che l'aggiunta di un tag Apache probabilmente ti darà più risposte poiché questo sembra essere più un problema di configurazione del server web. – six8

+0

Il tuo host supporta solo CGI o supporta mod_python o mod_wsgi? Quelle sono opzioni molto migliori. – six8

+0

Cixate, hai ragione è con Apache. Sono nuovo per i framework web Python. L'impostazione cgi sembra più veloce di mod-wsgi per l'installazione. Ecco perché scelgo cgi. Un'altra cosa, ho il sospetto che potrebbe aver bisogno di url-riscrittura. Ma poiché non ho visto alcuna riscrittura di URL menzionata nel documento, quindi presumo che non sia necessario. Grazie – sdc

risposta

2

I commenti su cgi vs wsgi sono validi, ma se si vuole veramente andare con l'installazione di cgi, sono necessarie alcune regole di riscrittura per catturare URL diversi da "/" con index.cgi. Con il tuo setup, in pratica dici che il file index è index.cgi, ma nel caso in cui ci sia qualcos'altro nel percorso index.cgi non verrà eseguito. Questo è il motivo per cui ottieni 404 Not Found per/pi request.

Puoi accedere alla funzione pi() richiedendo url /index.cgi/pi e ti renderà correttamente 3.1416, ma ovviamente non è un URL molto carino. Ciò fornisce un suggerimento su ciò che deve essere configurato per la riscrittura però: riscrivi tutte le richieste con/su /index.cgi/. Questo fornisce regole di riscrittura molto semplici insieme alla configurazione originale:

Options +ExecCGI 
AddHandler cgi-script .cgi .py .rb 
DirectoryIndex index.cgi index.htm 

RewriteEngine On 
RewriteRule ^index.cgi/(.*)$ - [S=1] 
RewriteRule ^(.*)$ index.cgi/$1 [QSA,L] 
0

Non sono sicuro se la soluzione di cui sopra ha risolto la query.

penso che il file .htaccess deve essere questo:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /path/to/the/application.cgi/$1 [L] 

funzionerà perfettamente con questo. Ho provato con il mio codice.

Riferimento - here