在 Python 中使用 Flask 搭建 HTTP 服务器

Flask 是一个使用 Python 语言编写的 Web 框架,它可以让你高效的编写 Web 程序。本文介绍如何使用 Flask 搭建一个简单的网页,用户可以在该网页中通过 form 提交 POST 请求给服务器进行处理。

安装

使用 pip

pip install flask

准备 HTML 网页

编写一段简单的 HTML 网页。这个网页让用户选择一张图片,并点击 Submit 上传给服务器:

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimal-ui">
<title>Demo</title>
</head>
<body>
<form id="upload-form" method="post" enctype="multipart/form-data">
<div class="form-content-container" align="center">
<h2>Demo</h2>
<p>Image: <input id="upload_image" type="file" name="image"/></p>
<input id="upload_button" type="submit" value="Submit"/>
</div>
</form>
</body>
</html>

我们将这个网页命名为 index.html

路径安排

由于 Flask 的规定,我们必须将 index.html 放在 templates 目录下,静态内容放在 static 目录下,才能被用户访问到。

编写服务器代码

下面这段代码在 0.0.0.0:80 启动了一台 HTTP 服务器:

import io
import os
import cv2
import flask
import datetime
import numpy as np


app = flask.Flask(__name__)


@app.route('/')
def index():
return flask.render_template('index.html')


@app.route('/', methods=['POST'])
def index_post():
image_bio = io.BytesIO()
flask.request.files['image'].save(image_bio)

# empty request
if len(image_bio.getvalue()) == 0:
return index()

result_id = str(datetime.datetime.now()).replace(' ', '_').replace(':', '-')
result_dir = os.path.join('static', 'results', result_id)
os.makedirs(result_dir, exist_ok=True)

# save image to file
image = cv2.imdecode(np.frombuffer(image_bio.getvalue(), dtype='uint8'), 1)
cv2.imwrite(os.path.join(result_dir, 'input.jpg'), image)

return 'Upload completed!'


if __name__ == '__main__':
app.debug = True
app.run(host='0.0.0.0', port=80)

当用户使用浏览器访问 localhost 时,服务器会执行 index() 函数、将 index.html 返回给客户端,从而显示出提示上传的网页;如果服务器收到浏览器发来的 POST 请求(表示用户点击了 Submit 按钮),那么它会执行 index_post() 函数、将用户上传的图片保存到本地目录,并返回 Upload completed!