Python 웹 응용 프로그램을 어떻게 만드는지 (3): JSON schema와 복잡한 json 요청체의 검사

7146 단어
이것은 내가 발견한 강력한 json 데이터 검사 도구이다.flask app에서 json 데이터의 검사를 사용할 수 있을 뿐만 아니라 모든 장면에서 json 데이터의 검사도 매우 강력하다.
일반적으로 데이터 체크에는 다음과 같은 계층이 포함됩니다.
  • 형식 검사: json 문법에 부합되는지 여부
  • 속성 검사: json이 표시한 대상(object)에 지정된 속성을 포함하는지, 필요하지 않은 데이터를 포함하는지, 각 속성이 규정된 유형인지 여부
  • 값 검사: 데이터 값을 검사합니다.예를 들어 문자열의 길이 범위, 디지털 속성의 수치 범위, 집합 속성의 원소 개수와 원소의 데이터 형식
  • 을 규정한다.
  • 논리 검사: 이것은 업무 논리와 관련이 있다.예를 들어 전송된 id가 가리키는 사용자에게 조작 권한이 있는지 여부입니다.전송된 데이터가 데이터베이스에 있는 데이터와 충돌하는지 여부 등.이 부분은 프레임을 사용해서 실현하기 매우 어렵다.

  • 우선, JSON Schema란?아래 자료를 참조하십시오.
  • 빠른 시작: getting-started-step-by-step
  • understanding json schema
  • understanding json schema

  • jsonschema와 파생된 도구의 생태는 상기 기능을 제공하는 것 외에 사용하기 쉬운 도구도 제공한다.
  • jsonschema(python module): 데이터 검사에 SDK를 제공하고 검사 인터페이스와 상세한 오류 알림 기능
  • 을 제공합니다.
  • json schema Tool: 온라인 json schema 생성 및 도형화 편집 도구로 문법에 맞는 json schema 규정 파일을 작성할 수 있습니다.사이트 주소

  • 다음은 대부분의 용례를 포함하는 jsonschema python module 사용 사례 (참고 자료 이다
    from jsonschema import validate, ValidationError #       
    
    @app.route('/login4', methods=['POST'])
    def login4():
        body = request.get_json()
        try:
            validate(
                body,
                {
                    "$schema": "http://json-schema.org/learn/getting-started-step-by-step",
                    #      JSON  ,title    ,    
                    "title": "book info",
                    #      JSON  ,description             
                    "description": "some information about book",
                    #            JSON         ,    :object,array,integer,number,string,boolean,null
                    "type": "object",
                    #     JSON        key         ,
                    #      JSON                      key     ,  key    ,    JSON Schema,    JSON      。
                    "properties": {
                        "id": {
                            "description": "The unique identifier for a book",
                            "type": "integer",
                            "minimum": 1
                        },
                        "name": {
                            "description": "book name",
                            "type": "string",
                            "minLength": 3,
                            "maxLength": 30
                        },
                        "tips": {
                            "anyOf": [  #            
                                {"type": "string", "minLength": 10, "maxLength": 60}, 
                                {"type": "number", "minimum": 5.0}
                            ]
                        },
                        "price": {
                            "description": "book price",
                            "type": "number",
                            #   0.5  
                            "multipleOf": 0.5,
                            #     ,5.0= ".join([i for i in e.path]), e.message)
            print(msg)
            return jsonify(status=500, msg=msg)
            
        print(body)
        title = body.get('title')
        return '1'

    매거를 사용하는 예를 하나 더 넣다.매거진은 속성이 어떤 값을 얻을 수 있는지 지정했다.
    참조: enum 문서
    def check_request(user_id, req_body):
        if request.is_json:
            handle_request_schema = {
                "title": "handle requests",
                "type": "object",
                "properties": {
                    "id": {"type": "string", "maxLength": 20},
                    "tags": {
                        "type": "array",
                        "items": {"enum": [tag.tag_name for tag in ETag.query.all()]},
                        "uniqueItems": True
                    },
                    "self_answers": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {"type": "string", "maxLength": 20},
                                "type": {"enum": [elem.type_name for elem in CAnswerType.query.all()]},
                                "level": {"enum": [elem.level for elem in CAnswerLevel.query.all()]}
                            },
                            "required": ["id", "allowed", "comment", "author_id",
                                         "type", "content", "summary", "level"]
                        }
                    },
                    "adjusted_answers": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {"type": "string", "maxLength": 20},
                                "level": {
                                    "enum": [level.level for level in CAnswerLevel.query.all()]}
                            },
                        },
                    }
                }
            }
            try:
                validate(req_body, handle_request_schema)
            except ValidationError as e:
                msg = "json     schema  :
    :{}
    :{}".format(".".join([str(i) for i in e.path]), e.message) return msg, 500 else: return " JSON ", 500 return "", 200

    특히 위의 예에서 매거진 수치는 실행할 때 동적으로 불러오는 것으로 프로그램의 작성과 유지보수에 큰 편의성을 제공했다
    열거뿐만 아니라 실제 필드의 길이도 SQLAlchemy를 통해 동적으로 얻을 수 있습니다.
    방법:how-to-get-sqlalchemy-length-of-a-string-column

    좋은 웹페이지 즐겨찾기