Data Validation

Data validation use many CPU resource, any mistake on data validation will down system into hole. Clink provides a mechanism to controll all of this processing in clink.dflow. In simple, put one data validation in service.

# STEP 1: get clink library
from clink import stamp, mapper, App, AppConf, Controller, Service
from clink.dflow import verify

# STEP 2: get an WSGI server
from wsgiref.simple_server import make_server

# STEP 3: create application configuration and application
conf = AppConf('book-api', 'Hell Corporation', '1st, Hell street')
app = App(conf)

# STEP 4: define component - service, controllers
# ===[BEGIN] TRY DATA VALIDATION =============================================
    'type': 'object',
    'additionalProperties': False,
    'required': ['name', 'author'],
    'properties': {
        'name': {'type': 'string', 'pattern': '^[a-zA-Z0-9 ]{2,32}$'},
        'author': {'type': 'string', 'pattern': '^[a-zA-Z0-9 ]{2,16}$'}

class BookSv(Service):
    @verify(None, POST_BOOK_SCHEMA)
    def create_one(self, book):
        # if data is invalid, clink.dflow.FormatError will be raise
        # then application catch and handle it


class BookCtl(Controller):
    def __init__(self, book_sv):
        self._book_sv = book_sv'/item')
    def create_one_book(self, req, res):
        res.body = {'message': 'created'}
# ===[END] TRY DATA VALIDATION ===============================================

# STEP 5: add components to application

# STEP 6: load components

# STEP 7: serve application on WSGI server
address = 'localhost'
port = 8080
print('Prepare API on http://%s:%i/book/item' % (address, port))
httpd = make_server(address, port, app)


$ python &> /dev/null &
[1] 9977

$ curl -X POST -H "Content-Type: application/json" \
-d '{"name": "Dead Note"}' localhost:8080/book/item; echo
{"message": {"value": "{'name': 'Dead Note'}", "name": "book",
"schema": {"type": "object", "properties": {"name": {"type":
"string", "pattern": "^[a-zA-Z0-9 ]{2,32}$"}, "author": {"type":
"string", "pattern": "^[a-zA-Z0-9 ]{2,16}$"}}, "required":
["name", "author"], "additionalProperties": false}},
"status_name": "400 Bad Request", "status": 400}

$ curl -X POST -H "Content-Type: application/json" \
-d '{"name": "Dead Note", "author": "Death"}' \
localhost:8080/book/item; echo
{"message": "created"}

$ kill %1