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 27 Python
Python字符串中查找子串小技巧
Apr 10 Python
Python使用Supervisor来管理进程的方法
May 28 Python
在Python的Django框架中simple-todo工具的简单使用
May 30 Python
简单了解什么是神经网络
Dec 23 Python
django开发post接口简单案例,获取参数值的方法
Dec 11 Python
Python 占位符的使用方法详解
Jul 10 Python
python提取照片坐标信息的实例代码
Aug 14 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
Django中modelform组件实例用法总结
Feb 10 Python
在python tkinter界面中添加按钮的实例
Mar 04 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
如何开发一个虚拟域名系统
2006/10/09 PHP
PHP数组实例总结与说明
2011/08/23 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
jquery对表单操作2
2011/04/06 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
javascript解析json实例详解
2014/11/05 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
Python单例模式的两种实现方法
2017/08/14 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
python入门前的第一课 python怎样入门
2018/03/06 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
浅谈python之新式类
2018/08/12 Python
求职自荐书范文
2013/12/04 职场文书
追悼会上的答谢词
2014/01/10 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
计算机实训报告总结
2014/11/05 职场文书
保研推荐信范文
2015/03/25 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
婚宴领导致辞
2015/07/28 职场文书
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
Python合并多张图片成PDF
2021/06/09 Python
关于Redis的主从复制及哨兵问题
2022/06/16 Redis