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/

相关文章
相关标签/搜索