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实现删除Android工程中的冗余字符串
Jan 19 Python
Python中的__slots__示例详解
Jul 06 Python
python实现用户答题功能
Jan 17 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
python 生成图形验证码的方法示例
Nov 11 Python
学生信息管理系统Python面向对象版
Jan 30 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
Django将默认的SQLite更换为MySQL的实现
Nov 18 Python
Python如何基于smtplib发不同格式的邮件
Dec 30 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
Feb 05 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
python中slice参数过长的处理方法及实例
Dec 15 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 编写大型网站问题集
2010/05/07 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
用JS写的一个TableView控件代码
2010/01/23 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
python中的字典操作及字典函数
2018/01/03 Python
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
解决python "No module named pip" 的问题
2018/10/13 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
python实现可逆简单的加密算法
2019/03/22 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
python爬虫之遍历单个域名
2019/11/20 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
公司委托书格式范本
2014/09/16 职场文书
学生检讨书怎么写
2014/10/09 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
一篇带你入门Java垃圾回收器
2021/06/16 Java/Android
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android
关于nginx 实现jira反向代理的问题
2021/09/25 Servers
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
2022/04/14 Python