Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Хранимые процедуры и вот вам логика
Ты же просто хранимая процедура, имитация ЯП. Разве может хранимая процедура отправить письмо или сделать http-запрос?
from pydantic import create_model
def get_query_schema(handler):
params = inspect.signature(handler).parameters
query_params = {k: (p.annotation, p.default) for k, p in params.items() if k not in ('pk', 'request', 'self')}
return create_model('query_schema', **query_params)
@web.middleware
async def webapi_validate_query(request, handler):
self = handler.__closure__[0].cell_contents.__self__
if request.method not in ('GET', 'POST', 'PUT', 'DELETE'):
raise web.HTTPMethodNotAllowed(f'{request.method} not allowed')
query = request.query.copy()
if self.paginator:
self.paginator.get_page_from_query(query)
if self.filter_class:
self.filter = self.filter_class(**request.query)
validated_query = self.query_schema(**query.items()).dict()
result = await handler(request, **request.match_info, **validated_query)
return web.json_response(result, dumps=dumps)@bp.route('/charge', methods=['POST'])
@use_args({
"account": fields.Int(required=True),
"agent": fields.Int(required=True),
"ts": fields.DateTime(),
"unit": fields.Int(required=True),
"service": fields.UUID(required=True),
"amount": fields.Decimal(required=True),
"count": fields.Decimal(missing=1),
"note": fields.Str()
})
def add_charge(args):
schema = ChargeMaSchema()
if args.get('amount') < 0:
return abort(422)
try:
new_charge = Charge(**args)
commit()
return schema.jsonify(new_charge)
except:
abort(422)
async def test_handler(request, query: str, page: int=1): pass
from webargs.flaskparser import use_args
from webargs import fields
# Code ...
class UserLogin(Resource):
@use_args({'username': fields.Str(),
'password': fields.Str()}, locations=['json'])
def post(self, args):
if args.get('username') == 'admin' and args.get('password') == 'habr':
# Code
@use_args({
'username': fields.Str(required=True),
'password': fields.Str(required=True)},
locations=['json'])
{
"error": "Invalid username and password"
}<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>422 Unprocessable Entity</title>
<h1>Unprocessable Entity</h1>
<p>The request was well-formed but was unable to be followed due to semantic errors.</p>
Админка за 5 минут. Фронтэнд — react-admin, бэкэнд — Flask-RESTful