2012-04-02 12 views
9

Paylaşılan bir barındırma ortamında bir Python CGI çalıştırmak istiyorum. Ben şişeyi örneğini takip ve aşağıda küçük bir uygulama ile geldi:Flask'ta yol yönlendirme

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

Ve benim index.cgi başarıyla yolunu / eşler

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

CGIHandler().run(app) 

geçerli:

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

Benim .htaccess içeriyor index(), ancak yeniden /pi yolunu pi() ile eşleştiremez 404 hatası döndürüyor. Sanırım bariz bir şeyi özlüyorum. Yardım için teşekkürler.

+0

Bu Apache ile mi? Bir Apache etiketinin eklenmesi size daha fazla yanıt alacağınızı düşünüyorum çünkü bu daha çok web sunucusu yapılandırma problemi gibi görünüyor. – six8

+0

Ev sahibi sadece CGI'yi destekliyor mu, yoksa mod_python veya mod_wsgi'yi destekliyor mu? Bunlar çok daha iyi seçenekler. – six8

+0

Cixate, bu Apache ile haklısınız. Python web-çerçeveleri için yeni. Cgi ayarı, kurulum için mod-wsgi'den daha hızlı görünür. Bu yüzden cgi'yi seçiyorum. Başka bir şey, url-rewrite gerekebilir şüpheli. Ama belgede sözü edilen herhangi bir url-rewrite görmediğim için, ihtiyacım olmadığını farz ediyorum. Teşekkürler – sdc

cevap

2

cgi vs wsgi ile ilgili yorumlar geçerli, ancak gerçekten cgi kurulumu ile gitmek istiyorsanız, index.cgi ile "/" dışındaki URL'leri yakalamak için bazı yeniden yazma kurallarına ihtiyacınız var. Kursunuzla temel olarak index dosyasının index.cgi olduğunu, ancak index.cgi yolunda başka bir şey olması durumunda idam edilmeyeceğini söylüyorsunuz. Bu nedenle 404'ü bulunamadı/pi isteğinde bulursunuz.

url /index.cgi/pi isteğinde bulunarak pi() işlevine erişebilir ve 3.1416'yı başarılı bir şekilde işleyecektir, ancak açıkçası bu çok güzel bir URL değildir. Bu, yeniden yazmak için neyin yapılandırılması gerektiğine dair bir ipucu verir:/ile/ile /index.cgi/ ile tüm istekleri yeniden yazın. Bu, özgün yapılandırmanızla birlikte çok basit yeniden yazma kuralları verir:

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

Yukarıdaki çözümün sorguyu çözüp çözmediğinden emin değilsiniz.

Ben .htaccess dosyası bu olması gerektiğini düşünüyorum:

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

Bu mükemmel çalışacaktır. Kodumla test ettim.

Başvuru - here