Moi butelek aplikacje nie były bardzo DRY, oto test-case:Walidacja DRY w butelce?
from uuid import uuid4
from bottle import Bottle, response
foo_app = Bottle()
@foo_app.post('/foo')
def create():
if not request.json:
response.status = 400
return {'error': 'ValidationError', 'error_message': 'Body required'}
body = request.json
body.update({'id': uuid4().get_hex())
# persist to db
# ORM might set 'id' on the Model layer rather than setting it here
# ORM will validate, as will db, so wrap this in a try/catch
response.status = 201
return body
@foo_app.put('/foo/<id>')
def update(id):
if not request.json:
response.status = 400
return {'error': 'ValidationError', 'error_message': 'Body required'}
elif 'id' not in request.json:
response.status = 400
return {'error': 'ValidationError', 'error_message': '`id` required'}
db = {} # should be actual db cursor or whatever
if 'id' not in db:
response.status = 404
return {'error': 'Not Found',
'error_message': 'Foo `id` "{id}" not found'.format(id)}
body = request.json
# persist to db, return updated object
# another try/catch here in case of update error (from ORM and/or db)
return body
Jednym ze sposobów rozwiązania tego problemu jest stworzenie globalnej obsługi błędów i podnieść błędy w każdym miejscu.
Innym jest użycie dekoratorów, które również mają problemy z napowietrznymi.
Czy istnieje lepszy sposób sprawdzania poprawności każdej trasy? - Mam na myśli coś takiego:
foo_app.post('/foo', middleware=[HAS_BODY_F, ID_IN_DB_F])
Wystarczy ciekawy (ponieważ używam ich wszystkich na miejscu) - masz żadnych odniesień do«dekoratorów ... mają problemy napowietrznych»? –
Nie pamiętam dokładnie, kiedy o tym usłyszałem, ale oto blog na ten temat: http://blog.dscpl.com.au/2014/02/performance-overhead-when-applying.html –
Dzięki, doceń odniesienie. –