12

フラスコのテンプレート ファイルに、次のような 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('about') のような静的ファイルではなく、通常の url_for 呼び出しでも発生することに気付きました。

編集#2

これについては、 quickstart-appブログ記事を書きました。

4

1 に答える 1

9

スクリプト名を空白文字列に設定しないでください。'/projects/test' に設定してみてください。SCRIPT_NAME を空白の文字列に設定すると、アプリケーションはドメインのルートで実行されていると見なされるため、url_for によって生成されたルートはそこから開始されます。「/projects/test」というスクリプト名を使用すると、「/projects/test/ static/foo/ url_for('static', filename='/foo/bar.css')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)
于 2013-02-24T19:57:58.383 に答える