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
папка (host specific я думаю):
$ 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/ [QSA,L]
</IfModule>
в итоге я хочу!--2--> вернуться static/css/bootstrap.css
вместо /static/css/bootstrap.css
правка #1
Я заметил, что это происходит также при обычных вызовах url_for не для статических файлов, таких как url_for('about').
правка #2
Я написал quickstart-приложение и блоге об этом.
1 ответов
Не устанавливайте имя скрипта в пустую строку, попробуйте установить его в '/ projects / test'. Установив SCRIPT_NAME в пустую строку, приложение думает, что оно работает в корне домена, поэтому маршруты, созданные url_for, будут запускаться там. С именем скрипта '/ projects / test',url_for('static', filename='/foo/bar.css')
вернет ' / проекты / тест / статический / 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)