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中内置的NotImplemented类型的用法
Mar 31 Python
python实现ping的方法
Jul 06 Python
深入解析Python编程中JSON模块的使用
Oct 15 Python
Python删除Java源文件中全部注释的实现方法
Aug 30 Python
Python虚拟环境项目实例
Nov 20 Python
详谈python3 numpy-loadtxt的编码问题
Apr 29 Python
python 重定向获取真实url的方法
May 11 Python
利用Anaconda简单安装scrapy框架的方法
Jun 13 Python
DRF跨域后端解决之django-cors-headers的使用
Jan 27 Python
python获取txt文件词向量过程详解
Jul 05 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 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截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
React组件生命周期详解
2017/07/03 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
在Linux下调试Python代码的各种方法
2015/04/17 Python
Python 异常处理的实例详解
2017/09/11 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
Python中的类与类型示例详解
2019/07/10 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
学生的自我鉴定范文
2013/10/24 职场文书
初婚未育未抱养证明
2014/01/12 职场文书
铁路工务反思材料
2014/02/07 职场文书
学习保证书范文
2014/04/30 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
党员自我剖析材料(群众路线)
2014/10/06 职场文书
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers