python - Flask:子目录中的静态文件

标签 python flask 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()

我的 .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

编辑#1

我注意到这种情况也会发生在正常的 url_for 调用中,而不是针对 url_for('about') 之类的静态文件。

编辑 #2

我写了一个quickstart-appa blog post关于这个。

最佳答案

不要将脚本名称设置为空字符串,尝试将其设置为“/projects/test”。通过将 SCRIPT_NAME 设置为空字符串,应用程序认为它在域的根上运行,因此 url_for 生成的路由将从那里开始。使用脚本名称“/projects/test”,url_for('static', filename='/foo/bar.css') 将返回“/projects/test/static/foo/bar.css”。 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)

关于python - Flask:子目录中的静态文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15044094/

相关文章:

Python 2.5 socket._fileobject 在Python 3.1 中是什么?

python - Flask - POST 错误 405 方法不允许

python - 使用 Flask 的 URL 结构和表单帖子

html - favicon.ico 导致 Flask 应用程序出现 404 错误

c++ - 将一个 va_list 作为参数传递给另一个

python pyqt交互使用

python - Repl.it 和 FFmpeg

php - 为什么 (mono) asp.net 比 php 慢?

java - PHP-CGI 帖子空

Python webapp 动态路径