Skip to main content

Validate request arguments, Including Cross Field, Cross Struct

Project description

https://raw.githubusercontent.com/Eastwu5788/pre-request/master/docs/static/logo.jpg https://github.com/Eastwu5788/pre-request/actions/workflows/intergration.yml/badge.svg https://codecov.io/gh/Eastwu5788/pre-request/branch/master/graph/badge.svg?token=KAB3VL6B7J PyPI - License Documentation Status PyPI Im

This framework is designed to validate params for Restful api request.

We can validate complex struct and field, including Cross Field, Cross Struct

Install

you can simply install it by:

pip install pre-request

Document

Pre-request manual could be found at: https://pre-request.readthedocs.io/en/master/index.html

A Simple Example

This is very easy to use pre-request in your project

from flask import Flask

from pre_request import pre, Rule

app = Flask(__name__)

args = {
   "userId": Rule(type=int, required=True)
}

@app.route("/")
@pre.catch(args)
def hello_world(params):
   from flask import g
   return str(params == g.params)

what happened in this code ?

  1. Use pre-request library to import a global object pre

  2. Define request params rule, userId must be type of int and required

  3. Use @pre.catch(req_params) to filter input value

  4. Use ~flask.g or def hello_world(params) to get formatted input value。

Complex Example

We use a very complex example to show the powerful of this framework

from flask import Flask
from pre_request import pre, Rule

args = {
    "userFirst": {
        "userId": Rule(type=int, required=False),
        "socialInfo": {
            "gender": Rule(type=int, enum=[1, 2], default=1),
            "age": Rule(type=int, gte=18, lt=80),
            "country": Rule(required=True, deep=False)
        }
    },
    "userSecond": {
        "userId": Rule(type=int, required=False, neq_key="userFirst.userId"),
        "socialInfo": {
            "gender": Rule(type=int, enum=[1, 2], default=1, neq_key="userFirst.socialInfo.gender"),
            "age": Rule(type=int, gte=18, lt=80, required_with="userFirst.socialInfo.age"),
            "country": Rule(required=True, deep=False)
        }
    }
}


app = Flask(__name__)
app.config["TESTING"] = True
client = app.test_client()

@app.route("/structure", methods=["GET", "POST"])
@pre.catch(args)
def structure_handler(params):
    return str(params)


if __name__ == "__main__":
    resp = app.test_client().post("/structure", json={
        "userFirst": {
            "userId": "13",
            "socialInfo": {
                "age": 20,
            }
        },
        "userSecond": {
            "userId": 14,
            "socialInfo": {
                "age": 21
            }
        },
        "country": "CN",
        "userFirst.socialInfo.gender": 1,
        "userSecond.socialInfo.gender": 2,
    })

    print(resp.get_data(as_text=True))

Use parse

We can use function pre.parse instead of decorator @pre.catch()

args = {
    "params": Rule(email=True)
}

@app.errorhandler(ParamsValueError)
def params_value_error(e):
    return pre.fmt_resp(e)


@app.route("/index")
def example_handler():
    rst = pre.parse(args)
    return str(rst)

Contributing

How to make a contribution to Pre-request, see the contributing.

Coffee

Please give me a cup of coffee, thank you!

BTC: 1657DRJUyfMyz41pdJfpeoNpz23ghMLVM3

ETH: 0xb098600a9a4572a4894dce31471c46f1f290b087

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pre_request-2.1.5.tar.gz (18.5 kB view hashes)

Uploaded source

Built Distribution

pre_request-2.1.5-py3-none-any.whl (29.2 kB view hashes)

Uploaded py3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page