[ Flask-form自定义json校验 ]


# 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()