一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python的Flask框架中配置多個子域名的方法講解

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

2020-08-26 09:32digwtx Python

Fask中可以通過通配符子域的方式來部署多個子域名,這里我們就來作一個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;
}

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美精品黑人巨大在线播放 | 亚州在线| 99久久精品免费看国产高清 | 女bbbxxx毛片视频 | 97热久久免费频精品99国产成人 | 91桃花视频| 国产aaaaa一级毛片 | 涩涩五月天 | 夫妇野外交换激情 | 成人国产网站v片免费观看 成人国产精品视频 | 久久免费国产 | t66y地址一地址二地址三 | 干露露视频 性感写真 | 亚洲成人福利 | 国产成人精品系列在线观看 | 日韩精品一区二区三区老鸭窝 | 99在线精品免费视频九九视 | 精品国产中文字幕在线视频 | 欧美日韩国产精品va | 我的年轻漂亮继坶三级 | 2021精品国夜夜天天拍拍 | 亚洲第一区二区快射影院 | 果冻传媒林予曦图片 | 日韩二区三区 | 日本在线视频网 | www.好吊操| 成人网久久 | 啪啪模拟器| 欧美一区二区三区在线观看免费 | 精品午夜寂寞影院在线观看 | 欧美视频久久 | 久久久久久久久性潮 | 成人特级毛片69免费观看 | 国产成人精品免费视频软件 | 好男人免费高清在线观看2019 | 果冻传媒九一制片厂网站 | 国色天香社区视频免费观看3 | 日本一区视频 | 2022日韩理论片在线观看 | 亚洲精品国产精麻豆久久99 | 极限淫生小说 |