Python的Flask框架中配置多個子域名的方法講解
Flask子域名
一般用于數(shù)量比較少的子域名,一個模塊對應(yīng)一個子域名。先看下面一個例子:
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)在可以通過public.example.com/來訪問public模塊了。
通配符子域
通配符子域,即通過一個模塊來匹配很多個子域名。比如某些網(wǎng)站提供的個性化域名功能,就是這種形式。
先來看段示例代碼:
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使用了動態(tài)參數(shù)<subdomain>(路由中的URL變量也是這種方式)。我們可以用這個參數(shù)在請求回調(diào)函數(shù)之前利用的組合的url處理器來獲取相關(guān)的用戶。這樣我們就可以通過*.example.com的形式來訪問member模塊了。
下面是為任何Flask或Blueprint對象增加子域名支持的便捷函數(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ù)來處理子域名:
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請改為實際對象。
特別說明:通配符子域調(diào)試不是不太方便,需要做泛域名解析才可以。修改hosts文件來指定域名的方法是不可行的(子域名較少時可以逐個添加,子域名多了就不太現(xiàn)實了)。本機調(diào)試時,可以安裝DNS服務(wù)器(比如LINUX BIND服務(wù)等),并做好泛域名解析,然后再進(jìn)行調(diào)試。當(dāng)然使用公網(wǎng)域名和服務(wù)器來調(diào)試也未嘗不可。
PS:
1.如果某個blueprint默認(rèn)就需要實用a.domain.com,那么在定義blueprint時候:
a=Blueprint(‘a(chǎn)' ,__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.我在具體實踐中,默認(rèn)的routing都是走的www,這是在__init__.py中:
app.url_map.default_subdomain='www'
其實就是設(shè)置默認(rèn)子域名,這樣默認(rèn)不做設(shè)置的話,路由走的就是www。
那這個時候如果訪問domain.com,即不帶www的話,就會報404了,怎么辦呢,我是在nginx層面解決這個問題的,在nginx.conf增加一個server:
server { server_name domain.com; rewrite ^(.*) http://www.domain.com$1 permanent; }
相關(guān)文章
Python3網(wǎng)絡(luò)爬蟲中的requests高級用法詳解
本節(jié)我們再來了解下 Requests 的一些高級用法,如文件上傳,代理設(shè)置,Cookies 設(shè)置等等。感興趣的朋友跟隨小編一起看看吧2019-06-06Python linecache.getline()讀取文件中特定一行的腳本
Python中使用標(biāo)準(zhǔn)庫中的linecache中的getline方法可以從某個文件中讀取出特定的一行。2008-09-09Python中enumerate()函數(shù)編寫更Pythonic的循環(huán)
本篇文章主要大家通過實例講述了Python中enumerate()函數(shù)編寫更Pythonic的循環(huán)的知識點,有興趣的朋友參考學(xué)習(xí)下。2018-03-03小白教你PyCharm從下載到安裝再到科學(xué)使用PyCharm2020最新激活碼
這篇文章主要介紹了PyCharm最新版從下載到安裝再到科學(xué)使用PyCharm2020最新激活碼,需要的朋友可以參考下2020-09-09