首页 > *nix应用编程, *nix技术 > Flask发送静态资源的测试

Flask发送静态资源的测试

2022年4月16日 发表评论 阅读评论 1,346 次浏览

一,环境
宿主机和客户机都是如下:
$ 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

转载请保留地址:http://www.lenky.info/archives/2022/04/3155http://lenky.info/?p=3155


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

  1. 本文目前尚无任何评论.
您必须在 登录 后才能发布评论.