2012-04-02 36 views
9

Tôi muốn chạy một CGI Python trên môi trường lưu trữ được chia sẻ. Tôi đi theo ví dụ Flask và đã đưa ra một ứng dụng nhỏ như sau:Định tuyến đường dẫn trong 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() 

.htaccess My chứa:

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

index.cgi của tôi là

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

CGIHandler().run(app) 

Nó bản đồ thành công con đường / để index(), tuy nhiên không thể ánh xạ đường dẫn /pi đến pi(), thay vào đó lại chuyển lỗi 404. Tôi đoán tôi nhớ điều gì đó hiển nhiên. Cảm ơn đã giúp đỡ.

+0

Đây có phải là Apache không? Tôi nghĩ rằng việc thêm một thẻ Apache có thể sẽ giúp bạn nhận được nhiều câu trả lời hơn vì điều này dường như là vấn đề cấu hình máy chủ web. – six8

+0

Máy chủ của bạn chỉ hỗ trợ CGI hoặc hỗ trợ mod_python hoặc mod_wsgi? Đó là những lựa chọn tốt hơn nhiều. – six8

+0

Cixate, bạn nói đúng với Apache. Tôi mới vào python web-frameworks. Cài đặt cgi có vẻ nhanh hơn mod-wsgi để thiết lập. Đó là lý do tại sao tôi chọn cgi. Một điều nữa, tôi nghi ngờ nó có thể cần url viết lại. Nhưng bởi vì tôi không thấy bất kỳ url-viết lại được đề cập trong tài liệu, vì vậy tôi giả sử không có nhu cầu. Cảm ơn – sdc

Trả lời

2

Nhận xét về cgi vs wsgi là hợp lệ, nhưng nếu bạn thực sự muốn cài đặt cgi, bạn cần một số quy tắc viết lại để nắm bắt các URL khác với "/" với index.cgi. Với thiết lập của bạn về cơ bản bạn nói rằng tập tin chỉ mục là index.cgi, nhưng trong trường hợp có cái gì khác trong đường dẫn index.cgi sẽ không được thực hiện. Đây là lý do tại sao bạn nhận được 404 Not Found cho yêu cầu/pi.

Bạn có thể truy cập hàm pi() bằng cách yêu cầu url /index.cgi/pi và nó sẽ hiển thị thành công cho bạn 3.1416, nhưng rõ ràng đó không phải là một URL rất đẹp. Điều đó đưa ra một gợi ý về những gì cần phải được cấu hình để viết lại mặc dù: viết lại tất cả các yêu cầu với/đến /index.cgi/. Điều này cung cấp các quy tắc viết lại rất đơn giản cùng với cấu hình ban đầu của bạn:

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

Không chắc chắn giải pháp trên có giải quyết được truy vấn hay không.

Tôi nghĩ rằng các tập tin .htaccess cần phải được điều này:

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

Nó sẽ hoạt động hoàn hảo với điều này. Tôi đã thử nghiệm với mã của tôi.

Tham chiếu - here

Các vấn đề liên quan