Python的Flask框架中配置多个子域名的方法讲解


Posted in Python onJune 07, 2016

Flask子域名
一般用于数量比较少的子域名,一个模块对应一个子域名。先看下面一个例子:

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变量也是这种方式)。我们可以用这个参数在请求回调函数之前利用的组合的url处理器来获取相关的用户。这样我们就可以通过*.example.com的形式来访问member模块了。

下面是为任何Flask或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.domain.com,那么在定义blueprint时候:

a=Blueprint(‘a' ,__name__,subdomain='a')

这样,该bp下面的所有url routing走的都是a.domain.com/xxx

2.在某个具体的url routing定义时,如果需要实用a.domain.com,那么这么写:

@www.route(‘/hello',methods=['GET','POST'],subdomain='a')
def xxx():
…..

3.我在具体实践中,默认的routing都是走的www,这是在__init__.py中:

app.url_map.default_subdomain='www'

其实就是设置默认子域名,这样默认不做设置的话,路由走的就是www。
那这个时候如果访问domain.com,即不带www的话,就会报404了,怎么办呢,我是在nginx层面解决这个问题的,在nginx.conf增加一个server:

server {
server_name domain.com;
rewrite ^(.*) http://www.domain.com$1 permanent;
}
Python 相关文章推荐
Python发送以整个文件夹的内容为附件的邮件的教程
May 06 Python
Python制作爬虫抓取美女图
Jan 20 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
python实现对象列表根据某个属性排序的方法详解
Jun 11 Python
python 字典操作提取key,value的方法
Jun 26 Python
基于python调用psutil模块过程解析
Dec 20 Python
python实现代码审查自动回复消息
Feb 01 Python
Python中的程序流程控制语句
Feb 24 Python
Python利用zhdate模块实现农历日期处理
Mar 31 Python
Python  lambda匿名函数和三元运算符
Apr 19 Python
python3批量删除豆瓣分组下的好友的实现代码
Jun 07 #Python
python实现多线程的方式及多条命令并发执行
Jun 07 #Python
python多线程方式执行多个bat代码
Jun 07 #Python
使用rst2pdf实现将sphinx生成PDF
Jun 07 #Python
python监控文件或目录变化
Jun 07 #Python
浅析Python中的多条件排序实现
Jun 07 #Python
Python卸载模块的方法汇总
Jun 07 #Python
You might like
php完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
php在线解压ZIP文件的方法
2014/12/30 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
python使用心得之获得github代码库列表
2014/06/25 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
使用Kivy将python程序打包为apk文件
2017/07/29 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
俄罗斯天然和有机产品、健康生活网上商店:Fitomarket.ru
2020/10/09 全球购物
小学生国庆节演讲稿
2014/09/05 职场文书
个人授权委托书范本
2014/09/14 职场文书
先进个人总结范文
2015/02/15 职场文书
外出培训学习心得体会
2016/01/18 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
小学作文之描写天气
2019/08/15 职场文书
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL