国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python的Flask框架中配置多個子域名的方法講解

2019-11-25 16:45:01
字體:
來源:轉載
供稿:網友

Flask子域名
一般用于數量比較少的子域名,一個模塊對應一個子域名。先看下面一個例子:

modules.py:

from flask import Blueprintpublic = Blueprint('public', __name__)@public.route('/')def home():  return 'hello flask'app.py:app = Flask(__name__)app.config['SERVER_NAME'] = 'example.com'from modules import publicapp.register_blueprint(public, subdomain='public')

現在可以通過public.example.com/來訪問public模塊了。

通配符子域
通配符子域,即通過一個模塊來匹配很多個子域名。比如某些網站提供的個性化域名功能,就是這種形式。

先來看段示例代碼:

modules.py:

from flask import Blueprintmember = Blueprint('member', __name__)@member.route('/')def home():  return g.subdomainapp.py:app = Flask(__name__)app.config['SERVER_NAME'] = 'example.com'from modules import memberapp.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.subdomaindef 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_requestdef 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;}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 陇南市| 渝中区| 建阳市| 南平市| 商南县| 中西区| 藁城市| 泰州市| 镇巴县| 合山市| 潮州市| 凤山县| 招远市| 绥中县| 通渭县| 遂昌县| 香河县| 罗江县| 依安县| 申扎县| 井冈山市| 长子县| 绵阳市| 紫云| 仙游县| 黄平县| 南和县| 永修县| 南丹县| 东方市| 绿春县| 社会| 河曲县| 乳源| 辽阳市| 平定县| 县级市| 江西省| 全椒县| 浮山县| 巨野县|