Flask: Decorator to verify JSON and JSON Schema Flask: Decorator to verify JSON and JSON Schema flask flask

Flask: Decorator to verify JSON and JSON Schema


Just use the request context global in your decorator. It is available during any request.

from functools import wrapsfrom flask import (    current_app,    jsonify,    request,)def validate_json(f):    @wraps(f)    def wrapper(*args, **kw):        try:            request.json        except BadRequest, e:            msg = "payload must be a valid json"            return jsonify({"error": msg}), 400        return f(*args, **kw)    return wrapperdef validate_schema(schema_name):    def decorator(f):        @wraps(f)        def wrapper(*args, **kw):            try:                validate(request.json, current_app.config[schema_name])            except ValidationError, e:                return jsonify({"error": e.message}), 400            return f(*args, **kw)        return wrapper    return decorator

Apply these decorators before applying the @route decorator; you want to register the wrapped function, not the original function for the route:

@app.route('/activate', methods=['POST'])@validate_json@validate_schema('activate_schema')def activate():    input = request.json


now you can use @expect_json directly

For Example

from flask import Flask, jsonify, g, url_forfrom flask_expects_json import expects_json# example importsfrom models import Userfrom orm import NotUniqueErrorapp = Flask(__name__)schema = {    'type': 'object',    'properties': {        'name': {'type': 'string'},        'email': {'type': 'string'},        'password': {'type': 'string'}    },    'required': ['email', 'password']}@app.route('/register', methods=['POST'])@expects_json(schema)def register():    # if payload is invalid, request will be aborted with error code 400    # if payload is valid it is stored in g.data    # do something with your data    user = User().from_dict(g.data)    try:        user.save()    except NotUniqueError as e:        # exception path: duplicate database entry        return jsonify(dict(message=e.message)), 409    # happy path: json response    resp = jsonify(dict(auth_token=user.encode_auth_token(), user=user.to_dict()})    resp.headers['Location'] = url_for('users.get_user', user_id=user.id)    return resp, 201

or

from flask import Flaskfrom flask_expects_json import expects_jsonapp = Flask(__name__)schema = {    'type': 'object',    'properties': {        'name': {'type': 'string',  "minLength": 4, "maxLength": 15},        'mobile': {'type': 'string', "pattern": "^[1-9]{1}[0-9]{9}$"},        'email': {'type': 'string', "pattern": "[^@]+@[^@]+\.[^@]"},        'password': {'type': 'string', "pattern": "^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).*$"}    },    'required': ['name', 'mobile', 'email', 'password']}@app.route('/', methods=['POST'])@expects_json(schema)def index():    values = request.get_json()    print(values)    return values

get more from here


A late answer, but you're probably looking for something like marshmallow (flask-marshmallow) or toastedmarshmallow.