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)