Flask:子目录中的静态文件

Jon*_*ger 9 python fastcgi url-for flask

在我的烧瓶模板文件中,我包含一个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()
Run Code Online (Sandbox Code Playgroud)

和我的.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>
Run Code Online (Sandbox Code Playgroud)

总结一下,我想url_for('static', filename='css/bootstrap.css')回来static/css/bootstrap.css而不是/static/css/bootstrap.css

编辑#1

我注意到这也发生在正常的url_for调用上,而不是像url_for('about')这样的静态文件.

编辑#2

我写了一篇关于这个的快速入门应用程序博客文章.

Daz*_*all 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)
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用以下命令获取静态文件夹路径:````url_for('static', filename='')``` (2认同)