Flask可以搭建轻量服务api,而且使用python语言编写程序,非常方便。以前也使用过php做服务器后端,但是不喜欢php的$,而且我想多学学python,没想到Flask框架恰好能满足我的需求,简直是一个神器!特别适合我这种非计算机专业人士学习,能快速搭建api,为前端web、微信小程序等提供api服务,非常nice,爱了爱了
pip3 install Flask
from flask import Flask,request
1、flask项目文件目录
project/
app/
static/
js/
css/
img/
favicon.ico
templates/
common/
errors/
user/
posts/
email/
views/
models/
libs/
framework/
utils/
extensions/
forms/
main.py
migrations/
tests/
venv/
requirements.txt
config.py
manage.py
2、python文件内容示例
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
def index():
...
app.add_url_rule("/", view_func=index)
第三种是把不同的URL映射到同一个函数里,就是在函数前用多个 @app.route(' ')
1、修改app文件名,文件夹路径
在app实例化的时候设置
app = Flask("my-app", static_folder="path1", template_folder="path2")
2、开启项目调试模式
app.run(debug=True)
3、设置app运行的端口并开启调试
注意:如果在开发环境中debug,要在app.run前加上
app.env="development"
否则,会出现 WARNING: This is a development server. Do not use it in a production deployment.
app.run(host='0.0.0.0', port=80, debug=True)
flask中的request类专门用于对请求的参数进行处理,比如获得 get
请求参数,获得 post
请求参数。
必须要导入flask的request,这里导入的是全局变量(全局变量写代码量少,快速方便)
from flask import request
常用属性:
属性描述method请求方法,比如POST、GET。值为字符串,有”GET”,”POST”等form处理POST和PUT请求args处理GET参数cookies请求的cookies,类型是dict。headers请求头,字典类型。data包含了请求的数据,并转换为字符串,除非是一个Flask无法处理的mimetype。filesMultiDict,带有通过POST或PUT请求上传的文件。path获取请求文件路径:/myapplication/page.htmlurl_root获取域名:http://www.baidu.com/base_url获取基本url:http://www.baidu.com/myapplication/page.htmlurl获取全部url:http://www.baidu.com/myapplication/page.html?id=1&edit=editjson如果mimetype是application/json,这个参数将会解析JSON数据,如果不是则返回None。stream处理流remote_addr获取请求ip
1、处理GET请求
request.args.__str__()
:列出所有参数
request.args.get('')
:取出指定参数的第一个参数(如果有好多的话)
request.args.getlist('')
:取出指定参数列表
2、处理POST请求
request.form.get("")
3、处理表单数据
@app.route('/api',methods=['GET','POST'])
def api():
d1 = request.form.get("l1")
d2 = request.form.get("l2")
d3 = request.form.get("l3")
file = request.files.get('file')
print(file)
dict = {"code":"200","data":"处理完毕"}
return jsonify(dict)
4、处理JSON数据
request.json
5、处理请求头参数
request.headers可以返回请求头参数。但是注意这是 werkzeug.datastructures.EnvironHeaders
对象。
想获取请求头的参数需要用 get()
方法:
request.headers.get("Host")
flask接收到请求( request
)后进行处理,处理完毕后会想客户端发送响应( response
)
flask的Response类是专门用于处理响应模块的。
使用导入两个:
from flask import make_response,Response
@app.route("/test")
def test():
response = Response("返回信息")
response.status_code = 200
return response
返回response最精简(懒人)模式:
return "index.html", 200, {"header1":"header1_info", "header2": "header2_info"}
补充:原则上我们返回( return
)都应该是返回Response对象,但是上面的方式也是可以的,flask智能地将他们转为了Response对象。
常用属性:
属性描述headers设置请求头信息statusString类型的数据,格式为这种:”200 ok”status_codeint 类型,就是状态码,但是不能是自定义的状态码data需要返回到前端的数据set_cookie设置cookie 的值del_cookie删除cookie ,不会立马删除cookie 值,会将过期时间设置为当前时间
构造函数: class flask.Response(response=None, status=None, headers=None, mimetype=None, content_type=None,direct_passthrough=False)
1、返回JSON数据
方案一 (返回JSON对象,并设置请求头)
from flask import Response
return Response(json.dumps(text), mimetype='application/json')
方案二(使用jsonify)
from flask import jsonify
return jsonify(text)
2、设置请求头
方案一:
@app.route("/test")
def test():
rp = Response("返回信息")
rp.headers['header1'] = "header1_info"
rp.headers['header2'] = "header2_info"
return rp
方案二:
return "返回信息", 200, {"header1":"header1_info", "header2": "header2_info"}
方案三
读取cookie
name=request.cookies.get('Name')
return name
设置Cookie并返回
response.set_cookie('key','value',expires=None, path='/')
return response
expires设置时间,其中 expires
的格式: [str, datetime.datetime, int, float]
session本质上还是cookie,但是时效短。flask会发送session-id给客户端(数据临时存储在服务端),客户端只要不关闭浏览器,打开多个页面浏览器会自动发送session-id,服务端能读取id来处理数据。
session能够运行在服务器端并存储交互状态。Flask中的Session与其他的Web框架不同,它使用了密钥签名的方式进行了加密。
配置SECRET_KEY:
app.config["SECRET_KEY"]='XXXXX'
session操作:
from flask import session
session["key"]= ...
session.get("key")
session.pop('key')
session.clear
token验证技术的其中一种解决方案是JSON Web Token。这是目前最常用的token认证解决方法。关于JWT的解释可以看这篇文章:基于 Token 的身份验证:JSON Web Token
flask框架实现JWT token验证有好几个库,比如pyjwt,flask-jwt。我选择pyjwt,他的文档比较好。
1、安装并应用
pip install pyjwt
import jwt
2、生成token
auth = HTTPBasicAuth()
SECRET_KEY = 'abcdefghijklmm'
encoded = jwt.encode({"some": "payload"}, SECRET_KEY, algorithm="HS256")
def createToken():
payload = {"id": "此token指向的用户id", "iss": "crayonxin","nbf": time.time(), "exp": time.time()+604800}
encoded = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
rp = Response(encoded)
rp.set_cookie("token", encoded, expires=time.time()+604800)
rp.headers["token"] = encoded
return rp
我设置了过期时间为604800秒(一周的时间)。
我把token放到了cookie和自定义请求头token中。我放到cookie中是为了做web时好自动存储,省事。
3、验证token
我自己封装了一个类,方便后期。
SECRET_KEY = 'abcdefghijklmm'
class Verify(object):
def __init__(self, key, headers: werkzeug.datastructures.EnvironHeaders):
self.headers = headers
self.key = key
def verifyToken(self):
encoded = self.headers.get("token")
try:
jwt.decode(encoded, self.key, issuer="crayonxin", algorithms="HS256")
except Exception as e:
return False
return True
def DecodeToken(self):
encoded = self.headers.get("token")
if encoded == None:
return "请求头没有token参数"
try:
dict = jwt.decode(encoded, self.key,issuer="crayonxin", algorithms="HS256")
except jwt.ExpiredSignatureError:
return "时间到期"
except jwt.InvalidSignatureError:
return "token验证失败"
except jwt.InvalidIssuerError:
return "颁发者错误"
return dict
4、使用token
def get():
verify = Verify(SECRET_KEY, request.headers)
if verify.verifyToken():
print("成功")
pass
else:
print("失败")
pass
dict = verify.DecodeToken()
return dict
from flask_cors import *
app = Flask("name")
CORS(app,methods=["GET","POST","PUT","PATCH","DELETE","OPTIONS"], supports_credentials=True,expose_headers=['Content-Disposition'],)
CORS类的参数:
参数名类型Head字段解释resources字典、迭代器或字符串无全局配置允许跨域的API接口origins列表、字符串或正则表达式Access-Control-Allow-Origin配置允许跨域访问的源,*表示全部允许methods列表、字符串Access-Control-Allow-Methods配置跨域支持的请求方式,如:GET、POSTexpose_headers列表、字符串Access-Control-Expose-Headers自定义请求响应的Head信息,设置值之后,前端js能获取到响应头allow_headers列表、字符串或正则表达式Access-Control-Request-Headers配置允许跨域的请求头supports_credentials布尔值Access-Control-Allow-Credentials是否允许请求发送cookie
return "错误信息",404
或者使用 abort()
from flask import abort
abort(404)
from flask import redirect
@app.route('')
def index():
return redirect(location='',code=302)
flask不用其他的扩展其实可以构建简单的api,但是写的多的时候,看起来很乱。
有一个非常好用的库叫 flask_restful
,这可以非常简单的部署api服务。
restful api 不是技术,准确的说是一种规范。可以看这个介绍RESTful API接口设计标准及规范
一个链接代表一个资源,使用 [GET]
、 [POST]
、 [PUT]
、 [DELETE]
、 [PATCH]
来对资源进行处理。
Restful api 安装
pip install flask-restful
Restful api 示例
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
def post(self):
return {'':''}
def delete(self, todo_id):
del todo_id
return '', 204
def put(self,param):
return {}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
注意: 没有 flask_restful
这个工具的话,以前发送JSON需要使用 Reponse
类或者 jsonify
,现在直接返回字典,自动转换成JSON格式返回,太方便了!!!
flask如果想返回图片,通用的处理方式是使用Base64编码,web接收到信息,使用html的 img
标签即可展示图片。
下面以使用matplot绘制图为例,展示flask返回图片
import base64
from io import BytesIO
from flask import Flask
from matplotlib.figure import Figure
app = Flask(__name__)
@app.route("/")
def hello():
fig = Figure()
ax = fig.subplots()
ax.plot([1, 2])
buf = BytesIO()
fig.savefig(buf, format="png")
data = base64.b64encode(buf.getbuffer()).decode("ascii")
return f"data:image/png;base64,{data}"
Original: https://blog.csdn.net/Crayonxin2000/article/details/122503208
Author: Crayon鑫
Title: flask框架基本使用
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/745732/
转载文章受原作者版权保护。转载请注明原作者出处!