Flask子域名及通配符子域

以前的文章中,咱們講到Flask中的SERVER_NAME主要作兩件事:flask

  1. 協助Flask生成請求上下文以外的URL(好比郵件)
  2. 用於子域名支持

今天咱們就來說講子域名這部分。segmentfault

Flask子域名

通常用於數量比較少的子域名,一個模塊對應一個子域名。先看下面一個例子:服務器

modules.py:app

from flask import Blueprint

public = Blueprint('public', __name__)

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

app.py:dom

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

如今能夠經過public.example.com/來訪問public模塊了。函數

通配符子域

通配符子域,即經過一個模塊來匹配不少個子域名。好比某些網站提供的個性化域名功能,就是這種形式。網站

先來看段示例代碼:url

modules.py:調試

from flask import Blueprint

member = Blueprint('member', __name__)

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

app.py:code

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

這段代碼和上一節的第像,不一樣之處是這裏的subdomain使用了動態參數<subdomain>(路由中的URL變量也是這種方式)。咱們能夠用這個參數在請求回調函數以前利用的組合的url處理器來獲取相關的用戶。這樣咱們就能夠經過*.example.com的形式來訪問member模塊了。

下面是爲任何FlaskBlueprint對象增長子域名支持的便捷函數:

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服務等),並作好泛域名解析,而後再進行調試。固然使用公網域名和服務器來調試也何嘗不可。

英文好的同窗能夠參閱:Getting bigger with Flask

原文:http://flask123.sinaapp.com/article/45/

相關文章
相關標籤/搜索