PythonのFlashkフレームに複数のサブドメインを配置する方法を説明します。
Flashkサブドメイン名
一般的に少数のサブドメインに使用され、一つのモジュールはサブドメインに対応しています。まず次の例を見ます。
modules.py:
ワイルドカードのサブドメイン
ワイルドカードのサブドメイン、すなわちモジュールを通じて多くのサブドメインにマッチします。例えば、いくつかのサイトが提供している個人化ドメインの機能は、このような形です。
まず、セグメントの例コードを見てください。
modules.py:
以下は、FlashkまたはBlueprintの任意のオブジェクトのためのサブドメイン名サポートを追加するための便利な関数です。
特別な説明:ワイルドカードのサブドメインのデバッグはあまり便利ではないです。ドメイン名の解析が必要です。hostsファイルを修正してドメイン名を指定する方法はいけません。本機のデバッグ時には、DNSサーバー(例えば、LINUX BINDサービスなど)をインストールし、ドメイン名解析を行い、デバッグを行うことができます。もちろん、インターネットのドメイン名とサーバーを使ってデバッグしてもいいです。
PS:
1.もしあるblueprintがデフォルトで実用a.domann.comを必要とするなら、blueprintを定義する時:
2.ある具体的なurl routing定義において、a.domann.comを実用化する必要があれば、こう書きます。
この時domann.comを訪問すれば、wwwを持っていないと、404を申し込みます。どうすればいいですか?私はnginxレベルでこの問題を解決したので、nginx.comでserverを追加します。
一般的に少数のサブドメインに使用され、一つのモジュールはサブドメインに対応しています。まず次の例を見ます。
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;
}