gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python的Flask框架中配置多个子域名的方法讲解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

Flask子域名 一般用于数量比较少的子域名,一个模块对应一个子域名。先看下面一个例子:

modules.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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对象增加子域名支持的便捷函数:

?
1
2
3
4
5
6
7
8
9
10
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回调函数来处理子域名:

?
1
2
3
4
5
6
7
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时候:

?
1
a = Blueprint(‘a ' ,__name__,subdomain=' a')

这样,该bp下面的所有url routing走的都是a.domain.com/xxx 。

2.在某个具体的url routing定义时,如果需要实用a.domain.com,那么这么写:

?
1
2
3
@www .route(‘ / hello ',methods=[' GET ',' POST '],subdomain=' a')
def xxx():
…..

3.我在具体实践中,默认的routing都是走的www,这是在__init__.py中:

?
1
app.url_map.default_subdomain = 'www'

其实就是设置默认子域名,这样默认不做设置的话,路由走的就是www。 那这个时候如果访问domain.com,即不带www的话,就会报404了,怎么办呢,我是在nginx层面解决这个问题的,在nginx.conf增加一个server

?
1
2
3
4
server {
server_name domain.com;
rewrite ^(.*) http://www.domain.com$1 permanent;
}

最后此篇关于Python的Flask框架中配置多个子域名的方法讲解的文章就讲到这里了,如果你想了解更多关于Python的Flask框架中配置多个子域名的方法讲解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com