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网络编程学习笔记(三):socket网络服务器
Jun 09 Python
使用python获取csv文本的某行或某列数据的实例
Apr 03 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
Python+OpenCV目标跟踪实现基本的运动检测
Jul 10 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
python实现拼图小游戏
Feb 22 Python
python pandas移动窗口函数rolling的用法
Feb 29 Python
Python基于DB-API操作MySQL数据库过程解析
Apr 23 Python
Python爬虫requests库多种用法实例
May 28 Python
Python实现异步IO的示例
Nov 05 Python
python process模块的使用简介
May 14 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编写大型网站问题集
2007/03/06 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Python使用剪切板的方法
2017/06/06 Python
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
对pandas里的loc并列条件索引的实例讲解
2018/11/15 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
tensorflow没有output结点,存储成pb文件的例子
2020/01/04 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
Python如何批量生成和调用变量
2020/11/21 Python
python sleep和wait对比总结
2021/02/03 Python
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
绩效专员岗位职责
2013/12/02 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
编写python程序的90条建议
2021/04/14 Python
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技
Nginx报404错误的详细解决方法
2022/07/23 Servers