Flask中的路径路由

sdc*_*sdc 10 python apache cgi web-frameworks flask

我想在共享托管环境中运行Python CGI.我按照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()
Run Code Online (Sandbox Code Playgroud)

我的.htaccess包含:

Options +ExecCGI 
AddHandler cgi-script .cgi .py .rb
DirectoryIndex index.cgi index.htm
Run Code Online (Sandbox Code Playgroud)

我的index.cgi

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

CGIHandler().run(app)
Run Code Online (Sandbox Code Playgroud)

它成功地将该路径映射/index(),但它未能映射路径/pipi(),而不是返回404错误.我想我会错过一些明显的东西.谢谢您的帮助.

小智 2

关于 cgi 与 wsgi 的评论是有效的,但如果您确实想使用 cgi 设置,则需要一些重写规则,以便使用 index.cgi 捕获除“/”之外的 URL。根据您的设置,您基本上可以说索引文件是index.cgi,但如果路径中存在其他内容,则index.cgi 将不会被执行。这就是为什么 /pi 请求出现 404 Not Found 的原因。

您可以通过请求 url /index.cgi/pi 来访问 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]
Run Code Online (Sandbox Code Playgroud)