我在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/
)
答案 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。