<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های carvanro</title>
        <link>https://virgool.io/feed/@carvanro</link>
        <description>کاروانرو - پلتفرمی برای اشتراگ گذاری سفر</description>
        <language>fa</language>
        <pubDate>2026-06-19 14:44:44</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/3556/avatar/BeXnZI.png?height=120&amp;width=120</url>
            <title>carvanro</title>
            <link>https://virgool.io/@carvanro</link>
        </image>

                    <item>
                <title>اعتبار سنجی در فلسک با cerberus  ( نگهبان جهنم )</title>
                <link>https://virgool.io/@carvanro/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1-%D8%B3%D9%86%D8%AC%DB%8C-%D8%A8%D8%A7-%D9%81%D9%84%D8%B3%DA%A9-%D9%88-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-glmdua9c2tjb</link>
                <description>ما توی کاروانرو از سرویس های زیادی که با Flask (فلسک)  راه اندازی شده و این سرویس ها از طریق JSON با هم در ارتباط هستند، برای اعتبار سنجی JSON ما از سربرس استفاده کردیم و این پست قرار که نشون بده که سربرس چطور کار میکنه و چطور توی API کاروانرو پیاده سازی شده.با یک مثال ساده ابتدا شروع میکنیمسربرس برای اعتبارسنجی به یک الگو(schema) نیاز داره.Import Validator
schema = {&#039;name&#039;: {&#039;type&#039;: &#039;string&#039;}}
v = Validator(schema)و حالا میتونی از این الگویی که به سربرس دادیم استفاده کنیم.&gt;&gt;&gt; document = {&#039;name&#039;: 1 }
&gt;&gt;&gt; v.validate(document)
False
&gt;&gt;&gt; v.errors
{&#039;name&#039;: &#039;must be an string&#039;}ولی خب این مثال کمی ساده بنظر میرسه  و توی دنیای واقعی کاربردی نداره.برای روشن تر شدن قضیه بیایید اول به صفحه Login این رو اضافه کنیم.# login_schema.py

login_schema = { 
    &#039;user_name&#039;: { 
        &#039;type&#039;: &#039;string&#039;, 
        &#039;required&#039;: True 
     }, 
    &#039;password&#039;: { 
           &#039;type&#039;: &#039;string&#039;,
           &#039;required&#039;: True 
        }, 
}
# view.login.pyfrom cerberus import Validator@app.route(&#039;/login&#039;, methods=[ &#039;POST&#039;])
def login_user():   
    data = request.get_json()
    v = Validator(login_schema)    If v.validate(data):
        return jsonify({&#039;status&#039;: &#039;ok&#039;})
    else:
        return jsonify(validator.errors), 422خب بیاین یکم پایتونی تر باشیم و این اعتبارسنج رو به یک decorator تبدیلش کنیم# validator_schema.pyfrom flask import jsonify, requestfrom functools import wrapsfrom cerberus import Validator
def validate_schema(schema):
    def contextualized_decorator(view_func):
        @wraps(view_func)
        def wrapper(*args, **kwargs):
               data = request.get_json()
               validator = Validator(schema)
               if not validator.validate(data):
                   return jsonify(validator.errors), 422
               return view_func(*args, **kwargs)
       return wrapper
  return contextualized_decoratorچرا از wraps استفاده شد؟&gt;&gt;&gt; from functools import wraps
&gt;&gt;&gt; def my_decorator(f):
... @wraps(f)
... def wrapper(*args, **kwds):
... print &#039;Calling decorated function&#039;
... return f(*args, **kwds)
... return wrapper
&gt;&gt;&gt; @my_decorator
... def example():
... &quot;&quot;&quot;Docstring&quot;&quot;&quot;
... print &#039;Called example function&#039;
&gt;&gt;&gt; example()
Calling decorated function
Called example function
&gt;&gt;&gt; example.__name__
&#039;example&#039;
&gt;&gt;&gt; example.__doc__
&#039;Docstring&#039;؛ اگه از wraps استفاده نکنیم example.__name__ تبدیل میشه به wrapper که این خوب نیست و اسم متد اصلی حذف میشه و بعد در کامنت گذاری متدها مشکل بوجود میاره.حالا دیگه ما decorator مون آماده بکار هست.@app.route(&#039;/login&#039;, methods=[ &#039;POST&#039;])
@validate(login_schema)
def login_user():
    return jsonify({&#039;status&#039;: &#039;ok&#039;}) ⋊&gt; ~ curl -d &#039;{&quot;user_name&quot;:&quot;carvanro&quot;, &quot;password&quot;:&quot;pass&quot;}&#039; \ 
    -H &quot;Content-Type: application/json&quot; -X POST http://127.0.0.1:5000/login
⋊&gt; ~ {&#039;status&#039;: &#039;ok&#039;}در صورت دریافت JSON نامعتبر⋊&gt; ~ curl -d &#039;{&quot;user_name&quot;: 123, &quot;password&quot;:&quot;pass&quot;}&#039; \ 
    -H &quot;Content-Type: application/json&quot; -X POST http://127.0.0.1:5000/login
⋊&gt; ~ {&#039;user_name&#039;: &#039;must be of string type&#039;}حالا کافیه این روش رو برای هرجایی که مایل باشید بکار ببرید اونم فقط با یک decorator و schema</description>
                <category>carvanro</category>
                <author>carvanro</author>
                <pubDate>Sat, 10 Mar 2018 10:23:37 +0330</pubDate>
            </item>
            </channel>
</rss>