پرش به محتویات

مهاجرت از فلسک

از آنجایی که APIFlask بر اساس فلسک است، شما فقط نیاز به تغییر بسیار کمی دارید(معمولا کمتر از ده خط کد)

کلاس Flask -> کلاس APIFlask

نحوه ایجاد یک برنامه در فلسک اینگونه است:

from flask import Flask

app = Flask(__name__)

نحوه تغییر آن به APIFlask:

from apiflask import APIFlask

app = APIFlask(__name__)

کلاس Blueprint -> کلاس APIBlueprint

نحوه ساخت یک برنامه در فلسک اینگونه است:

from flask import Blueprint

bp = Blueprint('foo', __name__)

نحوه تغییر آن به APIFlask:

from apiflask import APIBlueprint

bp = APIBlueprint('foo', __name__)

Tip

شما میتوانید از یک آبجکت Blueprint در APIFlask استفاده کنید، اما نمیتوانید از APIBlueprint در فلسک استفاده کنید.

استفاده از میانبرهای مسیر (اختیاری)

APIFlask برخی از میانبرهای مسیر را فراهم می کند، می توانید یک تابع ویو را به روز کنید:

@app.route('/pets', methods=['POST'])
def create_pet():

    return {'message': 'created'}

به:

@app.post('/pets')
def create_pet():
    return {'message': 'created'}

Tip

شما میتوانید میانبر های مسیر را با app.route() ترکیب کنید. فلسک ۲.۰ شامل این میانبر ها است.

ویو های بر اساس کلاس (متودویو)

Version >= 0.5.0

این ویژگی در نسخه 0.5.0. آمده است.

APIFlask از ویو کلاس های MethodView بیس پشتیبانی میکند. برای مثال:

from apiflask import APIFlask, Schema, input, output
from flask.views import MethodView

# ...

class Pet(MethodView):

    decorators = [doc(responses=[404])]

    @app.output(PetOut)
    def get(self, pet_id):
        pass

    @app.output({}, status_code=204)
    def delete(self, pet_id):
        pass

    @app.input(PetIn)
    @app.output(PetOut)
    def put(self, pet_id, data):
        pass

    @app.input(PetIn(partial=True))
    @app.output(PetOut)
    def patch(self, pet_id, data):
        pass

app.add_url_rule('/pets/<int:pet_id>', view_func=Pet.as_view('pet'))

کلاس های ویو مبتدی بر View پشتیبانی نمیشود ولی همچنان میتوانید از آن استفاده کنید اما در حال حاضر APIFlask نمیتواند مشخصات OpenAPI (و مستندات API) را برای آن ایجاد کند.

تغییرات رفتاری دیگر و یادداشت ها

توضیح ایمپورت کردن

شما فقط APIBlueprint و APIFlask و سایر ابزار های کمکی را از پکیج که توسط apiflask ارائه میشود را از ان ایمپورت کنید. برای سایر آنها، باید از پکیج flask استفاده کنید.

from apiflask import APIFlask, APIBlueprint
from flask import request, escape, render_template, g, session, url_for

مقایسه abort() در APIFlask و Flask

APIFlask's abort() function will return a JSON error response while Flask's abort() returns an HTML error page: تابع abort() در APIFlask یک پاسخ خطای JSONی بر بر میگرداند در صورتی که abort() در فلسک یک صفحه HTMLی برای ارور بر میگرداند.

from apiflask import APIFlask, abort

app = APIFlask(__name__)

@app.get('/foo')
def foo():
    abort(404)

در مثال فوق، زمانی که کاربر /foo را بازدید میکند، بدنه پاسخ به این صورت خواهد بود:

{
    "detail": {},
    "message": "Not Found",
    "status_code": 404
}

شما میتوانید از پارامتر های message و detail برای پاس کردن پیغام و دلیل ارور به تابع abort() استفاده کنید.

Warning

‍ تابع abort_json() از نسخه 0.4.0 به بعد با نام abort() شناخته شده است.

خطا های JSON و ترکیب استفاده flask.abort() و apiflask.abort()

زمانی که بیس کلاس را به APIFlask تغییر میدهید، تمام پاسخ های ارور به صورت پیشفرض تبدیل به فرمت JSON میشوند حتی اگر از تابع abort() فلسک استفاده کنید:

from apiflask import APIFlask
from flask import abort

app = APIFlask(__name__)

@app.get('/foo')
def foo():
    abort(404)

اگر میخواهید این رفتار را غیر فعال کنید، فقط کافی است که پارامتر json_errors را Flase ست کنید.

from apiflask import APIFlask

app = APIFlask(__name__, json_errors=False)

اکنون همچنان میتوانید از abort از apiflask برای بر گرداندن پاسخ های ارور به صورت JSON استفاده کنید. برای ترکیب استفاده از flask.abort و apiflask.abort، باید یکی را به نام دیگری ایمپورت کنید:

from apiflask import abort as abort_json

مثال کامل در اینجا آمده است:

from apiflask import APIFlask, abort as abort_json
from flask import abort

app = APIFlask(__name__, json_errors=False)

@app.get('/html-error')
def foo():

    abort(404)

@app.get('/json-error')
def bar():

    abort_json(404)

مقادیر بازگشتی تابع view

برای یک تابع ویو ساده بدون دکوراتور @app.output، می‌توانید یک دیکشنری یا لیست را به عنوان پاسخ JSON برگردانید. دیکشنری و لیست برگشتی به صورت خودکار به پاسخ JSON تبدیل می شود(با صدا زدن jsonify() به صورت داخلی).

Tip

اگر چه لیست به نظر می رسد مثل تاپل فقط مقادیر بازگشتی لیست به پاسخ JSON سریال می شوند. تاپل معنای خاص دارد. با شروع از فلسک 2.2، مقادیر بازگشتی لیست به صورت بومی پشتیبانی می شوند.

@app.get('/foo')
def foo():
    return {'message': 'foo'}

@app.get('/bar')
def bar():
    return ['foo', 'bar', 'baz']

هنگامی که یک دیکوریتور @app.output را برای تابع ویو خود اضافه کردید، APIFlask از شما انتظار دارد که یک آبجکت مدل ORM/ODM یا یک dict/list که با طرحی که در دیکوریتور @app.output ارسال کرده اید مطابقت دارد، برگردانید. اگر یک آبجکت Response را برگردانید، APIFlask آن را مستقیماً بدون هیچ فرآیندی برمی گرداند.

اقدامات بعدی

اکنون برنامه شما به APIFlask منتقل شده است. برای اطلاعات بیشتر فصل استفاده پایه را بررسی کنید. لذت ببرید!