2017-08-19 9 views
1

私は2つのウェブドメインを持っています。それらをalpha.comとbeta.comと呼んでいます。私は、これらの2つの異なるドメイン上の2つの異なる正面向きのWebサイトを実行したいが、共有されたサーバーから、同じフラスコのアプリケーションとアプリケーションのコンテキスト内で実行したい。これらのウェブサイトは、バックエンドのアプリケーションとデータベースを共有する両方のFlaskでアプリケーションのバックエンドを共有する複数のドメインを提供するにはどうすればよいですか?

私の現在のプロジェクト構造は以下の通りである:

app/ 
    -static/ 
    --alphacom_static/ 
    --betacom_static/ 
    --shared_backend_static/ 
    -blueprints/ 
    --alphacom_frontend_bluprint/ 
    --betacom_frontend_blueprint/ 
    --shared_backend_blueprint/ 

私は、サーバー上のリバースプロキシを経由してフラスコ/ geventでローカルホスト上で実行されているbeta.comにサービスを提供しています。私はalpha.comの青写真を追加する予定です。

ベータ版のランディングページのルートは@blueprint.route(r'/', methods=['GET', 'POST'])です。ユーザーがbeta.com/loginにログインすると、bet.com/appに誘導されます。

青写真とルートを使用してalpha.comを青写真とする方法と、ユーザーがログインするときにalpha.com/appが配信される方法は何ですか?

beta.comとの衝突を回避するためにalpha.comのルートを変更するにはどうすればよいですか?

答えて

1

フラスコの現在の安定した放出であるFlask==0.12.2ではあまりよく支持されていないことがわかった。それは理論的にはhost_matchingである程度まで行うことができます。しかし私のテストでは、静的ルートは常に破られました。

ただし、書面の時点でマスターのフラスコ開発版ではプルリクエストがマージされているため、やや簡単になります。 pip install git+git://github.com/pallets/flask.gitを実行するとFlask==0.13.dev0がインストールされます。私の場合、ファクトリーパターンを使用してフラスコアプリを作成すると、host_matching=Truestatic_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 

幸い、これは簡単ではありませんでした。

関連する問題