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使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
python检查指定文件是否存在的方法
Jul 06 Python
python学习之面向对象【入门初级篇】
Jan 21 Python
python实现日常记账本小程序
Mar 10 Python
windows10下python3.5 pip3安装图文教程
Apr 02 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
pytorch 预训练层的使用方法
Aug 20 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
Python hmac模块使用实例解析
Dec 24 Python
给ubuntu18安装python3.7的详细教程
Jun 08 Python
python中get和post有什么区别
Jun 19 Python
Selenium及python实现滚动操作多种方法
Jul 21 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/10/09 PHP
PHP循环获取GET和POST值的代码
2008/04/09 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
js日期、星座的级联显示代码
2014/01/23 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
Python 处理文件的几种方式
2019/08/23 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
网吧消防安全制度
2014/01/28 职场文书
求职简历自荐信
2014/06/18 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
颐和园导游词400字
2015/01/30 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
停电通知范文
2015/04/16 职场文书
欠条格式范本
2015/07/03 职场文书
运动会新闻报道稿
2015/07/22 职场文书
仓库管理制度范本
2015/08/04 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA
python计算列表元素与乘积详情
2022/08/05 Python