Sanic 靜態檔案

veelion發表於2019-04-01

我們在寫web app(網站)的時候會用到很多靜態檔案,比如css,JavaScript,圖片等,這些檔案及其資料夾可以通過app.static()方法註冊,從而被訪問到。該方法有兩個必需引數,節點URL和檔名。

Sanic 靜態檔案

from sanic import Sanic
from sanic.blueprints import Blueprint

app = Sanic(__name__)

# 提供資料夾`static`裡面的檔案到URL `/static`的訪問。
app.static('/static', './static')
# 使用`url_for`建立URL時,預設為'static'的`name`可被省略。
app.url_for('static', filename='file.txt') == '/static/file.txt'
app.url_for('static', name='static', filename='file.txt') == '/static/file.txt'

# 通過URL /the_best.png訪問檔案 /home/ubuntu/test.png
app.static('/the_best.png', '/home/ubuntu/test.png', name='best_png')

# 通過url_for建立靜態檔案URL
# 如果沒有定義name 和 filename 引數時可以省略它們。
# 如果上面沒有定義name='best_png',則下面的url_for可省略name引數
app.url_for('static', name='best_png') == '/the_best.png'
app.url_for('static', name='best_png', filename='any') == '/the_best.png'

# 需要為其它靜態檔案定義`name`
app.static('/another.png', '/home/ubuntu/another.png', name='another')
app.url_for('static', name='another') == '/another.png'
app.url_for('static', name='another', filename='any') == '/another.png'

# 同樣, 也可以對blueprint使用`static`
bp = Blueprint('bp', url_prefix='/bp')
bp.static('/static', './static')
bp.static('/the_best.png', '/home/ubuntu/test.png', name='best_png')
app.blueprint(bp)

app.url_for('static', name='bp.static', filename='file.txt') == '/bp/static/file.txt'
app.url_for('static', name='bp.best_png') == '/bp/test_best.png'

app.run(host="0.0.0.0", port=8000)

對blueprint使用url_for建立的URL會加上/bp字首。
注意: Sanic 不提供靜態資料夾的目錄索引。

虛擬主機

方法app.static()支援虛擬主機。可以通過傳入host引數實現。例如:

from sanic import Sanic

app = Sanic(__name__)

app.static('/static', './static')
app.static('/example_static', './example_static', host='www.example.com')

流化大檔案

有時候需要Sanic提供大檔案(比如,視訊,圖片等)的訪問,可以選擇使用流檔案替代直接下載。比如:

from sanic import Sanic

app = Sanic(__name__)

app.static('/large_video.mp4', '/home/ubuntu/large_video.mp4', stream_large_files=True)

stream_large_filesTrue時,Sanic將會使用file_stream()替代file()來提供靜態檔案訪問。它預設的塊大小是1KB,當然你可以根據需要修改塊大小。比如:

from sanic import Sanic

app = Sanic(__name__)

chunk_size = 1024 * 1024 * 8 # 設定塊大小為 8KB
app.static('/large_video.mp4', '/home/ubuntu/large_video.mp4', stream_large_files=chunk_size)

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章