PythonのFlashkフレームに複数のサブドメインを配置する方法を説明します。


Flashkサブドメイン名
一般的に少数のサブドメインに使用され、一つのモジュールはサブドメインに対応しています。まず次の例を見ます。
modules.py:

from flask import Blueprint

public = Blueprint('public', __name__)

@public.route('/')
def home():
  return 'hello flask'
app.py:

app = Flask(__name__)
app.config['SERVER_NAME'] = 'example.com'
from modules import public
app.register_blueprint(public, subdomain='public')

public.example.com/を通じてpublicモジュールにアクセスできます。
ワイルドカードのサブドメイン
ワイルドカードのサブドメイン、すなわちモジュールを通じて多くのサブドメインにマッチします。例えば、いくつかのサイトが提供している個人化ドメインの機能は、このような形です。
まず、セグメントの例コードを見てください。
modules.py:

from flask import Blueprint

member = Blueprint('member', __name__)

@member.route('/')
def home():
  return g.subdomain
app.py:

app = Flask(__name__)
app.config['SERVER_NAME'] = 'example.com'
from modules import member
app.register_blueprint(member, subdomain='<subdomain>')

このコードは前のセクションと似ていますが、ここのsubdomainはダイナミックパラメータ<subdomain>を使用しています。このパラメータを用いて、フィードバック関数を要求する前に組み合わせられたurlプロセッサを利用して、関連するユーザを取得することができます。そうすれば、私たちは***.example.comという形でメンバーモジュールにアクセスできます。
以下は、FlashkまたはBlueprintの任意のオブジェクトのためのサブドメイン名サポートを追加するための便利な関数です。

def add_subdomain_to_global(endpoint, values):
  g.subdomain = values.pop('subdomain', None)

def add_subdomain_to_url_params(endpoint, values):
  if not 'subdomain' in values:
    values['subdomain'] = g.subdomain

def add_subdomain_support(app):
  app.url_value_preprocessor(add_subdomain_to_global)
  app.url_defaults(add_subdomain_to_url_params)

それから、before_を使ってもいいです。requestコールバック関数は、サブドメインを処理するために使用されます。

add_subdomain_support(blueprint)

@blueprint.before_request
def add_user_to_global():
  g.user = None
  if g.subdomain:
    g.user = User.query.filter_by(username=g.subdomain).first_or_404()

ここのblueprintは実際の対象に変えてください。
特別な説明:ワイルドカードのサブドメインのデバッグはあまり便利ではないです。ドメイン名の解析が必要です。hostsファイルを修正してドメイン名を指定する方法はいけません。本機のデバッグ時には、DNSサーバー(例えば、LINUX BINDサービスなど)をインストールし、ドメイン名解析を行い、デバッグを行うことができます。もちろん、インターネットのドメイン名とサーバーを使ってデバッグしてもいいです。
PS:
1.もしあるblueprintがデフォルトで実用a.domann.comを必要とするなら、blueprintを定義する時:

a=Blueprint(‘a' ,__name__,subdomain='a')
このように、bpの下の全てのurl routingはa.domail.com/xxxです。
2.ある具体的なurl routing定義において、a.domann.comを実用化する必要があれば、こう書きます。

@www.route(‘/hello',methods=['GET','POST'],subdomain='a')
def xxx():
…..
3.私は具体的に実践していますが、デフォルトのroutingは全部歩いています。init_.py中:

app.url_map.default_subdomain='www'
実はデフォルトのサブドメインを設定して、このようにデフォルトで設定しないと、ルートはwwwです。
この時domann.comを訪問すれば、wwwを持っていないと、404を申し込みます。どうすればいいですか?私はnginxレベルでこの問題を解決したので、nginx.comでserverを追加します。

server {
server_name domain.com;
rewrite ^(.*) http://www.domain.com$1 permanent;
}