рд╕реГрд╖реНрдЯрд┐ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕рднрд╛рдЧ 1рд╢реБрдн рджреЛрдкрд╣рд░ рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпрд╛рдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдердВрдбрд░рдЧрд╛рд░реНрд╕ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЧреЗрдЯ рдлреЗрдВрдХрдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд╣реАрдВ рдФрд░ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЗрди рддрд░реНрдХреЛрдВ рдХреЛ рдЦреАрдВрдЪ рд▓реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлреНрд▓рд╛рд╕реНрдХ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп
@app.route('/ugly_calc', dont_wrap=True) def ugly_calc(): x, y = int(request.args['x']), int(request.args['y']) op_key = request.args.get('op') if not op_key: op_key = '+' op = OPERATION.get(op_key) return str(op(x, y))
рдХрд░рдирд╛
@app.route('/calc') def calc(x:Arg(int), y:Arg(int), op:Arg(str, default='+')): return str(OPERATION[op](x, y))
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдХрдо рд╕реЗ рдХрдо рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдордЭ рдЧрдпрд╛ рдХрд┐ рд▓реЗрдЦ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рднрд╡рд┐рд╖реНрдп рдкрд░ рдПрдХ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ "рдореАрд▓ рдХреЗ рдкрддреНрдерд░" рдХреА рдЕрдиреБрдорд╛рдирд┐рдд рд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИред рдЦреИрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╣рд▓реЗ рдбреНрд░рд╛рдлреНрдЯред
рдЗрд╕ рднрд╛рдЧ рдореЗрдВ
- рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдФрд░ рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
- рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред
- рд╡рд┐рд╢реЗрд╖ рддрд░реНрдХ (рд░реВрдврд╝рд┐, StrArg, ListArg, рдФрд░ рдЗрд╕реА рддрд░рд╣) рдХреА рдЕрд╢рд┐рд╖реНрдЯрддрд╛ рдмрдирд╛рдПрдБ
- рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЖрдИрдбреА рд╕реЗ рдПрдХ рдХрдХреНрд╖рд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЦреАрдВрдЪ рд▓реЗрдЧрд╛
- рд╣рдо рдореЙрдбрд▓ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ
- рд╣рдо рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдЖрдк рдХрдИ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдз рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ
- рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛
- рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЙрди рдЫреЛрдЯреЗ рд╣рд┐рддреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЗрди рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдХрднреА рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗред
рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрди, рдпрд╛ рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рд╛рдд рдорд╛рд░рдиреА рдЪрд╛рд╣рд┐рдП
рдЦреИрд░, рдЕрдм рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рднрд╛рдЧреНрдп рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЕрдВрдд рдореЗрдВ рдкрдврд╝рд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрд░реНрдорд┐рди рд░реЛрдирд╛рд╢рд░
рдиреЗ рдлреНрд▓рд╛рд╕реНрдХ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА , рдФрд░ рдореЗрд░реЗ "рдкрд╛рд▓рддреВ" рдХреЛ рд╕рд╣реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдпрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд░ рджрд┐рдпрд╛ (рдпрд╣ рдХрд╛рдо рдФрд░ рдЧрдбрд╝рдЧрдбрд╝рд╛рд╣рдЯ рдХрд╛ рдирд╛рдо рдердВрдбрд░рд╛рд░реНрдЧреНрд╕ рдХреЗ рдирд╛рдо рд╕реЗ рдмрдирд╛ рд░рд╣рд╛) рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕реЗ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдлреНрд▓рд╛рд╕реНрдХ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЕрдм рдпрд╣ рдмрдХрд╡рд╛рд╕ рдирд╛рдо рдлреНрд▓рд╛рд╕реНрдХ-рдереНрд░реЗрдбреНрд╕рдЧ рдХреЗ рддрд╣рдд рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рд╣рд╛рдВ, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпрд╣ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдкреГрдердХреНрдХрд░рдг рд╣реИ, рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд┐рдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╢реБрд░реВ рд╕реЗ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреБрдирд░реНрдЧрдарди рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд▓рдЧрднрдЧ рдкрд╛рдВрдЪ рдШрдВрдЯреЗ рдХрд╛ рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ:
рдЕрдм рд╣рдорд╛рд░реЗ рджреЛ рдХрд╛рдо рд╣реИрдВ - рдХрд░реНрдиреЗрд▓ рдФрд░ рдлреНрд▓рд╛рд╕реНрдХ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рдмрд╛рд╣рд░реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдПред рдпрд╛ рдЕрд░реНрдЧрдкрд░реНрд╕ рдХреЗ рд▓рд┐рдПред рдпрд╛ рдЬреИрдмрд░ рдмреЙрдЯ рдХреЛред рд╣рд╛рдБ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗрд╡рд▓ рдХрд╛рд▓реЗ рд░рдВрдЧ рдореЗрдВ рд╣реИред
рдлреНрд▓рд╛рд╕реНрдХ-рдердВрдбрд░рд╛рд░реНрдЧреНрд╕ рдЕрдм рдПрдХ рдкреВрд░реНрдг рдлреНрд▓рд╛рд╕реНрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ
рдХреЗрд╡рд▓ рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реА рдЫреЛрдЯрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдм
рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрджрд▓ рдЧрдИ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИред рдЕрдм рдПрдХ рдиреНрдпреВрдирддрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
from flask import Flask from flask.ext.thunderargs import ThunderargsProxy from thunderargs import Arg app = Flask(__name__) ThunderargsProxy(app) @app.route('/max') def find_max(x: Arg(int, multiple=True)): return str(max(x)) if __name__ == '__main__': app.run()
рдРрд╕реА рдмрд╛рддреЗрдВред
рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рдирд╛
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреИрд╕реЗ рдмрдирд╛рдПрдВред рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдореБрдЭреЗ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рд╣реИ:
def less_than_21(x): return x < 21 @app.route('/step5_alt') def step5_1(offset: Arg(int, default=0, validators=[lambda x: x >= 0 and x < len(elements)]), limit: Arg(int, default=20, validators=[less_than_21])): return str(elements[offset:offset+limit])
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдПрдХ рдЗрдирд▓рд╛рдЗрди рд╣реИ, рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рджреВрд╕рд░рд╛ рдкреВрд░реНрдг-рднрд╛рд░рд┐рдд рд╣реИред рдЕрдм рдореИрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдлреБрд▓-рд╡реЗрдЯ рд╡рд┐рдХрд▓реНрдк рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИред
рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░рдЦрд╛рдиреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХрддреЗ рд╣реИрдВ:
thunderargs.errors.ValidationError: Value of `limit` must be less than 21
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдХрд▓реНрдкрдиреАрдп рдФрд░ рдмрд╛рддреВрдиреА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ:
thunderargs.errors.ValidationError: Argument limit failed at validator
рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реА рддреНрд░реБрдЯрд┐ рдореВрд▓ рд╕реЗ рднреА рдмреЗрд╣рддрд░ рд╣реЛрдЧреА:
experiments.custom_error.LimitError: limit must be less than 21 and more than 0. Given: 23
рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
class LimitError(ValidationError): pass
from thunderargs.errors import customize_error from experiments.custom_error import LimitError message = "{arg_name} must be less than 21 and more than 0. Given: {value}" @customize_error(message=message, error_class=LimitError) def limit_validator(x): return x < 21 and x>0 @app.route('/step5_alt2') def step5_2(offset: Arg(int, default=0, validators=[lambda x: x >= 0 and x < len(elements)]), limit: Arg(int, default=20, validators=[limit_validator])): return str(elements[offset:offset+limit])
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдкрд░ custom_error рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд▓рдЯрдХрд╛ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдирд┐рдореНрди рдЪрд░ рд╣рдореЗрд╢рд╛ рддреНрд░реБрдЯрд┐ рдкрд╛рда рдореЗрдВ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
error_code
- рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП; рд╕рд┐рд╕реНрдЯрдореИрдЯрд╛рдЗрдЬреЗрд╢рди рдХреЗ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯреНрд░рд╛рд╕рд┐рд╕реНрдЯрдо рдмрдХрд╡рд╛рд╕;arg_name
рдЙрд╕ рддрд░реНрдХ рдХрд╛ рдирд╛рдо рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЗ рддрд░реНрдХ рдХреЛ рд╕реМрдВрдкреЗ рдЧрдП рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ; рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реАрдорд╛;value
- рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп; рдлреНрд▓рд╛рд╕реНрдХ-рдердВрдбрд░рдЧрд╛рд░реНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдХреЛрдИ reques.json рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдФрд░ reques.files рдЙрд╕реЗ рджреЗрддрд╛ рд╣реИ;validator_no
- validator_no
рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛; рдореБрдЭреЗ рдмрд╣реБрдд рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░рдЪрд┐рдд рдорд╛рдиреНрдпрддрд╛рдУрдВ рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧрд╛;
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк custom_error рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдирд╛рдорд╛рдВрдХрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧ рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рдореЛрдВ рдХреЗ рддрд╣рдд рдЧреЙрдмрд▓ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдореЗрдВ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рддреНрд░реБрдЯрд┐ рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реИрдзрддрд╛ рд╕реЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд╛рд░рдЦрд╛рдиреЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
def val_in(x): @customize_error("Value of `{arg_name}` must be in {possible_values}", possible_values=x) def validator(value): return value in x return validator
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ possible_values тАЛтАЛрдХреЛ x рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдЬрд┐рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдлреИрдХреНрдЯреНрд░реА рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрд╕реНрдХрд░рдг: 0.4рдирд┐рд╣рд┐рдд рд╡реИрд░рд┐рдПрдмрд▓ рдХрдХреНрд╖рд╛рдПрдВ
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрдд рдХреЗ рд╕реНрддрд░ рдХреЛ рдХрдо рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред рдФрд░ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рд╡рд┐рд╢реЗрд╖ рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрдВрдЧреАред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
class IntArg(Arg): def __init__(self, max_val=None, min_val=None, **kwargs): kwargs['p_type'] = int if not 'validators' in kwargs or kwargs['validators'] is None: kwargs['validators'] = [] if min_val is not None: if not isinstance(min_val, int): raise TypeError("Minimal value must be int") kwargs['validators'].append(val_gt(min_val-1)) if max_val is not None: if not isinstance(max_val, int): raise TypeError("Maximal value must be int") kwargs['validators'].append(val_lt(max_val+1)) if min_val is not None and max_val is not None: if max_val < min_val: raise ValueError("max_val is greater than min_val") super().__init__(**kwargs)
рдФрд░ рдпрд╣рд╛рдБ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ:
from experiments.inherited_args import IntArg @app.route('/step7') def step7(x: IntArg(default=0, max_val=100, min_val=0)): return str(x)
рдРрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХ рдХреЗ рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдХреЛрдб рдореЗрдВ рдЙрдирдХреЗ рдЕрд░реНрде рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрд╕реНрдХрд░рдг: 0.4ORM рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рдХрдХреНрд╖рд╛рдПрдВ
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдореЛрдВрдЧреЛрдПрдВрдЧрд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
class Note(Document): title = StringField(max_length=40) text = StringField(min_length=3, required=True) created = DateTimeField(default=datetime.now)
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓реМрдЯрд╛рдПред рдЖрдЗрдП рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ:
class ItemArg(Arg): def __init__(self, collection, **kwargs): kwargs['p_type'] = kwargs.get('p_type') or ObjectId kwargs['expander'] = lambda x: collection.objects.get(pk=x) super().__init__(**kwargs)
рд╡рд╣ рд╕рдм рдХрд░рддрд╛ рд╣реИ рдЗрдирдкреБрдЯ рддрд░реНрдХреЛрдВ рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░реЗрдВред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдиреНрдпреВрдирддрдо рд╡рд┐рдХрд▓реНрдк рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
@app.route('/step9/get') def step9_2(note: ItemArg(Note)): return str(note.text)
рдмрд╣реБрдд рд╕реБрдВрджрд░, рд╕рд╣реА?
рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрд╕реНрдХрд░рдг: рдпрд╣ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИрдлреНрд▓рд╛рд╕реНрдХ рдЧреЗрдЯрд░реНрд╕ рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВ
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореЙрдбрд▓ рдореЗрдВ рдХреБрдЫ рд╡рд░реНрдЧ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдЧреЗрдЯрд░реНрд╕ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдПрдХ рдЧреЗрдЯрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕реА рд░реВрдк рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЧрд╛ рдЬреИрд╕реЗ рд╡рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреЗрдЯреНрдЯрд░ рдЬрдирд░реЗрдЯрд░ рд╣рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ:
def make_default_serializable_getlist(cls, name="default_getter_name"): @Endpoint def get(offset: IntArg(min_val=0, default=0), limit: IntArg(min_val=1, max_val=50, default=20)): return list(map(lambda x: x.get_serializable_dict(), cls.objects.skip(offset).limit(limit))) get.__name__ = name return get
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ MongoEngine рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдЯреНрдЯрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХрдорд╛рддреНрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд░реНрдд рдпрд╣ рд╣реИ рдХрд┐
get_serializable_dict
рдкрджреНрдзрддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рд╡рд░реНрдЧ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдХрд┐рд╕реА рдХреЛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдкрд░реЗрд╢рд╛рдиреА рдирд╣реАрдВ рд╣реЛрдЧреАред рдФрд░ рдпрд╣рд╛рдБ рдЗрд╕ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:
getter = make_default_serializable_getlist(Note, name='step11_getter') app.route('/step11_alt3')(json_resp(getter))
json_resp
рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ
json_resp
рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
json_resp
, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдмрд╕
flask.jsonify
рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред
flask.jsonify
(рдпрджрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рд░реИрдкрд░-рдкрд░рд┐рд╡рд╣рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рдЬреЛ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред
рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрд╕реНрдХрд░рдг: рдкрд┐рдЫрд▓реЗ рдХреЗ рд╕рдорд╛рдирдХреЙрд▓ рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдЕрдзрд┐рдХ
рдЖрдЗрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмреЙрдбреА рдореВрд╡рдореЗрдВрдЯ рдХреЛ рд▓реЙрдЧ рдХрд░реЗрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдирд┐рдпрдореЛрдВ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреЗрдВрдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛:
def listen_with(listener): def decorator(victim): @wraps(victim) def wrapper(**kwargs): listener(func=victim, **kwargs) return victim(**kwargs) return wrapper return decorator
рдФрд░ рдХреЙрд▓рдмреИрдХ рдЦреБрдж:
def logger(func, **kwargs): print(func.__name__) print(kwargs)
рдпрд╣ рдХреЙрд▓рдмреИрдХ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдм рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
def denied_for_john_doe(func, firstname, lastname): if firstname == 'John' and lastname == 'Doe': raise ValueError("Sorry, John, but you are banned") @app.route('/step13') @listen_with(denied_for_john_doe) def step13(firstname: Arg(str, required=True), lastname: Arg(str, required=True)): return "greeting you, {} {}".format(firstname, lastname)
рдпрд╣рд╛рдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреА рдбрд┐рдЬрд╛рдЗрди рдПрдХ рдлреЗрдВрдбрд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ, рд╢реНрд░реЛрддрд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЕрдм, рдкреНрд░рдпреЛрдЧ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рдРрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рджреЗрдВред рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд░реВрдк рд╕реЗ рд╕рд╣реА рдЙрджрд╛рд╣рд░рдг рд╣реИ:
def mail_sender(func, email): if func.__name__ == 'step14':
рдЦреИрд░, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреА рддреИрдпрд╛рд░реАред
рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрд╕реНрдХрд░рдг: 0.5рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛
рдЕрдм рдЪрд▓реЛ рдорд┐рдард╛рдИ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЛред рдЖрдЬ, "рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ" рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рднрдВрдбрд╛рд░рдг рд╣реИред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рдХреЛ рдХрдо рдХрд░рддреА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбреЗрдЯрд╛ рдХреЛред рдФрд░ рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХрд╣реАрдВ рд╕реЗ рднреА рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рд╕реЗред рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк рджреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ? рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдм рддрдХ рдХреЗрд╡рд▓ рд╡рд╣ рдпрд╣рд╛рдВ рд░рд╣реЗрдЧрд╛:
TYPES = {'IntArg': IntArg}
рдЕрдм рд╣рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред
class DBArg(Document): name = StringField(max_length=30, min_length=1, required=True) arg_type = StringField(default="IntArg") params = DictField() def get_arg(self): arg = TYPES[self.arg_type](**self.params) arg.db_entity = self return arg
рдпрд╣рд╛рдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рддрд░реНрдХ рдХрд╛ рдирд╛рдо, рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рд╕рдВрдХреЗрдд рджрд┐рдП рдЧрдП рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ IntArg рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рд╡реЗ max_val, min_val, рдЖрд╡рд╢реНрдпрдХ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдФрд░ рдЕрдиреНрдп рд╕рднреА рд╣реИрдВ рдЬреЛ ORM рджреНрд╡рд╛рд░рд╛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
get_arg
рдлрд╝рдВрдХреНрд╢рди
get_arg
рдЙрджреНрджреЗрд╢реНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ Arg рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдмрд╛рд▓рд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрд░реНрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рд╛рдВ, рд╣рд╛рдВ, рдпрд╣ рд╕рдм рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╡рд┐рд▓реАрди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рддрд░реНрдХ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
class DBStruct(Document): args = ListField(ReferenceField(DBArg)) def get_structure(self): return {x.name: x.get_arg() for x in self.args}
рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдФрд░ рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдЕрд▓рдЧ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдореЛрдВрдЧреЛрдИрдирд┐рди рдХреЗ рд╕рд╛рде "рдмрд╛рдд рдирд╣реАрдВ" рдХреА рд╣реИ рдХрд┐
ListField(ReferenceField(DBArg))
рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╣рдо DBArg рд╡рд░реНрдЧ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред
рдФрд░ рд╣рдореЗрдВ рдПрдХ рдРрд╕реА рдЪреАрдЬ рдХреА рднреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рдХреЛ рдареЛрд╕ рдФрд░ рдареЛрд╕ рдореЗрдВ рдмрдирд╛рдПрдЧреАред рдЪрд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рд╕рднреА рдЬреАрд╡рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдФрд░ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИред рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдЯреЛрд░ рдпрд╛ рдиреАрд▓рд╛рдореА рд╣реИред рдХрднреА-рдХрднреА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдПред рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдХрд╛рд░реНрдп, рд╕рд╛рдорд╛рдиреЛрдВ рдХреА рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдкрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдВрдЧреЗ рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдп рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВрдЧреЗред
class Category(Document): name = StringField(primary_key=True) label = StringField() parent = ReferenceField('self') arg_structure = ReferenceField(DBStruct) def get_creator(self): @Endpoint @annotate(**self.arg_structure.get_structure()) def creator(**kwargs): return Item(data=kwargs).save() creator.__name__ = "create_" + self.name return creator def get_getter(self): pass
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдПрдХ рд╢реНрд░реЗрдгреА рдореЙрдбрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдирд╛рдо рд╣реЛрдЧрд╛, рдЬреЛ рдирд╛рдордХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдирд╛рдо, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдФрд░ рдПрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ (рд╣рд╛рдБ, рд╣рдо рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡-рддреИрдпрд╛рд░реА рдХрд░реЗрдВрдЧреЗ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рдХреИрд╢ рдФрд░ рдЕрдиреНрдп рдЕрдЪреНрдЫрд╛рдЗрдпреЛрдВ рдХреЛ рдкреЗрдВрдЪ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА, рдкреНрд░рдпреЛрдЧ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВрдЧреЗред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрд▓реЛрдб рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдВ, рдкрд┐рдЫрд▓реЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддрд░рд╣, рдЗрд╕реЗ рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
class Item(Document): data = DictField() category = ReferenceField(Category)
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЦреИрд░, рдЕрдм рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рдкрд╣рд▓реА рд╢реНрд░реЗрдгреА рдмрдирд╛рддреЗ рд╣реИрдВ:
>>> weight = DBArg(name="weight", params={'max_val': 500, 'min_val':0, 'required': True}).save() >>> height = DBArg(name="height", params={'max_val': 290}).save() >>> human_argstructure = DBStruct(args=[weight, height]).save() >>> human = Category(name="human", arg_structure=human_argstructure).save()
рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдмреЗрдЪрдирд╛ рдмрд╣реБрдд рдиреИрддрд┐рдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╕рд┐рд░реНрдл рд╣реБрдЖ рд╣реИ :)
рдЕрдм рд╣рдореЗрдВ рдПрдХ рд░реИрдкрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рдирд╛рдо рдмрдирд╛рдПрдВрдЧреЗ:
@app.route('/step15_abstract') def abstract_add_item(category: ItemArg(Category, required=True, p_type=str)): creator = category.get_creator() wrapped_creator = app._arg_taker(creator) return str(wrapped_creator().id)
рдЕрдм рдпрд╣ рдмрд╣реБрдд рдмрджрд╕реВрд░рдд рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдПрдХ рдФрд░ рдЧрд▓рддреА рдХреЗ рдХрд╛рд░рдг рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдУрд╣ рдареАрдХ рд╣реИред рдЕрдм рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╢реНрд░реЗрдгреА рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдерд╛ (
Note
рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдЧреИрд░-рдореМрдЬреВрдж рд╢реНрд░реЗрдгреА рдореЗрдВ рдЙрддреНрдкрд╛рдж рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ DoNotExist рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдЗрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдЗрд╕рдХрд╛ рд╕рд┐рд╕реНрдЯрдо рдирд╛рдо рд╣реИ, рдФрд░ рдпрд╣ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣
human
ред рддрджрдиреБрд╕рд╛рд░, рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
localhost:5000/step15_abstract?category=human&weight=100&height=200
рдмрд╛рдХреА рдХреЛ рддрдерд╛рдХрдерд┐рдд рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
app._arg_taker
- рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рд╕реНрд░реЛрдд рд╕реЗ рд▓рд╛рдкрддрд╛ рддрд░реНрдХ рдХреЛ "рдкреНрд░рд╛рдкреНрдд" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ request.args рд╣реИ, рд▓реЗрдХрд┐рди, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕реНрд░реЛрдд рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдореЗрд░реА рд╡рд╛рд╕реНрддреБ рдЧрд▓рддреА рд╣реИред рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрд╕реНрдХрд░рдг: рдХрднреА рдирд╣реАрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдиреБрднрд╡ рд╣реИрдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рднрд╡рд┐рд╖реНрдп
рдЦреИрд░, рд╢рд╛рдпрдж рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдЖрдЬ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдЕрдм рдЖрдк рд▓рдВрдмреЗ рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рдЕрдЯрдХрд▓реЗрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдПрдХ рднреА рд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреИрддрд┐рдХ рд░реВрдк рд╕реЗ рдореЗрд░реА рдорджрдж рдХреА :)
рдФрд░ рдЕрдм рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЗрд░рд╛рджреЛрдВ рдФрд░ рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рдЖрдиреЗ рд╡рд╛рд▓реЗ рдорд╣реАрдиреЛрдВ рдХреА рдореБрдЦреНрдп рджрд┐рд╢рд╛ рдХреЛрдб рдХрдореЗрдВрдЯрд┐рдВрдЧ, рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдФрд░ рдЯреЗрд╕реНрдЯ рдХрд╡рд░реЗрдЬ рд╣реЛрдЧреАред рд╣рд╛рдВ, рдореИрдВ рдЦреБрдж рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдореЗрд░рд╛ рдХреЛрдб рд╕рд┐рд░реНрдл рдШреГрдгрд┐рдд рд╣реИ, рдЗрд╕рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдореВрд░реНрдЦрддрд╛ рд╣реЛрдЧреАред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдХреБрдЫ рдФрд░ рдлрд╛рдЯрдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреИрд╕реЗ рдПрдХ рдлреНрд▓реИрдВрдХ, рдЕрдиреНрдп рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЛред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдЙрди рдЬрдЧрд╣реЛрдВ рдХреЛ рдвреВрдВрдврдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд╣рд╛рдВ рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред рдЕрдм рддрдХ, рдХреЗрд╡рд▓ рдмрд╡рдВрдбрд░ рдФрд░ рдЕрд░реНрдЧрдкрд░реНрд╕ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд╣реА, рдпрд╣рд╛рдБ рдореИрдВ рдлреАрдбрдмреИрдХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдирддрд╛ рд╣реВрдБред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдердХрд╛рдК рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рдЬреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╡рд╣ рдЕрдВрддрд┐рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬреЛрдВрд╕-рдЖрд░рдкреАрд╕реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗрдЧрд╛, рддрд╛рдХрд┐
OPTIONS
рдЕрдиреБрд░реЛрдз рдкрд░ рдЧреНрд░рд╛рд╣рдХ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗ рдХрд┐ рдХреМрди рд╕рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрдирдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
рдмрд╛рдж рдореЗрдВ рдореИрдВ рдПрдХ рдФрд░, рдЕрдВрддрд┐рдо рд▓реЗрдЦ рд▓рд┐рдЦреВрдВрдЧрд╛ред рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди" рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрдЧреАред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХреБрдЫ рд╕реЗрд╡рд╛ рдХреА рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрдЧрд╛ред рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╛рдЗрдЯ (рдПрдХ рдЙрджрд╛рд╕ рдкрд╛рдВрдбрд╛ рдХреЗ рд╕рд╛рде) рдкрд░ рдЯреИрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рд╕реБрдирдХрд░ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреАред рдорд╛рдЗрдХреНрд░реЛрдмреНрд▓реЙрдЧрд┐рдВрдЧ, рдХреНрдпреВ рдПрдВрдб рдП рдордВрдЪреЛрдВ, рдЬреЛ рднреА рд╣реЛред рдореИрдВ рдкреНрд░рддрд┐рдмрдВрдз рдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддрд╛ред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЖрдк рдореЗрд░реЗ "рдкрд╛рд▓рддреВ" рдХреЗ рдХрдИ рдкрд╣рд▓реБрдУрдВ рдХреЛ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЖрдкрдХреЛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рд╕рдВрднрд╡рддрдГ рдХреБрдЫ рдмрдЧ рдпрд╛ рд╡рд╛рд╕реНрддреБ рджреЛрд╖реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореИрдВ рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рдХрд┐рд╕реА рднреА рдЗрдЪреНрдЫрд╛ рд╕реЗ рдЦреБрд╢ рд╣реВрдВред
рдореБрдЦреНрдп рд╢рд▓рдЬрдордлреНрд▓рд╛рд╕реНрдХ-рдЧреЗрдЯ (рд▓реЗрдЦ рд╕реЗ рд╕рднреА рдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ)