وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

ادغام MongoDB با Flask با استفاده از Flask-PyMongo

0 3
زمان لازم برای مطالعه: 8 دقیقه


معرفی

ساختن یک برنامه وب تقریباً همیشه به معنای پرداختن به داده های یک پایگاه داده است. بسته به پایگاه داده های مختلفی برای انتخاب وجود دارد روی ترجیح شما

در این مقاله، ما باید به روش ادغام یکی از محبوب ترین ها نگاهی بیندازیم NoSQL پایگاه های داده – MongoDB – با فلاسک ریز چارچوب

چند وجود دارد فلاسک برنامه های افزودنی برای ادغام MongoDB، در اینجا ما از آن استفاده خواهیم کرد Flask-PyMongo افزونه.

ما نیز کار خواهیم کرد روی یک API ساده Todo-List برای کشف قابلیت‌های CRUD MongoDB.

راه اندازی و پیکربندی

برای دنبال کردن این آموزش، باید به یک نمونه MongoDB دسترسی داشته باشید، می توانید یکی را از MongoDB Atlas یا می توانید از یک نمونه محلی استفاده کنید. ما از یک نمونه محلی استفاده خواهیم کرد روی ماشین شخصی خودمان

برای نصب یک نمونه محلی MongoDB، به آنها مراجعه کنید وب سایت اسناد رسمی برای دستورالعمل روی روش دانلود و نصب آن

شما همچنین باید داشته باشید فلاسک نصب شده است و اگر این کار را نکردید می توانید با دستور زیر این کار را انجام دهید:

$ pip install flask

بعد باید راه اندازی کنیم Flask-PyMongo، که یک بسته بندی در اطراف PyMongo است python بسته بندی

PyMongo یک بسته بندی سطح پایین در اطراف MongoDB است، از دستورات مشابه دستورات MongoDB CLI برای موارد زیر استفاده می کند:

  1. ایجاد داده
  2. دسترسی به داده ها
  3. اصلاح داده ها

از هیچ طرحی از پیش تعریف شده استفاده نمی کند، بنابراین می تواند از ماهیت بدون طرح MongoDB به طور کامل استفاده کند.

برای شروع استفاده از Flask-PyMongo، باید آن را با دستور زیر نصب کنیم.

$ pip install Flask-PyMongo

اکنون که همه چیز آماده است، اجازه دهید ادغام MongoDB را در برنامه Flask خود شروع کنیم.

اتصال به یک نمونه پایگاه داده MongoDB با Flask

قبل از انجام هر کاری، می خواهیم نمونه MongoDB خود را به برنامه Flask متصل کنیم. ما با وارد کردن Flask و Flask-PyMongo به برنامه خود شروع می کنیم:

from flask_pymongo import PyMongo
import flask

در مرحله بعد یک شی برنامه Flask ایجاد می کنیم:

app = flask.Flask(__name__)

که سپس از آن برای مقداردهی اولیه مشتری MongoDB خود استفاده خواهیم کرد. سازنده PyMongo (وارد شده از flask_pymongo) شی برنامه Flask ما و یک رشته URI پایگاه داده را می پذیرد.

این برنامه ما را به نمونه MongoDB متصل می کند:

mongodb_client = PyMongo(app, uri="mongodb://localhost:27017/todo_db")
db = mongodb_client.db

رشته URI را نیز می توان به کلید اختصاص داد MONGO_URI که در app.config

app.config("MONGO_URI") = "mongodb://localhost:27017/todo_db"
mongodb_client = PyMongo(app)
db = mongodb_client.db

هنگامی که برنامه به نمونه متصل شد، می‌توانیم عملکرد CRUD برنامه را اجرا کنیم.

ایجاد اسناد – افزودن موارد جدید به پایگاه داده

MongoDB با مجموعه هایی کار می کند که مشابه جدول SQL معمولی هستند. از آنجایی که ما در حال ساخت یک برنامه لیست TODO هستیم، یک برنامه خواهیم داشت todos مجموعه. برای ارجاع به آن، از db هدف – شی. هر موجودیت یک است سند، و مجموعه در واقع مجموعه ای از اسناد است.

برای درج یک ورودی جدید در ما todos مجموعه، ما از db.colection.insert_one() روش. MongoDB با توجه به نحو آن برای درج، پرس و جو و حذف به طور طبیعی با پایتون کار می کند.

هنگام درج یک سند در مجموعه MongoDB، یک فرهنگ لغت را با آن مشخص می کنید <field>شن <value>س برای درج یک سند در مجموعه MongoDB با استفاده از پایتون به عنوان واسطه، دیکشنری هایی را که در پایتون تعبیه شده اند، ارسال می کنید.

بنابراین، برای درج یک موجودیت جدید، کاری در این مسیر انجام خواهیم داد:

@app.route("/add_one")
def add_one():
    db.todos.insert_one({'title': "todo title", 'body': "todo body"})
    return flask.jsonify(message="success")

همچنین می‌توانیم چندین ورودی را با استفاده از db.colection.insert_many() روش. این insert_many() متد لیستی از دیکشنری ها را می گیرد و آنها را به مجموعه اضافه می کند:

@app.route("/add_many")
def add_many():
    db.todos.insert_many((
        {'_id': 1, 'title': "todo title one ", 'body': "todo body one "},
        {'_id': 2, 'title': "todo title two", 'body': "todo body two"},
        {'_id': 3, 'title': "todo title three", 'body': "todo body three"},
        {'_id': 4, 'title': "todo title four", 'body': "todo body four"},
        {'_id': 5, 'title': "todo title five", 'body': "todo body five"},
        {'_id': 1, 'title': "todo title six", 'body': "todo body six"},
        ))
    return flask.jsonify(message="success")

اگر بخواهیم یک رکورد تکراری اضافه کنیم، الف BulkWriteError پرتاب خواهد شد، به این معنی که فقط رکوردها تا نسخه تکراری درج خواهند شد، و همه موارد پس از تکرار از بین خواهند رفت، بنابراین هنگام تلاش برای درج بسیاری از اسناد، این را در نظر داشته باشید.

اگر بخواهیم فقط رکوردهای معتبر و منحصر به فرد را در لیست خود وارد کنیم، باید آن را تنظیم کنیم ordered پارامتر از insert_many() روش به false و سپس گرفتن BulkWriteError استثنا:

from pymongo.errors import BulkWriteError

@app.route("/add_many")
def add_many():
    try:
        todo_many = db.todos.insert_many((
            {'_id': 1, 'title': "todo title one ", 'body': "todo body one "},
            {'_id': 8, 'title': "todo title two", 'body': "todo body two"},
            {'_id': 2, 'title': "todo title three", 'body': "todo body three"},
            {'_id': 9, 'title': "todo title four", 'body': "todo body four"},
            {'_id': 10, 'title': "todo title five", 'body': "todo body five"},
            {'_id': 5, 'title': "todo title six", 'body': "todo body six"},
        ), ordered=False)
    except BulkWriteError as e:
        return flask.jsonify(message="duplicates encountered and ignored",
                             details=e.details,
                             inserted=e.details('nInserted'),
                             duplicates=(x('op') for x in e.details('writeErrors')))

    return flask.jsonify(message="success", insertedIds=todo_many.inserted_ids)

این رویکرد تمام اسناد معتبر را در مجموعه MongoDB وارد می کند. علاوه بر این، جزئیات اضافه‌های ناموفق را ثبت می‌کند و print آن را به عنوان یک پیام JSON به کاربر باز می گرداند.

ما این کار را از طریق Flask’s انجام داده ایم jsonify() متد، که پیامی را که می‌خواهیم برگردانیم، و همچنین پارامترهای اضافی را می‌پذیرد که به ما امکان می‌دهد آن را برای اهداف ثبت سفارشی کنیم.

در نهایت، درج های موفق را به همان روش برمی گردانیم.

خواندن اسناد – بازیابی داده ها از پایگاه داده

Flask-PyMongo چندین روش (برگرفته از PyMongo) و برخی روش های کمکی برای بازیابی داده ها از پایگاه داده ارائه می دهد.

برای بازیابی تمام اسناد از todos مجموعه، ما از آن استفاده خواهیم کرد db.collection.find() روش.

این روش لیستی از تمام موارد را برمی گرداند todos در پایگاه داده ما شبیه به find()، find_one() روش برمی گرداند یکی سند، با توجه به شناسه آن

بیایید شروع کنیم find():

@app.route("/")
def home():
    todos = db.todos.find()
    return flask.jsonify((todo for todo in todos))

این find() روش همچنین می تواند یک پارامتر فیلتر اختیاری داشته باشد. این پارامتر فیلتر با یک فرهنگ لغت نشان داده می شود که ویژگی های مورد نظر ما را مشخص می کند. اگر قبلاً با MongoDB کار کرده اید، احتمالاً با روش ظاهری کوئری ها و مقایسه کننده های آنها آشنا خواهید بود.

اگر نه، در اینجا روش استفاده از فرهنگ لغت پایتون برای تطبیق فرمت پرس و جو MongoDB آمده است:


{"id":3}


{"id":3, "title":"Special todo"}



{"id" : {$gte : 5}}

برخی دیگر از اپراتورهای خاص عبارتند از $eq، $ne، $gt، $lt، $lte و $nin اپراتورها

اگر با اینها آشنا نیستید، یک مکان عالی برای کسب اطلاعات بیشتر در مورد آنها است اسناد رسمی.

اکنون که مشخص کردن کوئری های MongoDB برای فیلتر کردن را پوشش داده ایم find() روش، بیایید نگاهی به روش بازیابی یک سند با توجه به آن بیاندازیم _id:

@app.route("/get_todo/<int:todoId>")
def insert_one(todoId):
    todo = db.todos.find_one({"_id": todoId})
    return todo

پس اگر بخواهیم الف بفرستیم GET درخواست به http://localhost:5000/get_todo/5، نتیجه زیر را می گیریم:

{
    "_id": 5,
    "body": "todo body six",
    "title": "todo title six"
}

توجه داشته باشید که 5000 پیش فرض است فلاسک پورت سرور، اما به راحتی می توان آن را هنگام ایجاد یک تغییر داد فلاسک شی برنامه

اغلب اوقات ما می خواهیم یک مورد را دریافت کنیم یا a را برگردانیم 404 خطا در صورتی که مورد پیدا نشد.

Flask-PyMongo یک تابع کمکی برای این کار فراهم می کند find_one_or_404() روشی که الف را بالا می برد 404 در صورتی که منبع درخواستی پیدا نشد خطا می کند.

به روز رسانی و جایگزینی اسناد

برای به روز رسانی ورودی های پایگاه داده خود، ممکن است از update_one() یا replace_one() روشی برای تغییر مقدار موجودی موجود

replace_one() دارای استدلال های زیر است:

  1. filter – یک پرس و جو که مشخص می کند کدام ورودی ها جایگزین می شوند.
  2. replacement – ورودی هایی که در صورت تعویض در جای خود قرار می گیرند.
  3. {} – یک شی پیکربندی که دارای چند گزینه است که ما روی آنها تمرکز خواهیم کرد روی – upsert.

upsert، وقتی روی تنظیم شد true درج خواهد کرد replacement به عنوان یک سند جدید اگر هیچ منطبق فیلتر در پایگاه داده وجود نداشته باشد. و اگر مسابقات وجود دارد، سپس آن را قرار می دهد replacement به جای آن اگر upsert نادرست است و شما سعی می کنید سندی را که وجود ندارد به روز کنید، هیچ اتفاقی نمی افتد.

بیایید نگاهی به روش به روز رسانی اسناد بیندازیم:

@app.route("/replace_todo/<int:todoId>")
def replace_one(todoId):
    result = db.todos.replace_one({'_id': todoId}, {'title': "modified title"})
    return {'id': result.raw_result}

@app.route("/update_todo/<int:todoId>")
def update_one(todoId):
    result = db.todos.update_one({'_id': todoId}, {"$set": {'title': "updated title"}})
    return result.raw_result

بنابراین اگر قرار بود درخواستی بفرستیم به http://localhost:5000/update_todo/5، نتیجه زیر را می گیریم:

{
    "id": {
        "n": 1,
        "nModified": 1,
        "ok": 1.0,
        "updatedExisting": true
    }
}

به طور مشابه، اگر ما بیش از حد بود، یک درخواست ارسال کنید http://localhost:5000/replace_todo/5، نتیجه زیر را می گیریم:

{
    "id": {
        "n": 1,
        "nModified": 1,
        "ok": 1.0,
        "updatedExisting": true
    }
}

بلوک کد یک را برمی گرداند UpdatedResult شی، که کار کردن با آن می تواند کمی خسته کننده باشد. به همین دلیل است که Flask-PyMongo روش های راحت تری مانند find_one_and_update() و find_one_and_replace() – که یک ورودی را به روز می کند و آن ورودی را برمی گرداند:

@app.route("/replace_todo/<int:todoId>")
def replace_one(todoId):
    todo = db.todos.find_one_and_replace({'_id': todoId}, {'title': "modified title"})
    return todo

@app.route("/update_todo/<int:todoId>")
def update_one(todoId):
    result = db.todos.find_one_and_update({'_id': todoId}, {"$set": {'title': "updated title"}})
    return result

خب حالا اگر بخواهیم درخواستی بفرستیم http://localhost:5000/update_todo/5، نتیجه زیر را می گیریم:

{
    "_id": 5,
    "title": "updated title"
}

به طور مشابه، اگر ما بیش از حد بود، یک درخواست ارسال کنید http://localhost:5000/replace_todo/5، نتیجه زیر را می گیریم:

{
    "_id": 5,
    "title": "modified title"
}

Flask-PyMongo همچنین به‌روزرسانی‌های انبوه را با update_many() روش:

@app.route('/update_many')
def update_many():
    todo = db.todos.update_many({'title' : 'todo title two'}, {"$set": {'body' : 'updated body'}})
    return todo.raw_result

بلوک کد بالا همه ورودی های با عنوان “todo title two” را پیدا کرده و به روز می کند و به این نتیجه می رسد:

ارسال یک درخواست به نقاط پایانی جدید ما نتیجه زیر را نشان می دهد:

{
    "n": 1,
    "nModified": 1,
    "ok": 1.0,
    "updatedExisting": true
}

حذف اسناد

مانند سایرین، Flask-PyMongo روش هایی را برای حذف یک یا مجموعه ای از ورودی ها با استفاده از delete_one() و delete_many() روش ها به ترتیب

آرگومان های این روش مانند سایر روش ها است. بیایید به یک مثال نگاه کنیم:

@app.route("/delete_todo/<int:todoId>", methods=('DELETE'))
def delete_todo(todoId):
    todo = db.todos.delete_one({'_id': todoId})
    return todo.raw_result

با این کار ورودی با شناسه ارائه شده جستجو و حذف می شود. اگر ما ارسال کردیم DELETE اینطوری درخواست کن http://localhost:5000/delete_todo/5 در این نقطه، نتیجه زیر را خواهیم داشت:

{
    "n": 1,
    "ok": 1.0
}

می توانید به طور متناوب از find_one_and_delete() روشی که آیتم حذف شده را حذف و برمی گرداند، تا از استفاده از شی نتیجه غیر مفید جلوگیری شود:

@app.route("/delete_todo/<int:todoId>", methods=('DELETE'))
def delete_todo(todoId):
    todo = db.todos.find_one_and_delete({'_id': todoId})
    if todo is not None:
        return todo.raw_result
    return "ID does not exist"

در حال ارسال http://localhost:5000/delete_todo/8 به سرور ما اکنون نتیجه می دهد:

{
    "_id": 8,
    "body": "todo body two",
    "title": "todo title two"
}

در نهایت، می توانید با استفاده از delete_many() روش:

@app.route('/delete_many', methods=('DELETE'))
def delete_many():
    todo = db.todos.delete_many({'title': 'todo title two'})
    return todo.raw_result

در حال ارسال http://localhost:5000/delete_many به سرور ما چیزی شبیه به این خواهد شد:

{
    "n": 1,
    "ok": 1.0
}

ذخیره و بازیابی فایل ها

MongoDB به ما اجازه می دهد تا داده های باینری را با استفاده از آن در پایگاه داده خود ذخیره کنیم GridFS مشخصات.

Flask-PyMongo فراهم می کند save_file() روش ذخیره فایل در GridFS و send_file() روشی برای بازیابی فایل ها از GridFS.

اجازه دهید با یک مسیر برای آپلود یک فایل شروع کنیم GridFS:

@app.route("/save_file", methods=('POST', 'GET'))
def save_file():
    upload_form = """<h1>Save file</h1>
                     <form method="POST" enctype="multipart/form-data">
                     <input type="file" name="file" id="file">
                     <br><br>
                     <input type="submit">
                     </form>"""
                     
    if request.method=='POST':
        if 'file' in request.files:
            file = request.files('file')
            mongodb_client.save_file(file.filename, file)
            return {"file name": file.filename}
    return upload_form

در بلوک کد بالا، یک فرم برای رسیدگی به آپلودها و برگرداندن نام فایل سند آپلود شده ایجاد کردیم.

بعد بیایید ببینیم چگونه فایلی را که به تازگی آپلود کرده ایم بازیابی کنیم:

@app.route("/get_file/<filename>")
def get_file(filename):
    return mongodb_client.send_file(filename)

این بلوک کد فایل را با نام فایل داده شده برمی گرداند یا اگر فایل پیدا نشد، خطای 404 ایجاد می کند.

نتیجه

این Flask-PyMongo افزونه یک API سطح پایین (بسیار شبیه به زبان رسمی MongoDB) برای برقراری ارتباط با نمونه MongoDB ما ارائه می دهد.

افزونه همچنین چندین روش کمکی را ارائه می‌کند تا بتوانیم از نوشتن بیش از حد کد دیگ بخار جلوگیری کنیم.

در این مقاله روش ادغام را دیدیم MongoDB با ما فلاسک برنامه، ما نیز برخی را انجام داده ایم چیز چندش و کثیف عملیات، و روش کار با فایل ها را مشاهده کرد MongoDB استفاده کردن GridFS.

من سعی کردم تا جایی که می توانم پوشش بدهم، اما اگر سؤالی دارید و/یا مشارکتی دارید، لطفاً در زیر نظر دهید.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-12 21:45:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

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