安装

python
1
2
pip install Flask==2.0.3
pip install Jinja2==3.1.1.

下面介绍如何快速使用 Flask 搭建接口功能

使用

最小的一个 Flask 应用:

python
1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

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

请求方式

python
1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

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

methods:指定请求方法,可以多个,methods=["POST","GET"] 表示既可以接收 GET 请求,也可以接收 POST 请求

一般对应 CURD 操作的请求方法:GETPOSTPUTDELETE

python
1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/',methods=["POST"])
def hello_world():
return 'Hello, World!'

if __name__ == "__main__":
app.run()
python
1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/',methods=["PUT"])
def hello_world():
return 'Hello, World!'

if __name__ == "__main__":
app.run()
python
1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/',methods=["DELETE"])
def hello_world():
return 'Hello, World!'

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

返回数据方式

python
1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

if __name__ == "__main__":
app.run()
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask,Response
import json
app = Flask(__name__)

@app.route('/')
def hello_world():
json_data={
"a":1,
"b":"test"
}
return Response(json.dumps(json_data),mimetype='application/json')

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

其中第一个参数是 json 数据转化后的字符串,第二个参数是媒体类型,json 的媒体类型为 application/json

python
1
2
3
4
5
6
7
8
9
from flask import Flask,send_from_directory
app = Flask(__name__)

@app.route('/')
def hello_world():
return send_from_directory('./','favicon.ico',mimetype='image/vnd.microsoft.icon')

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

其中第一个参数是文件路径,第二个参数是文件名,第三个是媒体类型,

常用媒体类型:

html:text/html

css:`text/css``

js:application/x-javascript

图片:image/jpeg

视频:video/mp4

更多媒体类型参考:MIME 类型 - HTTP | MDN

获取请求路径

有时候请求路径不是固定的,我们可以在 @app.route() 中使用 <> 指定变化的部分路径

python
1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/<num>')
def hello_world(num):
return 'Hello, World! %s' %num

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

注意:定义的方法要传参

Flask 还可以定义路径的类型 <int:num>

python
1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/<int:num>')
def hello_world(num):
return 'Hello, World! %s' %num

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

如果 / 后面不是 int 类型,它不会走进 hello_world 函数,如果没有符合的条件,Flask 将会返回 404

获取请求参数

在 Flask 中,有全局对象 request 处理请求,需要使用 from flask import request 导入模块

属性名描述
args 获取 get 请求的参数
form 获取 post 请求的参数
method 获取请求的方式 GET or POST
files 获取上传的文件
cookies 获取 cookie 信息
headers 获取请求头
path 获取 /
host 获取 ip:host
host_url 获取 http://127.0.0.1:5000/
referrer 请求的来源
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from flask import Flask,request,make_response,jsonify
import json
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

@app.route('/to')
def today1():
data={}
data['args']=request.args
data['form']=request.form
data['mothod']=request.method
data['files']=request.files
data['cookies']=request.cookies
data['headers']=dict(request.headers)
data['path']=request.path
data['host']=request.host
data['host_url']=request.host_url
data['referrer']=request.referrer
return make_response(jsonify(data), 200)

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

重定向页面

获取今日必应壁纸

python
1
2
3
4
5
6
7
8
9
10
11
12
from flask import Flask,request,redirect
import json,requests
app = Flask(__name__)

@app.route('/bing/today')
def today():
req_url="https://cn.bing.com/HPImageArchive.aspx?n=1&format=js&idx=0"
bing_url='https://cn.bing.com'
return redirect(bing_url+json.loads(requests.get(req_url).text)["images"][0]['url'])

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

redirect 函数接受一个参数,即转向地址栏的地址

自定义请求错误页面

Flask 自带的错误请求:

python
1
2
3
4
5
6
7
8
9
10
from flask import Flask,abort
import json,requests
app = Flask(__name__)

@app.route('/error')
def error():
abort(403)

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

利用 abort 函数抛出错误码和对应的错误页面,常见的错误码含义:

400:错误的请求

401:未授权

403:禁止访问

404:未找到页面

405:不被允许的请求方法

406:不被接受的请求

自定义错误请求页面:

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask,abort,render_template_string
import json,requests
app = Flask(__name__)

@app.route('/error')
def error():
abort(403)

@app.errorhandler(403)
def page_403(error):
return render_template_string('<h1> Unauthorized </h1><h2>{{ error_info }}</h2>', error_info=error), 403

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

如果 return jsonify({"msg":"请求错误","code":403}), 200,可返回 json 格式的错误提示(状态码 200)

开发

可使用开发模式实现热部署:

python
1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

if __name__ == "__main__":
app.run(debug=True)

部署

部署在服务器时,除了安装必要的环境之外,代码也有所变化。

因为 app.run() 默认属于同一网段才能访问且默认端口为 5000,允许外网访问,指定运行端口,需要设置:

python
1
app.run(host='0.0.0.0',port=8080)

因为 app.run() 是 Flask 自带的一个服务器供我们进行开发,我们可以使用 python 自带的 wsgiref 进行部署:

python
1
2
3
4
5
6
7
8
9
10
11
from flask import Flask
from wsgiref.simple_server import make_server
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

if __name__ == "__main__":
server = make_server('0.0.0.0', 5000, app)
server.serve_forever()

也可以使用 Flask+Gunicorn+Nginx 的 Flask 部署方案:Flask 应用如何部署

建议阅读

Flask 中文网