Python的Flask框架中配置多个子域名的方法讲解
作者:digwtx 发布时间:2021-03-06 19:46:32
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;
}


猜你喜欢
- 先来介绍一些不使用脚本我们直接使用命令备份与还原oracle数据库Oracle数据备份:步骤 1 备份用户数据。1.使用linux系统下的数
- Upload组件是自带上传进度,但是样式调起来很麻烦,我们要做的就是自定义一个首先页面要引入组件 Upload, Progressuploa
- 本文实例讲述了Mysql存储过程中游标的用法。分享给大家供大家参考。具体如下:1. 批量插入商户路由关联数据:DELIMITER $$USE
- 本文实例讲述了python中Flask框架的简单用法。分享给大家供大家参考。具体如下:使用Flask框架的简单入门范例代码,如果你正学习Fl
- 前言为了往我们写好的Python代码传入参数,有很多种方法,比如使用input获取从DOS 输入的参数,又或者读取txt 文件中的字符作为参
- asp如何显示全部的环境变量?<%@Language="VBScript"%><%dim H
- 通过exec可以执行动态Python代码,类似Javascript的eval功能;而Python中的eval函数可以计算Python表达式,
- 前言最近由于在寻找方向上迷失自我,准备了解更多的计算机视觉任务重的模型。看到语义分割任务重Unet一个有意思的模型,我准备来复现一下它。一、
- 本文实例为大家分享了linux采用binary方式安装mysql的具体步骤,供大家参考,具体内容如下1、下载binary文件在官网上下载 m
- Pandas中根据列的值选取多行数据 # 选取等于某些值的行记录 用 == df.loc[df['column_name']
- 在windows7下安装SQL2005时会提示不兼容,需要安装SQL2005 SP3或更高的版本,不用管它,一路安装下去,等装完在开始菜单没
- 又一个js加密工具:js混淆,完整源代码如下,有点长呵呵:<HTML><HEAD><TITLE>Cunf
- 摘要:不同方法读取excel中的多个不同sheet表格性能比较# 方法1def read_excel(path): df=pd.
- 本文实例讲述了Python使用dict.fromkeys()快速生成一个字典。分享给大家供大家参考,具体如下:>>> re
- 利用python代码生成一个随机的MAC地址,使用python网络编程时或可用上,如果使用scapy模块则可直接利用RandMAC()函数来
- 我就废话不多说了,大家还是直接看代码吧~import pandas as pdimport numpy as npcolumns = [[&
- IE6下浮出层常会需要增加一个iframe来解决浮出层被Obj穿透的问题,这个是目前最有效的方案,不过这个方案本身有个缺陷,就是iframe
- 本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下目录简介实现过程结语简介使用python实现pygame版的五
- 对很多从事产品工作的同事来说,“以用户为中心”是工作的重点,同时也是难点。用户的心思难以捉摸,用户研究的工作也似乎高深莫测。不过,用户研究并
- Python的环境变量环境变量说明PYTHONSTARTUP在交互式启动时执行的文件(无默认值)PYTHONPATH‘:' - 以默