我们在写web app(网站)的时候会用到很多静态文件,比如css,JavaScript,图片等,这些文件及其文件夹可以通过
app.static()
方法注册,从而被访问到。该方法有两个必需参数,节点URL和文件名。
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_files
为
True
时,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)