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实现2048小游戏
Mar 30 Python
Python中的匿名函数使用简介
Apr 27 Python
python模块简介之有序字典(OrderedDict)
Dec 01 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
python之yield和Generator深入解析
Sep 18 Python
python+opencv边缘提取与各函数参数解析
Mar 09 Python
Python读取JSON数据操作实例解析
May 18 Python
Python操作Elasticsearch处理timeout超时
Jul 17 Python
浅谈Python爬虫原理与数据抓取
Jul 21 Python
Python 如何利用ffmpeg 处理视频素材
Nov 27 Python
Python OpenGL基本配置方式
May 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中防止恶意刷新页面的代码小结
2012/10/31 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
PHP+Javascript实现在线拍照功能实例
2015/07/18 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
带你了解python装饰器
2017/06/15 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
Python关于反射的实例代码分享
2020/02/20 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
高分子材料与工程专业推荐信
2013/12/01 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
贷款担保申请书
2014/05/20 职场文书
竞聘自述材料
2014/08/25 职场文书
厉行节约工作总结
2015/08/12 职场文书
高中生物教学反思
2016/02/20 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python