聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

Flask发送静态资源的测试

2022-04-16 11:35 浏览: 2160 次 我要评论(0 条) 字号:

p>一,环境
宿主机和客户机都是如下:
$ cat /etc/issue
Ubuntu 20.04.2 LTS n l
$ uname -a
Linux lenky-HP 5.10.0-1057-oem #61-Ubuntu SMP Thu Jan 13 15:06:11 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

二,安装软件
$ sudo apt-get update
$ sudo apt install python3-pip
$ sudo pip3 install Flask

三,测试
$ mkdir Flask
$ cd Flask/
$ vi server.py
$ cat server.py

from flask import Flask
 
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return 'Hello World!'
 
if __name__ == '__main__':
    app.run()

$ python3 server.py

在另外一个终端执行:
$ wget -q -O – http://127.0.0.1:5000
Hello World!

运行ok。

四,发送静态资源
一般的简单内容输出可以通过Python代码返回,类似于上面的hello_world()函数。
如果要输出各种静态资源,怎么做呢?

方法一:render_template
参考:https://flask.palletsprojects.com/en/2.1.x/api/?highlight=render_template#flask.render_template
Flask默认使用static目录存放静态资源,templates目录存放模板,这两个目录可以通过设置参数更改的:
app = Flask(“admin-center”, static_folder=”js”, template_folder=”admin”)

lenky@lenky-HP:Flask$ tree
.
├── admin
│   └── index.html
├── js
│   └── admin.js
└── server.py

2 directories, 3 files
lenky@lenky-HP:Flask$ cat server.py 
from flask import Flask
from flask import render_template
 
app = Flask("admin-center", static_folder="js", template_folder="admin")
 
@app.route('/')
def hello_world():
    return 'Hello World!'

@app.route('/admin')
def admin():
    return render_template("index.html")
 
if __name__ == '__main__':
    app.run()
lenky@lenky-HP:Flask$ cat admin/index.html 
<html>
<head>
    <title>admin-center</title>
    <meta charset="utf-8">
    <script src="../js/admin.js"></script>
</head>
<body onload="test()">
</body>
</html>
lenky@lenky-HP:Flask$ cat js/admin.js 

function test() {
    alert('test');
}

启动server.py后,浏览器访问http://127.0.0.1:5000/admin,正常获得弹窗test,ok。
注意:另外有个很重要的参数static_url_path可以改变static文件夹的映射uri地址。
比如上面的:app = Flask(“admin-center”, static_folder=”js”, template_folder=”admin”)
正常情况下,js下文件的uri为:js/admin.js,如果加上static_url_path参数如下:
app = Flask(“admin-center”, static_folder=”js”, static_url_path=”/”, template_folder=”admin”)
那么admin.js对应的uri就是:/admin.js
这在某些情况下特别有用,比如前端静态文件都是由别人提供的时候,比如前端同事用vue框架开发了前端,打包成到文件夹dist下,那么:
app = Flask(“admin-center”, static_folder=”dist”, static_url_path=”/”, template_folder=”dist”)
然后
@app.route(‘/’)
def admin():
return render_template(“index.html”)
即可展示dist下的前端代码。

方法二:send_from_directory
参考:https://flask.palletsprojects.com/en/2.1.x/api/?highlight=render_template#flask.send_from_directory
如果有多个静态路径,那么可以使用send_from_directory,方法如下。

lenky@lenky-HP:Flask$ cat server2.py 
from flask import Flask
from flask import send_from_directory
import os.path
 
app = Flask("dist")

dist_path = os.path.join(app.root_path, 'dist')
@app.route("/dist/<path:filename>")
def dist(filename):
    return send_from_directory(dist_path, filename, as_attachment=False)

theme_path = os.path.join(app.root_path, 'dist/theme')
@app.route("/theme/<path:filename>")
def theme(filename):
    return send_from_directory(theme_path, filename, as_attachment=False)

if __name__ == '__main__':
    app.run()

send_from_directory主要是用来下载文件的,as_attachment需设置为False。

参考:

https://flask.palletsprojects.com/en/2.1.x/

https://github.com/pallets/flask


网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复