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中的yield使用方法
Feb 11 Python
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
Aug 25 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
TensorFlow实现iris数据集线性回归
Sep 07 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
Oct 28 Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 Python
python数值基础知识浅析
Nov 19 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
python中列表的含义及用法
May 26 Python
Python 跨.py文件调用自定义函数说明
Jun 01 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获得文件扩展名三法
2006/11/25 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
layui 弹出层回调获取弹出层数据的例子
2019/09/02 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
Vue实现验证码功能
2019/12/03 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
python中dir函数用法分析
2015/04/17 Python
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
Python标准库sched模块使用指南
2017/07/06 Python
Python实现求数列和的方法示例
2018/01/12 Python
Numpy之文件存取的示例代码
2018/08/03 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
详解python和matlab的优势与区别
2019/06/28 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
幽默自我介绍演讲稿
2014/08/21 职场文书
离婚协议书范本2014
2014/10/27 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
2015暑假假期总结
2015/07/13 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
初中思想品德教学反思
2016/02/24 职场文书
python中 .npy文件的读写操作实例
2022/04/14 Python