flask框架藍(lán)圖和子域名配置詳解
本文實例講述了flask框架藍(lán)圖和子域名配置。分享給大家供大家參考,具體如下:
藍(lán)圖
在flask項目中,我們所有的url和視圖函數(shù)都寫在一個文件app.py中,但是當(dāng)我們的項目大起來之后,這顯然就不是一個合理的結(jié)構(gòu)了。而藍(lán)圖就可以優(yōu)雅的幫我們實現(xiàn)這個需求,對我們的項目進(jìn)行分塊。
比如現(xiàn)在的豆瓣網(wǎng),https://www.douban.com/,他分為好幾個模塊。
有讀書,電影,音樂,同城,F(xiàn)M等模塊,假設(shè)我們也需要實現(xiàn)一個類似的網(wǎng)站,用過Django框架的朋友都知道,可以給每個模塊新建一個app,然后相應(yīng)模塊的代碼寫在對應(yīng)的app中,這樣也很方便我們對代碼的管理,和后期項目維護(hù),但是在flask中呢。如果我們把所有的代碼都放在app.py文件中的話,那么肯定不好管理和維護(hù)。所以我們需要對網(wǎng)站模塊化,每個模塊寫在對應(yīng)的為止。這里就會使用到我們的藍(lán)圖了。
首先我們在項目的跟目錄下新家一個包blueprints,用啦存放我們所有的藍(lán)圖(模塊)。然后在這個包里面新建book.py,movie.py,music.py,FM.py文件,對應(yīng)我們上面讀書,電影,音樂,F(xiàn)M幾個模塊。
然后我們在這些文件里面開始編寫代碼。
book.py
from flask import Blueprint book_bp = Blueprint('book',__name__) @book_bp.route('/book/') def index(): return 'book index'
movie.py
from flask import Blueprint movie_bp = Blueprint('movie',__name__) @movie_bp.route('/movie/') def index(): return 'movie index'
music.py
from flask import Blueprint music_bp = Blueprint('music',__name__) @music_bp.route('/music/') def index(): return 'music index'
FM.py
from flask import Blueprint FM_bp = Blueprint('FM',__name__) @FM_bp.route('/fm/') def index(): return 'FM index'
代碼解析
- Blueprint():實例化一個藍(lán)圖對象,第一個參數(shù)為我們藍(lán)圖的名字,第二個參數(shù)為藍(lán)圖這個拉努文件的位置,我們直接寫__name__就可以了。所以其實藍(lán)圖的實例對象和app.py中的flask實例化對象app都一樣,只是多了一個參數(shù),藍(lán)圖的名字而已,使用起來都是一樣的。
- Blueprint(‘xxx',name).route():和app.route()用法一樣,沒有任何差別。
這樣,我們就在定義好了4個藍(lán)圖,然后我們需要在app.py中區(qū)注冊藍(lán)圖。
app.py
from flask import Flask,url_for,jsonify,render_template from flask import views # 首先導(dǎo)入我們的藍(lán)圖 from blueprints.movie import movie_bp from blueprints.FM import FM_bp from blueprints.music import music_bp from blueprints.movie import movie_bp app = Flask(__name__) # app.config['SERVER_NAME'] = 'xujin.com:5000' app.register_blueprint(movie_bp) app.register_blueprint(FM_bp) app.register_blueprint(music_bp) app.register_blueprint(movie_bp) if __name__ == '__main__': app.run()
然后我們運行項目,輸入對應(yīng)的url,就能訪問到我們的視圖了。這樣,我們就對我們的項目進(jìn)行了模塊化處理。方便我們的后期維護(hù)。
1. url前綴
有時候我們需要個一些模塊下的視圖函數(shù)添加一些url前綴,比如說當(dāng)訪問電影模塊下面的視圖的時候,url都有一個前綴movie,例如127.0.0.1:5000/movie/index/,127.0.0.1:5000/movie/list/。。。當(dāng)然我們可以手動的在每一個視圖函數(shù)之前添加movie前綴,但是這樣肯定不是最好的選擇。那么在flask中,有沒有更好的實現(xiàn)方式呢?答案當(dāng)然是有的。在我們初始化藍(lán)圖的時候,還有一個參數(shù)url_prefix,當(dāng)我們指定這個參數(shù)之后,就會給我們的movie模塊寫的所有視圖函數(shù)添加一個前綴了。
movie.py
from flask import Blueprint movie_bp = Blueprint('movie',__name__,url_prefix='/movie') @movie_bp.route('/movie/') def index(): return 'movie index'
注意:
- url_prefix參數(shù)必須以'/'開始。
- 當(dāng)我們傳入了url_prefix參數(shù)之后,我們訪問index視圖的時候,url就變?yōu)?span style="color: #0000ff">127.0.0.1:5000/movie/movie/了。
2. 藍(lán)圖中模板查找規(guī)則
首先會去根目錄下的templates文件夾下面查找模板,如果找到了,那么就直接返回,如果沒有找到,那么就會去該藍(lán)圖的同級目錄下的templates文件下尋找模板。如果找到了,也返回,如果沒有,就直接報錯。
3. 藍(lán)圖中靜態(tài)文件查找規(guī)則
在模板中,我們使用url_for加載靜態(tài)文件的時候。需要加上我們的藍(lán)圖名.
<!-- 去藍(lán)圖下面的static文件夾下尋找靜態(tài)文件 藍(lán)圖名.static --> <link rel="stylesheet" href="{{ url_for('movie.static',filename='index.css') }}" rel="external nofollow" > <!-- 根目錄下的static文件夾下尋找靜態(tài)文件 --> <link rel="stylesheet" href="{{ url_for('static',filename='index.css') }}" rel="external nofollow" >
4. 藍(lán)圖中使用url_for
我們知道在模板中加載靜態(tài)文件的時候,需要藍(lán)圖的名字+ . + static這樣才能加載藍(lán)圖下面的靜態(tài)文件。那么我們在視圖中怎樣使用url_for呢?
其實和模板中使用方法一樣,都需要藍(lán)圖的名字。例如,得到movie模塊下index的url。
# 藍(lán)圖的名字 + . + 站點名(函數(shù)的名字) url_for('movie.index')
子域名
子域名下載很多網(wǎng)站都是使用了,還是比如我們的額豆瓣,大家可以看到,讀書模塊下的網(wǎng)址都是book.douban.com,電影下面的都是movie.douban.com。那么我們也可以這樣定義我們的額子域名。
比如我們定義我們的電影模塊的子域名為movie。子域名的實現(xiàn)也是通過藍(lán)圖來實現(xiàn)的。我們只需要在初始化藍(lán)圖對象的時候,傳入一個參數(shù)就可以了。
movie.py
from flask import Blueprint movie_bp = Blueprint('movie',__name__,subdomain='movie') @movie_bp.route('/movie/') def index(): return 'movie index'
我們還得在app.py中配置服務(wù)器的名字。
app.config['SERVER_NAME'] = '127.0.0.1:5000'
然后我們怎樣訪問我們movie模塊中的額視圖函數(shù)呢?movie.127.0.0.1:5000/movie/這樣嗎?
我們來嘗試一下,在瀏覽器中輸入網(wǎng)址。然后我們發(fā)現(xiàn)并訪問不了?是我們沒有配置正確嗎?
答案當(dāng)然是否定的。這是因為127.0.0.1不支持子域名額配置,那么localhost支持嗎?localhost也是不支持的?
那我們怎么測試我們到底有沒有配置正確呢?難道要去買一個域名?
當(dāng)然不用,我們修改一下我們電腦的hosts文件就可以了。
windows下hosts文件存放位置為C:\Windows\System32\drivers\etc\hosts
我們打開這個文件,在最下面添加代碼
# 訪問xxx.com的時候 就會找到127.0.0.1 127.0.0.1 xxx.com # 標(biāo)準(zhǔn)域名配置 127.0.0.1 movie.xxx.com # 子域名配置
如果提示沒有權(quán)限修改這個文件,就在外面重新新建一個文件hosts,然后把hosts里面的代碼復(fù)制進(jìn)去,在添加我們的代碼。然后將hosts文件刪除,再講我們新建的hosts放進(jìn)去。
然后app.py中配置我們的域名。
app.config['SERVER_NAME'] = 'xxx.com:5000'
這樣,我們訪問我們網(wǎng)站的時候,就可以使用xxx.com:5000/這個域名來訪問了。我們訪問movie模塊的時候,也就可以使用movie.xxx.com:5000這個子域名訪問了。
希望本文所述對大家基于flask框架的Python程序設(shè)計有所幫助。
相關(guān)文章
Python趣味實戰(zhàn)之手把手教你實現(xiàn)舉牌小人生成器
前幾天寫了一個嬰兒級別的爬蟲圖文教程,大家很喜歡.恰好周末看到有人咨詢這個 “舉牌小人” 怎么做?基于此,我想借此為大家再寫一篇 “爬蟲應(yīng)用” 的文章,教你制作一個好玩兒的 “舉牌小人” ,需要的朋友可以參考下2021-06-06python?通過dict(zip)和{}的方式構(gòu)造字典的方法
在python中,通常通過dict和zip組合來構(gòu)建鍵值對,這篇文章主要介紹了python?通過dict(zip)和{}的方式構(gòu)造字典的方法,需要的朋友可以參考下2022-07-07詳解利用Pytorch實現(xiàn)ResNet網(wǎng)絡(luò)之評估訓(xùn)練模型
這篇文章主要為大家介紹了利用Pytorch實現(xiàn)ResNet網(wǎng)絡(luò)之評估訓(xùn)練模型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04