安装

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