Python的Flask框架中配置多個(gè)子域名的方法講解
Flask子域名
一般用于數(shù)量比較少的子域名,一個(gè)模塊對(duì)應(yīng)一個(gè)子域名。先看下面一個(gè)例子:
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')
現(xiàn)在可以通過(guò)public.example.com/來(lái)訪問(wèn)public模塊了。
通配符子域
通配符子域,即通過(guò)一個(gè)模塊來(lái)匹配很多個(gè)子域名。比如某些網(wǎng)站提供的個(gè)性化域名功能,就是這種形式。
先來(lái)看段示例代碼:
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>')
這段代碼和上一節(jié)的第像,不同之處是這里的subdomain使用了動(dòng)態(tài)參數(shù)<subdomain>(路由中的URL變量也是這種方式)。我們可以用這個(gè)參數(shù)在請(qǐng)求回調(diào)函數(shù)之前利用的組合的url處理器來(lái)獲取相關(guān)的用戶。這樣我們就可以通過(guò)*.example.com的形式來(lái)訪問(wèn)member模塊了。
下面是為任何Flask或Blueprint對(duì)象增加子域名支持的便捷函數(shù):
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回調(diào)函數(shù)來(lái)處理子域名:
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請(qǐng)改為實(shí)際對(duì)象。
特別說(shuō)明:通配符子域調(diào)試不是不太方便,需要做泛域名解析才可以。修改hosts文件來(lái)指定域名的方法是不可行的(子域名較少時(shí)可以逐個(gè)添加,子域名多了就不太現(xiàn)實(shí)了)。本機(jī)調(diào)試時(shí),可以安裝DNS服務(wù)器(比如LINUX BIND服務(wù)等),并做好泛域名解析,然后再進(jìn)行調(diào)試。當(dāng)然使用公網(wǎng)域名和服務(wù)器來(lái)調(diào)試也未嘗不可。
PS:
1.如果某個(gè)blueprint默認(rèn)就需要實(shí)用a.domain.com,那么在定義blueprint時(shí)候:
a=Blueprint(‘a(chǎn)' ,__name__,subdomain='a')
這樣,該bp下面的所有url routing走的都是a.domain.com/xxx
2.在某個(gè)具體的url routing定義時(shí),如果需要實(shí)用a.domain.com,那么這么寫:
@www.route(‘/hello',methods=['GET','POST'],subdomain='a') def xxx(): …..
3.我在具體實(shí)踐中,默認(rèn)的routing都是走的www,這是在__init__.py中:
app.url_map.default_subdomain='www'
其實(shí)就是設(shè)置默認(rèn)子域名,這樣默認(rèn)不做設(shè)置的話,路由走的就是www。
那這個(gè)時(shí)候如果訪問(wèn)domain.com,即不帶www的話,就會(huì)報(bào)404了,怎么辦呢,我是在nginx層面解決這個(gè)問(wèn)題的,在nginx.conf增加一個(gè)server:
server {
server_name domain.com;
rewrite ^(.*) http://www.domain.com$1 permanent;
}
相關(guān)文章
Python虛擬環(huán)境終極(含PyCharm的使用教程)
這篇文章主要介紹了Python虛擬環(huán)境終極(含PyCharm的使用教程),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
python分布式系統(tǒng)Celery安裝使用實(shí)例講解
這篇文章主要為大家介紹了python分布式系統(tǒng)Celery安裝使用實(shí)例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
tensorflow 實(shí)現(xiàn)自定義梯度反向傳播代碼
今天小編就為大家分享一篇tensorflow 實(shí)現(xiàn)自定義梯度反向傳播代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
Python3.10動(dòng)態(tài)修改Windows系統(tǒng)本地IP地址
這篇文章主要介紹了Python3.10動(dòng)態(tài)修改Windows系統(tǒng)本地IP地址,需要的朋友可以參考下2023-05-05
python基于socket實(shí)現(xiàn)的UDP及TCP通訊功能示例
這篇文章主要介紹了python基于socket實(shí)現(xiàn)的UDP及TCP通訊功能,結(jié)合實(shí)例形式分析了基于Python socket模塊的UDP及TCP通信相關(guān)客戶端、服務(wù)器端實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-11-11
3個(gè)用于數(shù)據(jù)科學(xué)的頂級(jí)Python庫(kù)
今天小編就為大家分享一篇關(guān)于3個(gè)用于數(shù)據(jù)科學(xué)的頂級(jí)Python庫(kù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-09-09
基于Pytorch實(shí)現(xiàn)分類器的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何基于Pytorch實(shí)現(xiàn)兩個(gè)分類器:?softmax分類器和感知機(jī)分類器,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-04-04
Python關(guān)于抽獎(jiǎng)系統(tǒng)的思考與設(shè)計(jì)思路
這篇文章主要介紹了Python關(guān)于抽獎(jiǎng)系統(tǒng)的思考與設(shè)計(jì)思路,本文通過(guò)一些簡(jiǎn)單的例子來(lái)說(shuō)一說(shuō)抽獎(jiǎng)系統(tǒng)背后的邏輯,看看究竟是你運(yùn)氣不好還是系統(tǒng)邏輯在作怪,需要的朋友可以參考下2023-03-03

