让Flask在mod-rewrite后面使用所需的URL

时间:2014-12-03 12:09:36

标签: .htaccess url mod-rewrite flask mod-wsgi

我在Apache上运行mod_wsgi下的Flask应用程序。由于网站的各个部分是静态的而其他部分是动态的,因此网站的动态部分将使用mod_rewrite路由到Flask应用,如下所示:

的.htaccess

RewriteEngine on
RewriteBase /

RewriteRule ^(foo(/.*)?)$    /myapp.wsgi/$1  [L,QSA]
RewriteRule ^(bar(/.*)?)$    /myapp.wsgi/$1  [L,QSA]
# etc.

myapp.wsgi

from flask import Flask, request

application = Flask(__name__)

@application.route("/foo/")
def foo():
    return request.url

@application.route("/bar/")
def bar():
    return redirect(request.url + "baz/")

当我访问http://www.mywebsite.com/foo/时,该页面会告诉我我的网址为http://www.mywebsite.com/myapp.wsgi/foo/

当我访问http://www.mywebsite.com/bar/时,该页面会将我重定向到http://www.mywebsite.com/myapp.wsgi/bar/baz/

Flask的自动重定向也会发生这种情况:当我访问http://www.mywebsite.com/foo(没有斜杠)时,Flask会重定向以添加斜杠,但会重定向到http://www.mywebsite.com/myapp.wsgi/foo/

是否有一种简单的方法可以让Flask应用程序在URL中不包含/myapp.wsgi,而只使用相对于路径所在的URL? (例如/foo//bar/

2 个答案:

答案 0 :(得分:2)

这可以通过使用某些中间件从SCRIPT_NAME环境变量中删除脚本的名称来解决,如下面的示例Flask docs所示。

from yourapplication import app

class ScriptNameStripper(object):
    def __init__(self, app):
        self.app = app

def __call__(self, environ, start_response):
    environ['SCRIPT_NAME'] = ''
    return self.app(environ, start_response)

app = ScriptNameStripper(app)

答案 1 :(得分:0)

我不知道我是否理解得很好,但您可能希望使用此处记录的url_for函数: http://flask.pocoo.org/docs/0.10/api/#flask.url_for

它允许您通过引用应用程序的端点来构造URL。 例如,url_for('bar')将构建指向条端点的相对URL。