<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های carvanro</title><link>https://virgool.ir/feed/@carvanro</link><description>کاروانرو - پلتفرمی برای اشتراگ گذاری سفر</description><language>fa</language><pubDate>2026-11-11 08:51:20</pubDate><image><url>https://files.virgool.ir/upload/users/3556/avatar/BeXnZI.png</url><title>carvanro</title><link>https://virgool.ir/@carvanro</link></image><item><title>اعتبار سنجی در فلسک با cerberus  ( نگهبان جهنم )</title><link>https://virgool.ir/@carvanro/اعتبار-سنجی-با-فلسک-و-پایتون-glmdua9c2tjb</link><description>ما توی کاروانرو از سرویس های زیادی که با Flask (فلسک)  راه اندازی شده و این سرویس ها از طریق JSON با هم در ارتباط هستند، برای اعتبار سنجی JSON ما از سربرس استفاده کردیم و این پست قرار که نشون بده که سربرس چطور کار میکنه و چطور توی API کاروانرو پیاده سازی شده.با یک مثال ساده ابتدا شروع میکنیمسربرس برای اعتبارسنجی به یک الگو(schema) نیاز داره.Import Validator&#xA;schema = {&#39;name&#39;: {&#39;type&#39;: &#39;string&#39;}}&#xA;v = Validator(schema)و حالا میتونی از این الگویی که به سربرس دادیم استفاده کنیم.&gt;&gt;&gt; document = {&#39;name&#39;: 1 }&#xA;&gt;&gt;&gt; v.validate(document)&#xA;False&#xA;&gt;&gt;&gt; v.errors&#xA;{&#39;name&#39;: &#39;must be an string&#39;}ولی خب این مثال کمی ساده بنظر میرسه  و توی دنیای واقعی کاربردی نداره.برای روشن تر شدن قضیه بیایید اول به صفحه Login این رو اضافه کنیم.# login_schema.py&#xA;&#xA;login_schema = { &#xA;    &#39;user_name&#39;: { &#xA;        &#39;type&#39;: &#39;string&#39;, &#xA;        &#39;required&#39;: True &#xA;     }, &#xA;    &#39;password&#39;: { &#xA;           &#39;type&#39;: &#39;string&#39;,&#xA;           &#39;required&#39;: True &#xA;        }, &#xA;}&#xA;# view.login.pyfrom cerberus import Validator@app.route(&#39;/login&#39;, methods=[ &#39;POST&#39;])&#xA;def login_user():   &#xA;    data = request.get_json()&#xA;    v = Validator(login_schema)    If v.validate(data):&#xA;        return jsonify({&#39;status&#39;: &#39;ok&#39;})&#xA;    else:&#xA;        return jsonify(validator.errors), 422خب بیاین یکم پایتونی تر باشیم و این اعتبارسنج رو به یک decorator تبدیلش کنیم# validator_schema.pyfrom flask import jsonify, requestfrom functools import wrapsfrom cerberus import Validator&#xA;def validate_schema(schema):&#xA;    def contextualized_decorator(view_func):&#xA;        @wraps(view_func)&#xA;        def wrapper(*args, **kwargs):&#xA;               data = request.get_json()&#xA;               validator = Validator(schema)&#xA;               if not validator.validate(data):&#xA;                   return jsonify(validator.errors), 422&#xA;               return view_func(*args, **kwargs)&#xA;       return wrapper&#xA;  return contextualized_decoratorچرا از wraps استفاده شد؟&gt;&gt;&gt; from functools import wraps&#xA;&gt;&gt;&gt; def my_decorator(f):&#xA;... @wraps(f)&#xA;... def wrapper(*args, **kwds):&#xA;... print &#39;Calling decorated function&#39;&#xA;... return f(*args, **kwds)&#xA;... return wrapper&#xA;&gt;&gt;&gt; @my_decorator&#xA;... def example():&#xA;... &#34;&#34;&#34;Docstring&#34;&#34;&#34;&#xA;... print &#39;Called example function&#39;&#xA;&gt;&gt;&gt; example()&#xA;Calling decorated function&#xA;Called example function&#xA;&gt;&gt;&gt; example.__name__&#xA;&#39;example&#39;&#xA;&gt;&gt;&gt; example.__doc__&#xA;&#39;Docstring&#39;؛ اگه از wraps استفاده نکنیم example.__name__ تبدیل میشه به wrapper که این خوب نیست و اسم متد اصلی حذف میشه و بعد در کامنت گذاری متدها مشکل بوجود میاره.حالا دیگه ما decorator مون آماده بکار هست.@app.route(&#39;/login&#39;, methods=[ &#39;POST&#39;])&#xA;@validate(login_schema)&#xA;def login_user():&#xA;    return jsonify({&#39;status&#39;: &#39;ok&#39;}) ⋊&gt; ~ curl -d &#39;{&#34;user_name&#34;:&#34;carvanro&#34;, &#34;password&#34;:&#34;pass&#34;}&#39; \ &#xA;    -H &#34;Content-Type: application/json&#34; -X POST http://127.0.0.1:5000/login&#xA;⋊&gt; ~ {&#39;status&#39;: &#39;ok&#39;}در صورت دریافت JSON نامعتبر⋊&gt; ~ curl -d &#39;{&#34;user_name&#34;: 123, &#34;password&#34;:&#34;pass&#34;}&#39; \ &#xA;    -H &#34;Content-Type: application/json&#34; -X POST http://127.0.0.1:5000/login&#xA;⋊&gt; ~ {&#39;user_name&#39;: &#39;must be of string type&#39;}حالا کافیه این روش رو برای هرجایی که مایل باشید بکار ببرید اونم فقط با یک decorator و schema</description><category>carvanro</category><author>carvanro</author><pubDate>Sat, 10 Mar 2018 11:23:37 +0330</pubDate></item></channel></rss>