上文末尾引入了flask-restful中资源类Resource,今天这部分就主要写一下具体用法。
Resource类
Flask-Restful的Resource类作为构建API路由的基本单位。Resource类可以用于定义处理请求的方法,并可以与多个HTTP方法(如GET、POST、PUT、DELETE等)关联。
在Flask-Restful中,GET和POST方法是用于处理HTTP请求的两种常见方法。它们的作用和用法如下:
- GET方法:GET方法用于从服务器检索(或获取)数据。在使用GET方法时,请求的数据会附加在URL之后,并且URL的长度是有限制的。GET请求的数据是可见的,因为它显示在URL中。因此,GET方法通常用于从服务器获取数据,而不是发送数据。
- POST方法:POST方法用于向服务器发送数据。与GET方法不同,POST请求的数据不会显示在URL中,而是作为请求的正文发送给服务器。因此,POST方法通常用于提交数据或进行表单提交等操作。
- PUT 方法:PUT 方法用于完全替换现有资源的内容。这意味着,使用 PUT 方法时,客户端会向服务器发送整个资源内容,以便替换现有的资源。因此,PUT 方法通常用于完整更新资源,例如更新整个文章或用户信息。
- PATCH 方法:PATCH 方法用于部分更新资源的内容。与 PUT 方法不同,PATCH 方法不会替换整个资源,而是根据客户端发送的指示来修改资源的某些部分。因此,PATCH 方法适用于对资源的特定部分进行更新,例如更新用户的部分信息或对文章进行部分修改。
- DELETE方法:DELETE 方法用于从服务器删除数据。在 Flask-Restful 中,可以使用 DELETE 方法来定义一个资源(endpoint),当客户端发出 DELETE 请求时,该资源将执行删除数据的操作。
api/ResourceAccount.py
详细代码已经在上文提供,这里只是一个简单的示例
from flask import request
from flask_restful import Resource
from model import *
from schema import *
class ResourceAccount(Resource):
def get(self, account_id=None):
"""
GET方法 根据account_id获取Account信息
如果account_id为空,则返回所有数据
"""
pass
def post(self):
"""
POST方法 创建Account
"""
pass
def patch(self, account_id):
"""
PATCH方法 更新Account
部分更新
"""
pass
def put(self, account_id):
"""
PUT方法 更新Account
全量更新
"""
pass
return {"success": False, "message": "Account not found"}, 404
def delete(self, account_id):
"""
DELETE方法 删除Account
Delete account
"""
pass
映射路由
创建Resource类后,使用flask-restful中api.add_resource方法将其映射到路由上既可以访问。具体代码参考前一篇中的app.py文件。
代码片段如下
from flask import Flask
from model import db
from flask_restful import Api
from api.ResourceAccount import ResourceAccount
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' # 使用SQLite数据库,可以根据需要更改
db.init_app(app)
api = Api(app)
api.add_resource(ResourceAccount, '/api/account/<string:account_id>', '/api/account/')
操作验证
使用requests模块进行以下操作
GET
通过get方法获取单一数据,或者全量数据
import requests
import pprint
url = "http://127.0.0.1:5000/api/account/"
print("显示id为1的数据")
r1 = requests.get(url+'1')
pprint.pprint(r1.json())
print("不传id,显示所有数据")
r2 = requests.get(url)
pprint.pprint(r2.json())
POST
POST方法用于插入一条新数据
以下代码包含三种情况:
- 不传递参数,报错
- 传递不符合schema的数据,报错
- 传递合规数据
import requests
import pprint
url = "http://127.0.0.1:5000/api/account/"
# 不传递data
r1 = requests.post(url, json={})
print("不传递data")
pprint.pprint(r1.json())
# 传递不符合AccountSchma的数据
data = {"name": "bage", "email": "bage@163.com"}
r2 = requests.post(url, json=data)
print("传递不符合AccountSchma的数据")
pprint.pprint(r2.json())
# 传递正确数据
data = {"account_name": "bage", "account_email": "bage@163.com"}
r3 = requests.post(url, json=data)
print("传递正确数据")
pprint.pprint(r3.json())
PUT
全量更新
以下代码包含以下多种情况:
- 更新的数据不存在
- 提交的数据不完整
- 提交的数据格式错误
- 正确完整的数据
import requests
import pprint
# 不存在的数据
url = "http://127.0.0.1:5000/api/account/188"
payload = {"account_name": "8ge", "account_email": "8ge@123.com"}
r = requests.put(url, json=payload)
print("不存在的数据")
pprint.pprint(r.json())
url = "http://127.0.0.1:5000/api/account/1"
# 不完整数据
payload = {"account_name": "8ge"}
r1 = requests.put(url, json=payload)
print("不完整数据")
pprint.pprint(r1.json())
# 错误数据
payload = {"account_name": "8ge", "account_email": "8ge@123.com", "account_password": "123456"}
r2 = requests.put(url, json=payload)
print("错误数据")
pprint.pprint(r2.json())
# 修改前的数据
r = requests.get(url)
print("查询修改前的数据")
pprint.pprint(r.json())
# 全量正确数据
payload = {"account_name": "lisi", "account_email": "lisi@123.com"}
r3 = requests.put(url, json=payload)
print("全量正确数据")
pprint.pprint(r3.json())
# 查询修改后的数据
r4 = requests.get(url)
print("查询修改后的数据")
pprint.pprint(r4.json())
PATCH
部分更新
多种情况进行验证:
- 不存在的数据
- 提交错误的数据
- 提交正确的数据
import requests
import pprint
# 不存在的数据
url = "http://127.0.0.1:5000/api/account/188"
payload = {"account_name": "lisi", "account_email": "8ge@123.com"}
r = requests.patch(url, json=payload)
print("不存在的数据")
pprint.pprint(r.json())
url = "http://127.0.0.1:5000/api/account/1"
# 错误数据
payload = {"account_name": "8ge", "account_email": "8ge@123.com", "account_password": "123456"}
r2 = requests.patch(url, json=payload)
print("错误数据")
pprint.pprint(r2.json())
# 修改前的数据
r = requests.get(url)
print("查询修改前的数据")
pprint.pprint(r.json())
# 不完整数据 patch更新
payload = {"account_name": "8ge"}
r1 = requests.patch(url, json=payload)
print("不完整数据 patch更新")
pprint.pprint(r1.json())
# 查询修改后的数据
r4 = requests.get(url)
print("查询修改后的数据")
pprint.pprint(r4.json())
DELETE
删除操作
import requests
import pprint
url = "http://127.0.0.1:5000/api/account"
print("不存在的数据")
r1 = requests.delete(url + '/10')
pprint.pprint(r1.json())
print("删除id为5的数据")
r2 = requests.delete(url + '/5')
pprint.pprint(r2.json())
print('id为5的数据查询不到')
r3 = requests.get(url + '/5')
pprint.pprint(r3.json())
PUT与PATCH的区别
在 Flask-Restful 中,PUT 和 PATCH 都是用于更新资源的 HTTP 方法,但它们之间存在一些关键区别:
- PUT 方法:
PUT 方法用于完全替换现有资源的内容。这意味着,使用 PUT 方法时,客户端会向服务器发送整个资源内容,以便替换现有的资源。因此,PUT 方法通常用于完整更新资源,例如更新整个文章或用户信息。 - PATCH 方法:
PATCH 方法用于部分更新资源的内容。与 PUT 方法不同,PATCH 方法不会替换整个资源,而是根据客户端发送的指示来修改资源的某些部分。因此,PATCH 方法适用于对资源的特定部分进行更新,例如更新用户的部分信息或对文章进行部分修改。
总结起来,PUT 方法用于替换整个资源,而 PATCH 方法用于部分更新资源。选择使用 PUT 方法还是 PATCH 方法取决于你要更新的资源类型和更新的性质。
从代码上看,区别在于使用Schema进行校验的时候,使用了parital参数。这意味着即使 JSON 数据不完整或缺少某些字段,Marshmallow 仍然会尝试加载可用的数据部分。