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简单网络编程示例【客户端与服务端】
May 26 Python
python学习之matplotlib绘制散点图实例
Dec 09 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
Python一行代码实现快速排序的方法
Apr 30 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
使用python os模块复制文件到指定文件夹的方法
Aug 22 Python
Python数组并集交集补集代码实例
Feb 18 Python
Python利用FFT进行简单滤波的实现
Feb 26 Python
python使用Word2Vec进行情感分析解析
Jul 31 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
梳理总结Python开发中需要摒弃的18个坏习惯
Jan 22 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下载excel无法打开的解决方法
2013/12/24 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
基于node.js的快速开发透明代理
2010/12/25 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
2017/03/04 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
JavaScript canvas绘制渐变颜色的矩形
2020/02/18 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
简单谈谈Python中的json与pickle
2017/07/19 Python
Python实现购物程序思路及代码
2017/07/24 Python
Django中create和save方法的不同
2019/08/13 Python
使用Python实现画一个中国地图
2019/11/23 Python
详解FireFox下Canvas使用图像合成绘制SVG的Bug
2019/07/10 HTML / CSS
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
经典公益广告词
2014/03/13 职场文书
劲霸男装广告词
2014/03/21 职场文书
员工保密承诺书
2014/05/28 职场文书
暑假学习心得体会
2014/09/02 职场文书
车辆转让协议书
2014/09/24 职场文书
药店收银员岗位职责
2015/04/07 职场文书
新员工入职感想
2015/08/07 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python
php7中停止php-fpm服务的方法详解
2021/05/09 PHP