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生成随机验证码(中文验证码)示例
Apr 03 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
python爬取个性签名的方法
Jun 17 Python
Python3日期与时间戳转换的几种方法详解
Jun 04 Python
python实现两个文件夹的同步
Aug 29 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
python应用文件读取与登录注册功能
Sep 23 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
Python中qutip用法示例详解
Oct 02 Python
python使用selenium爬虫知乎的方法示例
Oct 28 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
CI框架常用方法小结
2016/05/17 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
2019/05/21 Javascript
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
Python多项式回归的实现方法
2019/03/11 Python
微信小程序python用户认证的实现
2019/07/29 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
python退出循环的方法
2020/06/18 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
Java里面StringBuilder和StringBuffer有什么区别
2016/06/06 面试题
小学教师师德师风演讲稿
2014/08/22 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
讲座新闻稿
2015/07/18 职场文书
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL