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实现目录树生成示例
Mar 28 Python
在Python中使用PIL模块处理图像的教程
Apr 29 Python
详解Django中的过滤器
Jul 16 Python
python简单分割文件的方法
Jul 30 Python
Python 自动刷博客浏览量实例代码
Jun 14 Python
如何使用VSCode愉快的写Python于调试配置步骤
Apr 06 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
Selenium的使用详解
Oct 19 Python
深入了解Django中间件及其方法
Jul 26 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
Oct 24 Python
python实现Thrift服务端的方法
Apr 20 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 FPDF类库应用实现代码
2009/03/20 PHP
PHP APC缓存配置、使用详解
2014/03/06 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
JS实现转动随机数抽奖特效代码
2020/04/16 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
python 排列组合之itertools
2013/03/20 Python
Python中Collections模块的Counter容器类使用教程
2016/05/31 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
python处理RSTP视频流过程解析
2020/01/11 Python
tensorflow 模型权重导出实例
2020/01/24 Python
如何在django中添加日志功能
2020/02/06 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
运行时异常与一般异常有何异同?
2014/01/05 面试题
什么是规则表达式
2012/05/03 面试题
2014年中班下学期工作总结
2014/12/11 职场文书
网络营销计划
2015/01/17 职场文书
解析Redis Cluster原理
2021/06/21 Redis
Python 阶乘详解
2021/10/05 Python