از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ادغام MongoDB با Flask با استفاده از Flask-PyMongo
سرفصلهای مطلب
معرفی
ساختن یک برنامه وب تقریباً همیشه به معنای پرداختن به داده های یک پایگاه داده است. بسته به پایگاه داده های مختلفی برای انتخاب وجود دارد روی ترجیح شما
در این مقاله، ما باید به روش ادغام یکی از محبوب ترین ها نگاهی بیندازیم 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 برای موارد زیر استفاده می کند:
- ایجاد داده
- دسترسی به داده ها
- اصلاح داده ها
از هیچ طرحی از پیش تعریف شده استفاده نمی کند، بنابراین می تواند از ماهیت بدون طرح 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()
دارای استدلال های زیر است:
filter
– یک پرس و جو که مشخص می کند کدام ورودی ها جایگزین می شوند.replacement
– ورودی هایی که در صورت تعویض در جای خود قرار می گیرند.{}
– یک شی پیکربندی که دارای چند گزینه است که ما روی آنها تمرکز خواهیم کرد روی –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