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日志模块logging简介
Apr 13 Python
python插入排序算法实例分析
Jul 03 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
python中的字典操作及字典函数
Jan 03 Python
python matlibplot绘制3D图形
Jul 02 Python
在Python中关于使用os模块遍历目录的实现方法
Jan 03 Python
Python实现对特定列表进行从小到大排序操作示例
Feb 11 Python
Python时间序列缺失值的处理方法(日期缺失填充)
Aug 11 Python
python实现身份证实名认证的方法实例
Nov 08 Python
Python return语句如何实现结果返回调用
Oct 15 Python
Python一些基本的图像操作和处理总结
Jun 23 Python
分享几种python 变量合并方法
Mar 20 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基础学习之流程控制的实现分析
2013/04/28 PHP
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
个人小程序接入支付解决方案
2019/05/23 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
Python列表对象实现原理详解
2019/07/01 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
python性能测试工具locust的使用
2020/12/28 Python
详解pandas映射与数据转换
2021/01/22 Python
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
校庆标语集锦
2014/06/25 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
初一军训感言
2015/08/01 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server