gpt4 book ai didi

python - Bottle 中的 DRY 验证?

转载 作者:太空狗 更新时间:2023-10-30 01:21:34 24 4
gpt4 key购买 nike

我的 Bottle 应用程序还不是很干,这是一个测试用例:

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

解决这个问题的一种方法是拥有一个全局错误处理程序,并在所有地方引发错误。

另一种是使用装饰器,它也有开销问题。

是否有更好的方法来完成每条路线的验证方面? - 我在想类似的事情:

foo_app.post('/foo', middleware=[HAS_BODY_F, ID_IN_DB_F])

最佳答案

最终找到了 Bottle 的内置“中间件”,称为“插件”(reference):

from bottle import Bottle, request, response

app = Bottle()


def has_body(f):
def inner(*args, **kwargs):
if request.json:
return f(*args, **kwargs)

response.status = 400
return {'error': 'ValidationError',
'error_message': 'Body is required (and must be JSON).'}
return inner


def body_req(required):
def body_req_middleware(f):
def inner(*args, **kwargs):
intersection = required.intersection(set(request.json.keys()))
if intersection != required:
response.status = 400
return {'error': 'ValidationError',
'error_message': 'Key(s): {} are not in JSON payload'
''.format(', '.join('{!r}'.format(k)
for k in required - intersection))}
return f(*args, **kwargs)
return inner
return body_req_middleware


@app.post('/foo', apply=(has_body, body_req({'id', 'f'})))
def get_foo():
return {'foo': 'bar'}

关于python - Bottle 中的 DRY 验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30494936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com