Путь маршрутизации во Flask - PullRequest
       24

Путь маршрутизации во Flask

10 голосов
/ 02 апреля 2012

Я хочу запустить Python CGI в среде общего хостинга. Я последовал примеру Фласка и придумал крошечное приложение, как показано ниже:

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 содержит:

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

А мой index.cgi это

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

CGIHandler().run(app)

Он успешно отображает путь / на index(), однако ему не удается сопоставить путь /pi с pi(), вместо этого возвращается ошибка 404. Я предполагаю, что скучаю по чему-то очевидному. Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2012

Комментарии о cgi и wsgi действительны, но если вы действительно хотите перейти к настройке cgi, вам нужны некоторые правила переписывания, чтобы перехватывать URL-адреса, отличные от «/», в index.cgi. С вашей настройкой вы в основном говорите, что индексный файл - index.cgi, но в случае, если в пути есть что-то еще, index.cgi не будет выполнен. Вот почему вы получаете 404 Not Found для запроса / pi.

Вы можете получить доступ к функции pi (), запросив url /index.cgi/pi, и она успешно отобразит 3.1416, но, очевидно, это не очень хороший URL. Это дает подсказку о том, что нужно настроить для перезаписи: переписать все запросы с помощью / в /index.cgi/. Это дает очень простые правила перезаписи вместе с вашей исходной конфигурацией:

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 голосов
/ 30 мая 2016

Не уверен, что вышеуказанное решение решило запрос.

Я думаю, что файл .htaccess должен быть таким:

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

Это будет прекрасно с этим работать. Я проверил с моим кодом.

Ссылка - здесь

...