在我的烧瓶模板文件中,我包含一个css文件(我省略了样板文件),如下所示:
url_for('static', filename='css/bootstrap.css')
这将呈现为/static/css/bootstrap.css
,这意味着(由于前导斜杠)它被解释为domain.com/static/css/boostrap.css
。不幸的是,实际的static
文件夹位于子目录:domain.com/projects/test/static/
环境细节:
我的fcgi文件位于~/fcgi-bin
文件夹中(主机特定我猜):
$ cat ~/fcgi-bin/test.fcgi
#!/usr/bin/env python2.7
import sys
sys.path.insert(0, "/home/abcc/html/projects/test")
from flup.server.fcgi import WSGIServer
from app 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)
if __name__ == '__main__':
WSGIServer(app).run()
和我的.htaccess位于domain.com/projects/test /
$ cat .htaccess
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
<Files ~ (\.fcgi)>
SetHandler fcgid-script
Options +FollowSymLinks +ExecCGI
</Files>
</IfModule>
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /fcgi-bin/test.fcgi/$1 [QSA,L]
</IfModule>
总结一下,我希望url_for('static', filename='css/bootstrap.css')
返回static/css/bootstrap.css
而不是/static/css/bootstrap.css
我注意到这也发生在正常的url_for调用上,而不是像url_for('about')这样的静态文件。
关于此,我写了quickstart-app和a blog post。
答案 0 :(得分:5)
不要将脚本名称设置为空字符串,尝试将其设置为'/ projects / test'。通过将SCRIPT_NAME设置为空字符串,应用程序认为它在域的根目录上运行,因此url_for生成的路由将从那里开始。脚本名称为'/ projects / test',url_for('static', filename='/foo/bar.css')
将返回'/projects/test/static/foo/bar.css'
如果你真的希望你的应用程序在不同的端点上提供静态媒体,那么你只需要自己滚动它,就像这样:
from flask import Flask
from os.path import join
app = Flask(__name__)
def url_for_static(filename):
root = app.config.get('STATIC_ROOT', '')
return join(root, filename)