2012-04-02 20 views
9

Chcę uruchomić Python CGI na współdzielonym środowisku hostingowym. Śledziłem przykład kolby i wpadł malutkiej aplikacji, jak poniżej:Routing ścieżki w Flask

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() 

My .htaccess zawiera:

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

i mój index.cgi jest

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

CGIHandler().run(app) 

powodzeniem mapuje ścieżkę / do index(), ale nie zamapuje ścieżki /pi na pi(), zamiast tego przekręcając błąd 404. Chyba brakuje mi czegoś oczywistego. Dzięki za pomoc.

+0

Czy to jest z Apache? Myślę, że dodanie tagu Apache prawdopodobnie dostarczy ci więcej odpowiedzi, ponieważ wydaje się, że jest to raczej problem z konfiguracją serwera WWW. – six8

+0

Czy twój host obsługuje tylko CGI, czy obsługuje mod_python lub mod_wsgi? To są znacznie lepsze opcje. – six8

+0

Cixate, masz rację, to jest z Apache. Jestem nowy w pythonowaniu frameworków internetowych. Ustawienie cgi wydaje się szybsze niż konfiguracja mod-wsgi. Właśnie dlatego wybieram cgi. Inną rzeczą, podejrzewałem, że może potrzebować przepisania adresu URL. Ale ponieważ nie widziałem żadnego przepisu na adres URL wymienionego w dokumencie, więc zakładam, że nie ma takiej potrzeby. Dzięki – sdc

Odpowiedz

2

Komentarze na temat cgi kontra wsgi są poprawne, ale jeśli naprawdę chcesz przejść z instalacją cgi, potrzebujesz reguł przepisywania w celu przechwycenia adresów URL innych niż "/" w indeksie index.cgi. Z twoją konfiguracją zasadniczo mówisz, że plik indeksu to index.cgi, ale w przypadku, gdy jest coś jeszcze w ścieżce, index.cgi nie zostanie wykonany. Z tego powodu otrzymujesz żądanie 404 Not Found for/pi.

Możesz uzyskać dostęp do funkcji pi(), żądając url /index.cgi/pi, a ona z powodzeniem wyrenderuje ci 3.1416, ale oczywiście nie jest to bardzo ładny URL. Daje to wskazówkę dotyczącą tego, co należy skonfigurować do przepisywania: przepisać wszystkie żądania za pomocą/na /index.cgi/. Zapewnia to bardzo proste reguły przepisywania wraz z oryginalną konfiguracją:

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

Nie jestem pewien, czy powyższe rozwiązanie rozwiązało zapytanie.

myślę plik .htaccess musi być to:

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

Będzie doskonale pracować z tym. Przetestowałem z moim kodem.

Numer referencyjny - here