轻量级定制化框架 Flask 常用功能介绍
| 字数总计:1.4k|阅读时长:6 分钟 | 阅读量:148
安装
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
操作的请求方法:GET
、POST
、PUT
、DELETE
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 中文网