安装

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

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

使用

最小的一个Flask应用:

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()

请求方式

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

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()
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()
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()

返回数据方式

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()
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

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()中使用<>指定变化的部分路径

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>

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请求的来源
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()

重定向页面

获取今日必应壁纸

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自带的错误请求:

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:不被接受的请求

自定义错误请求页面:

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)

开发

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

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,允许外网访问,指定运行端口,需要设置:

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

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

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 中文网