# coding=utf-8
from flask import request, jsonify, abort
from wtforms import Form
from ...models import User
from ...extensions import db
from ...common.utils.jwt_token import jwt_filter_user
from typing import Literal
from ...common.exception import error_response
# request data 基础验证器
class RequestBaseForm(Form):
query = None
# 解析请求参数
def __init__(self, data=None, instance=None, pk=None, many=False, method: Literal['GET', 'POST', 'PUT', 'DELETE', None] = None):
# todo 做个处理,如果请求进来的请求时form参数则else,如果是json则进行下列操作
if "application/json" in request.headers.get("Content-Type"):
self._data = {key: str(value) for key, value in data.items()}
self._instance = instance
self._many = many
self.method = method
self.pk = pk
args = request.args.to_dict()
super(RequestBaseForm, self).__init__(data=self._data, **args)
else:
# application/x-www-form-urlencoded or multipart/form-data
data = request.form.to_dict()
args = request.args.to_dict()
super(RequestBaseForm, self).__init__(data=data, **args)
# 对验证错误的参数抛出异常
def validate_for_api(self):
valid = super(RequestBaseForm, self).validate()
if not valid:
return error_response(msg=self.errors)
return self
def get_model(self):
if self.query is None:
return error_response(msg={'msg': 'jsonForm缺少模型'})
return self.query
def save(self):
if self._data and self.pk is None:
return self.create(self.data)
if self._data and self.pk:
self._instance = self.get_object()
return self.update(self.data, self._instance)
def create(self, data):
obj = self.get_model()(**data)
db.session.add(obj)
db.session.commit()
self.obj = obj
return obj
def get_object(self):
if obj := self.get_model().query.filter_by(id=self.pk).first():
return obj
else:
error_response(msg={'msg': '不存在id', 'pk': self.pk})
def update(self, data: dict, instance):
for field, value in data.items():
setattr(instance, field, value)
db.session.commit()
return 1
def delete(self):
db.session.delete(self.get_object())
db.session.commit()
[ Flask-form自定义json校验 ]
发表评论
150 views