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 08 Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
python生成器,可迭代对象,迭代器区别和联系
Feb 04 Python
numpy 计算两个数组重复程度的方法
Nov 07 Python
pytorch sampler对数据进行采样的实现
Dec 31 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
Python中常见的数制转换有哪些
May 27 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
Sep 16 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 Python
python 利用jieba.analyse进行 关键词提取
Dec 17 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 什么是PEAR?(第三篇)
2009/03/19 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
Python遍历目录的4种方法实例介绍
2015/04/13 Python
windows下python和pip安装教程
2018/05/25 Python
python调用java的jar包方法
2018/12/15 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
python中比较两个列表的实例方法
2019/07/04 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
聊聊python中的异常嵌套
2020/09/01 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
幼儿如何来做好自我评价
2013/11/05 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
自我查摆剖析材料
2014/10/11 职场文书
我们的节日端午节活动总结
2015/02/11 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
Python之matplotlib绘制折线图
2022/04/13 Python