您好,登錄后才能下訂單哦!
本文實例講述了flask框架藍圖和子域名配置。分享給大家供大家參考,具體如下:
在flask項目中,我們所有的url和視圖函數都寫在一個文件app.py中,但是當我們的項目大起來之后,這顯然就不是一個合理的結構了。而藍圖就可以優雅的幫我們實現這個需求,對我們的項目進行分塊。
比如現在的豆瓣網,https://www.douban.com/,他分為好幾個模塊。
有讀書,電影,音樂,同城,FM等模塊,假設我們也需要實現一個類似的網站,用過Django框架的朋友都知道,可以給每個模塊新建一個app,然后相應模塊的代碼寫在對應的app中,這樣也很方便我們對代碼的管理,和后期項目維護,但是在flask中呢。如果我們把所有的代碼都放在app.py文件中的話,那么肯定不好管理和維護。所以我們需要對網站模塊化,每個模塊寫在對應的為止。這里就會使用到我們的藍圖了。
首先我們在項目的跟目錄下新家一個包blueprints,用啦存放我們所有的藍圖(模塊)。然后在這個包里面新建book.py,movie.py,music.py,FM.py文件,對應我們上面讀書,電影,音樂,FM幾個模塊。
然后我們在這些文件里面開始編寫代碼。
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'
代碼解析
這樣,我們就在定義好了4個藍圖,然后我們需要在app.py中區注冊藍圖。
app.py
from flask import Flask,url_for,jsonify,render_template from flask import views # 首先導入我們的藍圖 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()
然后我們運行項目,輸入對應的url,就能訪問到我們的視圖了。這樣,我們就對我們的項目進行了模塊化處理。方便我們的后期維護。
1. url前綴
有時候我們需要個一些模塊下的視圖函數添加一些url前綴,比如說當訪問電影模塊下面的視圖的時候,url都有一個前綴movie,例如127.0.0.1:5000/movie/index/,127.0.0.1:5000/movie/list/。。。當然我們可以手動的在每一個視圖函數之前添加movie前綴,但是這樣肯定不是最好的選擇。那么在flask中,有沒有更好的實現方式呢?答案當然是有的。在我們初始化藍圖的時候,還有一個參數url_prefix,當我們指定這個參數之后,就會給我們的movie模塊寫的所有視圖函數添加一個前綴了。
movie.py
from flask import Blueprint movie_bp = Blueprint('movie',__name__,url_prefix='/movie') @movie_bp.route('/movie/') def index(): return 'movie index'
注意:
2. 藍圖中模板查找規則
首先會去根目錄下的templates文件夾下面查找模板,如果找到了,那么就直接返回,如果沒有找到,那么就會去該藍圖的同級目錄下的templates文件下尋找模板。如果找到了,也返回,如果沒有,就直接報錯。
3. 藍圖中靜態文件查找規則
在模板中,我們使用url_for加載靜態文件的時候。需要加上我們的藍圖名.
<!-- 去藍圖下面的static文件夾下尋找靜態文件 藍圖名.static --> <link rel="stylesheet" href="{{ url_for('movie.static',filename='index.css') }}" rel="external nofollow" > <!-- 根目錄下的static文件夾下尋找靜態文件 --> <link rel="stylesheet" href="{{ url_for('static',filename='index.css') }}" rel="external nofollow" >
4. 藍圖中使用url_for
我們知道在模板中加載靜態文件的時候,需要藍圖的名字+ . + static這樣才能加載藍圖下面的靜態文件。那么我們在視圖中怎樣使用url_for呢?
其實和模板中使用方法一樣,都需要藍圖的名字。例如,得到movie模塊下index的url。
# 藍圖的名字 + . + 站點名(函數的名字) url_for('movie.index')
子域名下載很多網站都是使用了,還是比如我們的額豆瓣,大家可以看到,讀書模塊下的網址都是book.douban.com,電影下面的都是movie.douban.com。那么我們也可以這樣定義我們的額子域名。
比如我們定義我們的電影模塊的子域名為movie。子域名的實現也是通過藍圖來實現的。我們只需要在初始化藍圖對象的時候,傳入一個參數就可以了。
movie.py
from flask import Blueprint movie_bp = Blueprint('movie',__name__,subdomain='movie') @movie_bp.route('/movie/') def index(): return 'movie index'
我們還得在app.py中配置服務器的名字。
app.config['SERVER_NAME'] = '127.0.0.1:5000'
然后我們怎樣訪問我們movie模塊中的額視圖函數呢?movie.127.0.0.1:5000/movie/這樣嗎?
我們來嘗試一下,在瀏覽器中輸入網址。然后我們發現并訪問不了?是我們沒有配置正確嗎?
答案當然是否定的。這是因為127.0.0.1不支持子域名額配置,那么localhost支持嗎?localhost也是不支持的?
那我們怎么測試我們到底有沒有配置正確呢?難道要去買一個域名?
當然不用,我們修改一下我們電腦的hosts文件就可以了。
windows下hosts文件存放位置為C:\Windows\System32\drivers\etc\hosts
我們打開這個文件,在最下面添加代碼
# 訪問xxx.com的時候 就會找到127.0.0.1 127.0.0.1 xxx.com # 標準域名配置 127.0.0.1 movie.xxx.com # 子域名配置
如果提示沒有權限修改這個文件,就在外面重新新建一個文件hosts,然后把hosts里面的代碼復制進去,在添加我們的代碼。然后將hosts文件刪除,再講我們新建的hosts放進去。
然后app.py中配置我們的域名。
app.config['SERVER_NAME'] = 'xxx.com:5000'
這樣,我們訪問我們網站的時候,就可以使用xxx.com:5000/這個域名來訪問了。我們訪問movie模塊的時候,也就可以使用movie.xxx.com:5000這個子域名訪問了。
希望本文所述對大家基于flask框架的Python程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。