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 通过URL打开图片实例详解
Jun 01 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
python版本的仿windows计划任务工具
Apr 30 Python
Python发送邮件功能示例【使用QQ邮箱】
Dec 04 Python
Python实现的文轩网爬虫完整示例
May 16 Python
解决python 文本过滤和清理问题
Aug 28 Python
使用python3批量下载rbsp数据的示例代码
Dec 20 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
python3实现飞机大战
Nov 29 Python
Ubuntu20下的Django安装的方法步骤
Jan 24 Python
Python爬虫之自动爬取某车之家各车销售数据
Jun 02 Python
Python使用openpyxl模块处理Excel文件
Jun 05 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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
在PHP中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
2013/06/18 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
php 可变函数使用小结
2018/06/12 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
Python描述器descriptor详解
2015/02/03 Python
Python list操作用法总结
2015/11/10 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
python实现根据文件格式分类
2019/10/31 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
巴西在线鞋店:Shoestock
2017/10/28 全球购物
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
西安众合通用.net笔试题
2013/03/18 面试题
求职推荐信
2013/10/28 职场文书
公司年会抽奖活动主持词
2014/03/31 职场文书
师范生见习总结范文
2015/06/23 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android