フラスコの現在の安定した放出であるFlask==0.12.2
ではあまりよく支持されていないことがわかった。それは理論的にはhost_matchingである程度まで行うことができます。しかし私のテストでは、静的ルートは常に破られました。
ただし、書面の時点でマスターのフラスコ開発版ではプルリクエストがマージされているため、やや簡単になります。 pip install git+git://github.com/pallets/flask.git
を実行するとFlask==0.13.dev0
がインストールされます。私の場合、ファクトリーパターンを使用してフラスコアプリを作成すると、host_matching=True
とstatic_host=127.0.0.1:8000
を設定できます。私にとって
、私の工場の機能は次のようになります。
def create_app(config_obj=None):
"""An application factory, as explained here:
http://flask.pocoo.org/docs/patterns/appfactories/.
:param config_object: The configuration object to use.
"""
app = Flask(__name__, host_matching=True, static_host='127.0.0.1:8000')
app.config.from_object(config_obj)
register_extensions(app)
register_blueprints(app)
return app
この作業を行うために必要なもう一つは、あなたのホストを変更し、ホストファイルで参照したいドメインを設定することです。窓では、これはC:\Windows\System32\drivers\etc\hosts
にあります。 hostsファイルの一番下に、私は次のような変更されました:
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
127.0.0.1 alpha.local
127.0.0.1 beta.local
127.0.0.1 local
あなたがリバースプロキシ(Windows上でLinuxまたはIIS上でnginxの)後ろにこのソリューションを実行し、適切な要求を転送するように設定する必要がありますこの例の場合はalpha.local:8000
またはbeta.local:8000
になります。しかし、あなたの実際の必要性に基づいて<subdomain>.local:<port>
を変更します。
CORSリクエストに関するブラウザからの不満があるので、Access-Control-Allow-Origin: *
やAccess-Control-Allow-Origin: http://beta.local:8000
などの特定のドメインのヘッダーを設定する必要があります。生産のために、あなたは(nginxのまたはIISのような)プロキシに変更したヘッダを設定しなければなりませんし、上記の機能がために有用ではないことを
@blueprint.after_app_request
def add_headers_to_fontawesome_static_files(response):
"""
Fix for font-awesome files: after Flask static send_file() does its
thing, but before the response is sent, add an
Access-Control-Allow-Origin: *
HTTP header to the response (otherwise browsers complain).
"""
if not os.environ.get('APP_ENV') == 'prod':
if request.path and re.search(r'\.(ttf|woff|woff2|svg|eot)$', request.path):
response.headers.add('Access-Control-Allow-Origin', '*')
return response
注:CORSがフォントのアクセスを許可するために開発サーバーの場合、私はこれが役に立ったと評価していプロダクション。
host_matching=True
と最後は、その後、ルートは下記の例は、あること、ホストのために指定する必要があります。
@blueprint.route('/about/', methods=['GET', 'POST'],
host='<string:subdom>.local:8000')
def about_app(**kwargs):
"""The about page."""
return render_template('about.html')
あなたは上記のようにルートを行う場合、どこかにあなたのアプリケーション内の関数にurl_defualtsを設定すると便利です以下のようになります。
@blueprint.app_url_defaults
def add_subdom(endpoint, values):
path = request.url_root
if 'alpha.local' in path:
g.subdom = 'alpha'
elif 'beta.local' in path:
g.subdom = 'beta'
if current_app.url_map.is_endpoint_expecting(endpoint, 'subdom'):
values['subdom'] = g.subdom
幸い、これは簡単ではありませんでした。