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科学计算环境推荐——Anaconda
Jun 30 Python
Python去除列表中重复元素的方法
Mar 20 Python
Python获取某一天是星期几的方法示例
Jan 17 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
Python实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
Python实现的rsa加密算法详解
Jan 24 Python
Python检测网络延迟的代码
May 15 Python
python opencv3实现人脸识别(windows)
May 25 Python
python 实时得到cpu和内存的使用情况方法
Jun 11 Python
python中count函数简单的实例讲解
Feb 06 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 Python
matplotlib阶梯图的实现(step())
Mar 02 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
精通php的十大要点(上)
2009/02/04 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
juqery 学习之三 选择器 简单 内容
2010/11/25 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
python实现给数组按片赋值的方法
2015/07/28 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
创伤外科专业推荐信范文
2013/11/19 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
课例研修方案
2014/05/31 职场文书
公司员工培训管理制度
2015/08/04 职场文书
变长双向rnn的正确使用姿势教学
2021/05/31 Python
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
python库sklearn常用操作
2021/08/23 Python