【问题标题】:Path routing in FlaskFlask 中的路径路由
【发布时间】:2012-04-16 10:47:00
【问题描述】:

我想在共享主机环境中运行 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()

我的.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 错误。我想我错过了一些明显的东西。谢谢您的帮助。

【问题讨论】:

  • 这是 Apache 的吗?我认为添加 Apache 标记可能会为您提供更多答案,因为这似乎更像是一个 Web 服务器配置问题。
  • 您的主机只支持 CGI 还是支持 mod_python 或 mod_wsgi?这些是更好的选择。
  • Cixate,你说得对,这是 Apache。我是 python 网络框架的新手。 cgi 设置似乎比 mod-wsgi 更快。这就是我选择cgi的原因。另一件事,我怀疑它可能需要 url-rewrite。但是因为我没有看到文档中提到任何 url-rewrite,所以我认为没有必要。谢谢
  • CGI 设置起来可能更快,但性能比 WSGI 差得多,因为 python 应用程序实际上启动并停止了每个请求。您可以设置 WSGI like this,或者如果您正在寻找具有真正 Python 支持的廉价 Python 托管,请尝试免费使用 heroku.comdocs.python-guide.org 是开始使用 Python 和 Python 托管的好资源。
  • 谢谢,@Cixate。我会喜欢有更好的表现。要使用 WSGI,我不需要管理员权限来配置<VirtualHost *>吗?如果我能从我对 PHP 友好的托管计划中解决这个问题,那就太好了。

标签: python apache cgi flask web-frameworks


【解决方案1】:

关于 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]

【讨论】:

    【解决方案2】:

    不确定上述解决方案是否解决了查询。

    我认为.htaccess 文件应该是这样的:

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

    它将与此完美配合。我已经用我的代码进行了测试。

    参考 - here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-13
      • 2016-02-19
      • 2013-09-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多