Python的Flask框架中配置多个子域名的方法讲解

 更新时间:2016年06月07日 15:56:49   作者:digwtx  
Fask中可以通过通配符子域的方式来部署多个子域名,这里我们就来作一个Python的Flask框架中配置多个子域名的方法讲解,需要的朋友可以参考下

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虚拟环境终极(含PyCharm的使用教程)

    Python虚拟环境终极(含PyCharm的使用教程)

    这篇文章主要介绍了Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Python GUI布局尺寸适配方法

    Python GUI布局尺寸适配方法

    今天小编就为大家分享一篇Python GUI布局尺寸适配方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python正则匹配查询办理进度示例分享

    python正则匹配查询办理进度示例分享

    分享原创的一段查询通行证办理进度查询的python 3.3代码,利用socket请求相关网站,获得结果后利用正则找出办理进度
    2013-12-12
  • python分布式系统Celery安装使用实例讲解

    python分布式系统Celery安装使用实例讲解

    这篇文章主要为大家介绍了python分布式系统Celery安装使用实例讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • tensorflow 实现自定义梯度反向传播代码

    tensorflow 实现自定义梯度反向传播代码

    今天小编就为大家分享一篇tensorflow 实现自定义梯度反向传播代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python3.10动态修改Windows系统本地IP地址

    Python3.10动态修改Windows系统本地IP地址

    这篇文章主要介绍了Python3.10动态修改Windows系统本地IP地址,需要的朋友可以参考下
    2023-05-05
  • python基于socket实现的UDP及TCP通讯功能示例

    python基于socket实现的UDP及TCP通讯功能示例

    这篇文章主要介绍了python基于socket实现的UDP及TCP通讯功能,结合实例形式分析了基于Python socket模块的UDP及TCP通信相关客户端、服务器端实现技巧,需要的朋友可以参考下
    2019-11-11
  • 3个用于数据科学的顶级Python库

    3个用于数据科学的顶级Python库

    今天小编就为大家分享一篇关于3个用于数据科学的顶级Python库,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-09-09
  • 基于Pytorch实现分类器的示例详解

    基于Pytorch实现分类器的示例详解

    这篇文章主要为大家详细介绍了如何基于Pytorch实现两个分类器: softmax分类器和感知机分类器,文中的示例代码讲解详细,需要的可以参考一下
    2023-04-04
  • Python关于抽奖系统的思考与设计思路

    Python关于抽奖系统的思考与设计思路

    这篇文章主要介绍了Python关于抽奖系统的思考与设计思路,本文通过一些简单的例子来说一说抽奖系统背后的逻辑,看看究竟是你运气不好还是系统逻辑在作怪,需要的朋友可以参考下
    2023-03-03

最新评论