💎 ساخت کامندهای کاستوم توی جنگو 💎
امروز میخوام یه موضوع خفن از جنگو رو بهتون توضیح بدم، اینکه چجوری میتونیم کامندهای کاستوم توی جنگو بسازیم. 😎
احتمالاً تا حالا با کامندهای پیشفرض جنگو مثل migrate, makemigrations, یا runserver کار کردید، ولی خب بعضی وقتا پیش میاد که نیاز داریم یه سری کارهای خاص رو توی پروژه انجام بدیم که با این کامندها نمیشه. اینجاست که کامندهای کاستوم وارد میشن! 🤓
مراحل ساخت کامند کاستوم توی جنگو
1⃣ ساخت پوشه management/commands
اول باید توی یکی از اپلیکیشنهاتون یه پوشه به اسم management بسازی و داخلش یه پوشه دیگه به اسم commands بذاری. این پوشه جاییه که همه کامندهای کاستومت توش قرار میگیره. یادت باشه که توی هر دو پوشه باید فایل init.py رو هم بسازی که پایتون این پوشهها رو بشناسه.
مسیرش میشه چیزی شبیه این:
2⃣ ساخت فایل کامند
حالا نوبت اینه که کامند خودتو بسازی فرض کنیم میخوای یه کامند بسازی که اطلاعات کاربرا رو پرینت کنه. یه فایل به اسم print_users.py داخل پوشه commands بساز و این کد رو داخلش بذار:
اینجا:
- از کلاس BaseCommand استفاده کردیم تا یه کامند جدید بسازیم.
- متد handle جاییه که منطق اصلی کامند رو مینویسیم. هرچی تو این متد بنویسی موقع اجرای کامند اجرا میشه.
- با self.stdout.write میتونیم پیامها رو توی کنسول پرینت کنیم.
3⃣ اجرای کامند
بعد از اینکه فایل رو ساختی، برای اجرای کامندت، میتونی این دستور رو توی ترمینال وارد کنی:
اگه همه چیز درست باشه، لیست کاربرا رو توی کنسول میبینی. 🎉
امکانات بیشتر
میتونی کامندت رو حرفهایتر هم بکنی:
- با اضافه کردن آرگومان (مثل python manage.py print_users --active برای کاربرای فعال)
- یا استفاده از ورودیهای کاربر (مثل پرسیدن سوال توی ترمینال و دریافت جواب)
مثال اضافه کردن آرگومان:
حالا اگه --active رو اضافه کنی، فقط کاربرای فعال رو نشون میده.
جمعبندی🎯
ساختن کامندهای کاستوم توی جنگو یه راه عالیه برای انجام کارهای خاصی که شاید توی پروژت نیاز داشته باشی. به راحتی میتونی با چندتا پوشه و یه کلاس ساده کامند دلخواهتو بسازی و کارای پیچیده رو توی پروژه راحتتر مدیریت کنی😎
امید وارم مفید بوده باشه :)
@ninja_learn_ir
امروز میخوام یه موضوع خفن از جنگو رو بهتون توضیح بدم، اینکه چجوری میتونیم کامندهای کاستوم توی جنگو بسازیم. 😎
احتمالاً تا حالا با کامندهای پیشفرض جنگو مثل migrate, makemigrations, یا runserver کار کردید، ولی خب بعضی وقتا پیش میاد که نیاز داریم یه سری کارهای خاص رو توی پروژه انجام بدیم که با این کامندها نمیشه. اینجاست که کامندهای کاستوم وارد میشن! 🤓
مراحل ساخت کامند کاستوم توی جنگو
1⃣ ساخت پوشه management/commands
اول باید توی یکی از اپلیکیشنهاتون یه پوشه به اسم management بسازی و داخلش یه پوشه دیگه به اسم commands بذاری. این پوشه جاییه که همه کامندهای کاستومت توش قرار میگیره. یادت باشه که توی هر دو پوشه باید فایل init.py رو هم بسازی که پایتون این پوشهها رو بشناسه.
مسیرش میشه چیزی شبیه این:
|— your_app/
|— management/
|— __init__.py
|—commands/
|— __init__.py
2⃣ ساخت فایل کامند
حالا نوبت اینه که کامند خودتو بسازی فرض کنیم میخوای یه کامند بسازی که اطلاعات کاربرا رو پرینت کنه. یه فایل به اسم print_users.py داخل پوشه commands بساز و این کد رو داخلش بذار:
from django.core.management.base import BaseCommand
from your_app.models import User
class Command(BaseCommand):
help = 'چاپ کردن لیست کاربرا'
def handle(self, *args, **kwargs):
users = User.objects.all()
for user in users:
self.stdout.write(self.style.SUCCESS(f'User: {user.username}'))
اینجا:
- از کلاس BaseCommand استفاده کردیم تا یه کامند جدید بسازیم.
- متد handle جاییه که منطق اصلی کامند رو مینویسیم. هرچی تو این متد بنویسی موقع اجرای کامند اجرا میشه.
- با self.stdout.write میتونیم پیامها رو توی کنسول پرینت کنیم.
3⃣ اجرای کامند
بعد از اینکه فایل رو ساختی، برای اجرای کامندت، میتونی این دستور رو توی ترمینال وارد کنی:
python manage.py print_users
اگه همه چیز درست باشه، لیست کاربرا رو توی کنسول میبینی. 🎉
امکانات بیشتر
میتونی کامندت رو حرفهایتر هم بکنی:
- با اضافه کردن آرگومان (مثل python manage.py print_users --active برای کاربرای فعال)
- یا استفاده از ورودیهای کاربر (مثل پرسیدن سوال توی ترمینال و دریافت جواب)
مثال اضافه کردن آرگومان:
def add_arguments(self, parser):
parser.add_argument('--active', action='store_true', help='فقط کاربرای فعال')
حالا اگه --active رو اضافه کنی، فقط کاربرای فعال رو نشون میده.
جمعبندی🎯
ساختن کامندهای کاستوم توی جنگو یه راه عالیه برای انجام کارهای خاصی که شاید توی پروژت نیاز داشته باشی. به راحتی میتونی با چندتا پوشه و یه کلاس ساده کامند دلخواهتو بسازی و کارای پیچیده رو توی پروژه راحتتر مدیریت کنی😎
#backend #django
👍9❤3🔥2🥰1
💎 خب Uvicorn چیه و چرا مهمه؟ 💎
سلام دوستان! امروز میخوام در مورد Uvicorn صحبت کنم که شاید به گوشتون خورده باشه، مخصوصاً اگه با FastAPI یا Starlette کار کرده باشید. 😎
حالا Uvicorn چیه؟
خب Uvicorn یه ASGI سرور خیلی سریع و سبک هست که برای اجرای اپلیکیشنهای پایتونی که از پروتکل ASGI استفاده میکنن، طراحی شده. برعکس WSGI که واسه فریمورکهای سنتی مثل Django و Flask استفاده میشه، ASGI این قابلیت رو داره که اپلیکیشنهای آسنکرون (async) رو هندل کنه. 🚀
به زبون سادهتر، اگه بخوای یه اپلیکیشن پایتونی سریع و مقیاسپذیر بسازی که هم درخواستهای همزمان رو بهخوبی هندل کنه و هم نیاز به عملکرد بالا داشته باشه، Uvicorn گزینهی ایدهآلیه. 💥
مزایای Uvicorn
سرعت بالا 🚀:
یکی از اصلیترین دلایل محبوبیت Uvicorn سرعت بالاشه. بهخاطر استفاده از کتابخونههای بهینه مثل uvloop و httptools.
پشتیبانی از async ⚡ :
خب Uvicorn به طور کامل از async و await پشتیبانی میکنه، که این یعنی تو میتونی باهاش اپلیکیشنهای خیلی مقیاسپذیر بسازی که درخواستهای زیادی رو بهطور همزمان هندل کنن.
سادگی در استفاده 🛠️:
استفاده از Uvicorn خیلی سادهست و به راحتی میتونی اونو با FastAPI یا هر فریمورکی که از ASGI پشتیبانی میکنه استفاده کنی.
چجوری Uvicorn رو نصب و اجرا کنیم؟
نصب Uvicorn فوقالعاده سادهست. با یه دستور میتونی نصبش کنی:
بعد از نصب، کافیه اپلیکیشنت رو اجرا کنی. فرض کن یه اپلیکیشن FastAPI داری:
اینجا
حالا Uvicorn کجاها کاربرد داره؟
اگه با فریمورکهایی مثل FastAPI کار میکنی یا حتی میخوای از اپلیکیشنهای سنگین و با تعداد درخواست بالا پشتیبانی کنی، حتماً باید از Uvicorn استفاده کنی. مثلاً برای APIهای real-time، وبسرویسها و اپلیکیشنهای چت Uvicorn میتونه فوقالعاده مفید باشه.
جمعبندی 🎯
در کل، Uvicorn یه سرور سریع، سبک و مقیاسپذیره که اگه با اپلیکیشنهای آسنکرون کار میکنی یا میخوای عملکرد بالایی توی هندل کردن درخواستها داشته باشی، بهترین گزینهست. 😎🔥
امید وارم مفید بوده باشه :)
@ninja_learn_ir
سلام دوستان! امروز میخوام در مورد Uvicorn صحبت کنم که شاید به گوشتون خورده باشه، مخصوصاً اگه با FastAPI یا Starlette کار کرده باشید. 😎
حالا Uvicorn چیه؟
خب Uvicorn یه ASGI سرور خیلی سریع و سبک هست که برای اجرای اپلیکیشنهای پایتونی که از پروتکل ASGI استفاده میکنن، طراحی شده. برعکس WSGI که واسه فریمورکهای سنتی مثل Django و Flask استفاده میشه، ASGI این قابلیت رو داره که اپلیکیشنهای آسنکرون (async) رو هندل کنه. 🚀
به زبون سادهتر، اگه بخوای یه اپلیکیشن پایتونی سریع و مقیاسپذیر بسازی که هم درخواستهای همزمان رو بهخوبی هندل کنه و هم نیاز به عملکرد بالا داشته باشه، Uvicorn گزینهی ایدهآلیه. 💥
مزایای Uvicorn
سرعت بالا 🚀:
یکی از اصلیترین دلایل محبوبیت Uvicorn سرعت بالاشه. بهخاطر استفاده از کتابخونههای بهینه مثل uvloop و httptools.
پشتیبانی از async ⚡ :
خب Uvicorn به طور کامل از async و await پشتیبانی میکنه، که این یعنی تو میتونی باهاش اپلیکیشنهای خیلی مقیاسپذیر بسازی که درخواستهای زیادی رو بهطور همزمان هندل کنن.
سادگی در استفاده 🛠️:
استفاده از Uvicorn خیلی سادهست و به راحتی میتونی اونو با FastAPI یا هر فریمورکی که از ASGI پشتیبانی میکنه استفاده کنی.
چجوری Uvicorn رو نصب و اجرا کنیم؟
نصب Uvicorn فوقالعاده سادهست. با یه دستور میتونی نصبش کنی:
pip install uvicorn
بعد از نصب، کافیه اپلیکیشنت رو اجرا کنی. فرض کن یه اپلیکیشن FastAPI داری:
uvicorn main:app --reload
اینجا
main
اسم فایل و app
اسم اپلیکیشنی هست که توش تعریف شده. با سویچ --reload
هم Uvicorn در حالت توسعه قرار میگیره و هر تغییری که بدی بهصورت خودکار اعمال میشه.حالا Uvicorn کجاها کاربرد داره؟
اگه با فریمورکهایی مثل FastAPI کار میکنی یا حتی میخوای از اپلیکیشنهای سنگین و با تعداد درخواست بالا پشتیبانی کنی، حتماً باید از Uvicorn استفاده کنی. مثلاً برای APIهای real-time، وبسرویسها و اپلیکیشنهای چت Uvicorn میتونه فوقالعاده مفید باشه.
جمعبندی 🎯
در کل، Uvicorn یه سرور سریع، سبک و مقیاسپذیره که اگه با اپلیکیشنهای آسنکرون کار میکنی یا میخوای عملکرد بالایی توی هندل کردن درخواستها داشته باشی، بهترین گزینهست. 😎🔥
#django #uvcorn #web_server #asgi_server
👍6❤2
💎 پکیج Django Cleanup مدیریت خودکار فایلهای اضافی 💎
امروز میخوام در مورد یه کتابخونه خیلی کاربردی به اسم Django Cleanup صحبت کنم که کلی از مشکلات مربوط به مدیریت فایلها رو توی پروژههای جنگو حل میکنه. 😎 اگه تا حالا با فایلهای اضافی و بیاستفاده دستوپنجه نرم کردی، این کتابخونه میتونه حسابی به کارت بیاد.
حالا Django Cleanup چیه؟ 🤔
به طور خلاصه، Django Cleanup به صورت خودکار فایلها و تصویرهای ذخیرهشده توی پروژه رو مدیریت میکنه. فرض کن یه فایل یا عکس توی پروژه آپلود کردی و بعد اون رکورد یا مدل رو حذف کردی. معمولاً فایل مرتبط توی سرور باقی میمونه و فضای سرور رو اشغال میکنه. 😒 Django Cleanup این فایلهای اضافی رو به صورت خودکار حذف میکنه تا دیگه نیاز نباشه خودت دستی این کارو انجام بدی.
چرا Django Cleanup کاربردیه؟ 🤔
1⃣ مدیریت خودکار فایلهای اضافه 🗑️:
2⃣ جلوگیری از انباشت فایلهای اضافی 🚮:
3⃣ ساده و راحت در استفاده 🛠️:
چطوری نصبش کنیم؟ 🛠️
نصب و استفاده از Django Cleanup خیلی سادهست. اول از همه باید نصبش کنی:
بعد از نصب، باید این کتابخونه رو به تنظیمات جنگو اضافه کنی:
همین دیگه نیازی نیست کاری انجام بدی. از این به بعد هر وقت رکوردی که فایل داره حذف بشه، فایلهای مرتبط هم پاک میشن.
مثال از استفاده 📂
فرض کن یه مدل ساده برای کاربر داری که یه عکس آپلود میکنه:
وقتی یه پروفایل کاربر رو حذف میکنی، فایل avatar مربوط به اون کاربر هم به صورت خودکار از پوشه
جمعبندی
فهمیدیم Django Cleanup یه ابزار خیلی ساده ولی قدرتمنده که کمک میکنه پروژههات تمیز و منظم بمونه و از انباشت فایلهای بیاستفاده جلوگیری کنی. اگه توی پروژههات با فایلهای زیادی سروکار داری، حتماً از این کتابخونه استفاده کن تا کارت راحتتر بشه 🔥
امید وارم مفید بوده باشه :)
@ninja_learn_ir
امروز میخوام در مورد یه کتابخونه خیلی کاربردی به اسم Django Cleanup صحبت کنم که کلی از مشکلات مربوط به مدیریت فایلها رو توی پروژههای جنگو حل میکنه. 😎 اگه تا حالا با فایلهای اضافی و بیاستفاده دستوپنجه نرم کردی، این کتابخونه میتونه حسابی به کارت بیاد.
حالا Django Cleanup چیه؟ 🤔
به طور خلاصه، Django Cleanup به صورت خودکار فایلها و تصویرهای ذخیرهشده توی پروژه رو مدیریت میکنه. فرض کن یه فایل یا عکس توی پروژه آپلود کردی و بعد اون رکورد یا مدل رو حذف کردی. معمولاً فایل مرتبط توی سرور باقی میمونه و فضای سرور رو اشغال میکنه. 😒 Django Cleanup این فایلهای اضافی رو به صورت خودکار حذف میکنه تا دیگه نیاز نباشه خودت دستی این کارو انجام بدی.
چرا Django Cleanup کاربردیه؟ 🤔
1⃣ مدیریت خودکار فایلهای اضافه 🗑️:
بعد از حذف رکوردهای مدل، فایلهای مرتبط بهش هم خود به خود حذف میشن.
2⃣ جلوگیری از انباشت فایلهای اضافی 🚮:
نیازی نیست که خودت دنبال فایلهای قدیمی بگردی و پاکشون کنی. این کتابخونه همه چیز رو برات مرتب میکنه.
3⃣ ساده و راحت در استفاده 🛠️:
فقط با نصب و یه سری تنظیمات ساده، همه چی رو هندل میکنه.
چطوری نصبش کنیم؟ 🛠️
نصب و استفاده از Django Cleanup خیلی سادهست. اول از همه باید نصبش کنی:
pip install django-cleanup
بعد از نصب، باید این کتابخونه رو به تنظیمات جنگو اضافه کنی:
INSTALLED_APPS = [
# بقیه اپها...
'django_cleanup.apps.CleanupConfig',
]
همین دیگه نیازی نیست کاری انجام بدی. از این به بعد هر وقت رکوردی که فایل داره حذف بشه، فایلهای مرتبط هم پاک میشن.
مثال از استفاده 📂
فرض کن یه مدل ساده برای کاربر داری که یه عکس آپلود میکنه:
class UserProfile(models.Model):
avatar = models.ImageField(upload_to='avatars/')
وقتی یه پروفایل کاربر رو حذف میکنی، فایل avatar مربوط به اون کاربر هم به صورت خودکار از پوشه
avatars/
پاک میشه و دیگه فضای اضافی نمیگیره.جمعبندی
فهمیدیم Django Cleanup یه ابزار خیلی ساده ولی قدرتمنده که کمک میکنه پروژههات تمیز و منظم بمونه و از انباشت فایلهای بیاستفاده جلوگیری کنی. اگه توی پروژههات با فایلهای زیادی سروکار داری، حتماً از این کتابخونه استفاده کن تا کارت راحتتر بشه 🔥
#django #django_clean_up #trick
👍11❤2🔥1🥰1👌1
🐇 استفاده از RabbitMQ برای Celery توی جنگو 🥦
امروز میخوایم در مورد Celery و RabbitMQ حرف بزنیم و ببینیم چطوری میتونیم از این دو تا ابزار خفن برای مدیریت کارهای پسزمینه توی Django استفاده کنیم 😎.
حالا Celery چیه؟ 🍃
اگه نمیدونید سلری چیه و چیکار میکنه میتونید به این پست سر بزنید 😉
حالا RabbitMQ چیه؟ 🐇
اگه نمیدونید ربیت ام کیو چیه و چیکار میکنه میتونید به این پست سر بزنید 😉
چرا باید از RabbitMQ برای Celery استفاده کنیم؟ 🧐
1⃣ پایداری و سرعت: RabbitMQ خیلی سریع و پایدار کار میکنه و میتونه حجم زیادی از پیامها رو مدیریت کنه.
2⃣ مقیاسپذیری (Scalability):
اگه پروژهات بزرگ شد، RabbitMQ میتونه بدون مشکل تسکهای بیشتری رو هندل کنه.
3⃣ پشتیبانی از Celery: Celery به خوبی با RabbitMQ سازگاره و به راحتی میتونن با هم کار کنن.
چجوری RabbitMQ رو برای Celery توی جنگو تنظیم کنیم؟ 🛠️
خب، بیایید بریم سراغ بخش فنی و ببینیم چطور میتونیم از RabbitMQ و Celery توی جنگو استفاده کنیم.
1⃣ نصب RabbitMQ و Celery
اول از همه باید RabbitMQ رو نصب کنی. اگه از اوبونتو استفاده میکنی، این دستور رو بزن:
حالا Celery رو نصب کن:
2⃣ تنظیمات Celery توی پروژه جنگو
توی پروژه جنگوت، یه فایل جدید به اسم
بعد توی فایل init.py پروژهات این خط رو اضافه کن تا Celery لود بشه:
3⃣ تنظیمات RabbitMQ توی settings.py:
توی settings.py، تنظیمات مربوط به RabbitMQ رو به Celery اضافه کن:
4⃣ ساختن تسکها (Tasks)
حالا که تنظیمات انجام شد، میتونیم تسکهای پسزمینه رو بسازیم. توی هر اپلیکیشنی که تسکها رو میخوای ایجاد کنی، یه فایل tasks.py بساز و تسکهات رو توش تعریف کن:
5⃣ اجرای Celery Worker
برای اینکه Celery تسکها رو هندل کنه، Worker راه بندازی. با این دستور میتونی Worker رو اجرا کنی:
جمعبندی 🎯
فهمیدیم RabbitMQ و Celery یه ترکیب عالی برای اجرای تسکهای پسزمینه توی پروژههای جنگو هستن. با استفاده از RabbitMQ بهعنوان message broker و Celery برای مدیریت تسکها، میتونی کارهای سنگین و زمانبر رو به صورت پسزمینه اجرا کنی و تجربه کاربری اپلیکیشن رو بهتر کنی 😎
امید وارم مفید بوده باشه :)
@ninja_learn_ir
امروز میخوایم در مورد Celery و RabbitMQ حرف بزنیم و ببینیم چطوری میتونیم از این دو تا ابزار خفن برای مدیریت کارهای پسزمینه توی Django استفاده کنیم 😎.
حالا Celery چیه؟ 🍃
اگه نمیدونید سلری چیه و چیکار میکنه میتونید به این پست سر بزنید 😉
حالا RabbitMQ چیه؟ 🐇
اگه نمیدونید ربیت ام کیو چیه و چیکار میکنه میتونید به این پست سر بزنید 😉
چرا باید از RabbitMQ برای Celery استفاده کنیم؟ 🧐
1⃣ پایداری و سرعت: RabbitMQ خیلی سریع و پایدار کار میکنه و میتونه حجم زیادی از پیامها رو مدیریت کنه.
2⃣ مقیاسپذیری (Scalability):
اگه پروژهات بزرگ شد، RabbitMQ میتونه بدون مشکل تسکهای بیشتری رو هندل کنه.
3⃣ پشتیبانی از Celery: Celery به خوبی با RabbitMQ سازگاره و به راحتی میتونن با هم کار کنن.
چجوری RabbitMQ رو برای Celery توی جنگو تنظیم کنیم؟ 🛠️
خب، بیایید بریم سراغ بخش فنی و ببینیم چطور میتونیم از RabbitMQ و Celery توی جنگو استفاده کنیم.
1⃣ نصب RabbitMQ و Celery
اول از همه باید RabbitMQ رو نصب کنی. اگه از اوبونتو استفاده میکنی، این دستور رو بزن:
sudo apt-get install rabbitmq-server
حالا Celery رو نصب کن:
pip install celery
2⃣ تنظیمات Celery توی پروژه جنگو
توی پروژه جنگوت، یه فایل جدید به اسم
celery.py
بساز و تنظیمات Celery رو توش بنویس. این فایل معمولاً توی کنار settings.py قرار میگیره.from __future__ import absolute_import
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
app = Celery('your_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
بعد توی فایل init.py پروژهات این خط رو اضافه کن تا Celery لود بشه:
from .celery import app as celery_app
3⃣ تنظیمات RabbitMQ توی settings.py:
توی settings.py، تنظیمات مربوط به RabbitMQ رو به Celery اضافه کن:
CELERY_BROKER_URL = 'amqp://localhost'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
4⃣ ساختن تسکها (Tasks)
حالا که تنظیمات انجام شد، میتونیم تسکهای پسزمینه رو بسازیم. توی هر اپلیکیشنی که تسکها رو میخوای ایجاد کنی، یه فایل tasks.py بساز و تسکهات رو توش تعریف کن:
from celery import shared_task
@shared_task
def send_email_task(email_address):
# کد ارسال ایمیل
print(f"ایمیل به {email_address} ارسال شد.")
5⃣ اجرای Celery Worker
برای اینکه Celery تسکها رو هندل کنه، Worker راه بندازی. با این دستور میتونی Worker رو اجرا کنی:
celery -A your_project worker --loglevel=info
جمعبندی 🎯
فهمیدیم RabbitMQ و Celery یه ترکیب عالی برای اجرای تسکهای پسزمینه توی پروژههای جنگو هستن. با استفاده از RabbitMQ بهعنوان message broker و Celery برای مدیریت تسکها، میتونی کارهای سنگین و زمانبر رو به صورت پسزمینه اجرا کنی و تجربه کاربری اپلیکیشن رو بهتر کنی 😎
#django #celery #rabbitmq #ambq
👍6❤3🔥3
💎 استفاده از PostgreSQL با Django 💎
امروز میخوایم درباره PostgreSQL و اینکه چرا این دیتابیس رابطهای با Django فوقالعاده مچ میشه، صحبت کنیم. همچنین چندتا از فیچرهای خاصی که جنگو برای این دیتابیس داره رو معرفی میکنیم
چرا PostgreSQL؟ 🤔
خب PostgreSQL یه دیتابیس رابطهای قدرتمنده که خیلیها بهش میگن "Postgres". این دیتابیس اوپن سورس، خیلی خوب با Django هماهنگ میشه و خیلی امکانات و قابلیتهای پیشرفتهای رو ارائه میده که وقتی با جنگو کار میکنی حسابی به درد میخوره. از جمله پشتیبانی از JSONB، قفلهای پیچیده، پارتیشنبندی دادهها و ... 😍
چطوری از PostgreSQL توی Django استفاده کنیم؟ 🛠️
1⃣ اول از همه، باید مطمئن شی که PostgreSQL رو نصب داری.
2⃣ بعدش توی پروژه جنگویی، توی فایل settings.py باید دیتابیس رو به Postgres وصل کنی. یه همچین چیزی:
فیچرهای خاص Django برای PostgreSQL 📦
1⃣ مدلهای JSONField 📄
با استفاده از Postgres توی Django، میتونی از فیلد JSONField استفاده کنی. این فیلد بهت اجازه میده که دادههای JSON رو بهراحتی توی دیتابیس ذخیره کنی و بعداً کوئریهای خفن روشون بزنی! دیگه نیازی نیست همیشه ساختار دادهت فقط رابطهای باشه.
2⃣ فیلد ArrayField 🔢
اگه یه لیست یا آرایه داری و میخوای اون رو مستقیم توی دیتابیس ذخیره کنی، ArrayField بهترین انتخابه. با این فیلد، میتونی یه لیست از مقادیر (مثلاً یه سری عدد یا استرینگ) رو توی یه ستون ذخیره کنی.
خب HStore یه قابلیت خاص توی Postgresه که بهت اجازه میده دادههای کلید-مقدار (key-value) رو توی دیتابیس ذخیره کنی. Django از این فیلد پشتیبانی میکنه و باهاش میتونی دادههایی شبیه به دیکشنری رو ذخیره کنی.
این فیلد بهت اجازه میده که رِنجها رو توی دیتابیس ذخیره کنی. مثلاً میخوای یه بازه تاریخی یا عددی رو نگهداری، این فیلد دقیقاً به درد همون کار میخوره.
خب Postgres قابلیت جستجوی متنی پیشرفته داره و Django هم از این قابلیت پشتیبانی میکنه. با استفاده از این فیچر میتونی بهصورت سریع و بهینه توی متنها جستجو کنی.
استفاده از PostgreSQL توی Django یه انتخاب خیلی خوبه، چون هم دیتابیس قویایه و هم فیچرهای اختصاصی زیادی برای جنگو داره که میتونه کارتو سریعتر و راحتتر کنه. از ذخیره JSON گرفته تا جستجوی متنی، Postgres و Django یه ترکیب طلایین
امیدوارم مفید بوده باشه :)
@ninja_learn_ir
امروز میخوایم درباره PostgreSQL و اینکه چرا این دیتابیس رابطهای با Django فوقالعاده مچ میشه، صحبت کنیم. همچنین چندتا از فیچرهای خاصی که جنگو برای این دیتابیس داره رو معرفی میکنیم
چرا PostgreSQL؟ 🤔
خب PostgreSQL یه دیتابیس رابطهای قدرتمنده که خیلیها بهش میگن "Postgres". این دیتابیس اوپن سورس، خیلی خوب با Django هماهنگ میشه و خیلی امکانات و قابلیتهای پیشرفتهای رو ارائه میده که وقتی با جنگو کار میکنی حسابی به درد میخوره. از جمله پشتیبانی از JSONB، قفلهای پیچیده، پارتیشنبندی دادهها و ... 😍
چطوری از PostgreSQL توی Django استفاده کنیم؟ 🛠️
1⃣ اول از همه، باید مطمئن شی که PostgreSQL رو نصب داری.
2⃣ بعدش توی پروژه جنگویی، توی فایل settings.py باید دیتابیس رو به Postgres وصل کنی. یه همچین چیزی:
DATABASES = {حالا میتونی از قابلیتهای خفن Postgres استفاده کنی و دیتابیس پروژهت رو به یه سطح بالاتر ببری! 🚀
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_db_name',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'localhost',
'PORT': '5432',
}
}
فیچرهای خاص Django برای PostgreSQL 📦
1⃣ مدلهای JSONField 📄
با استفاده از Postgres توی Django، میتونی از فیلد JSONField استفاده کنی. این فیلد بهت اجازه میده که دادههای JSON رو بهراحتی توی دیتابیس ذخیره کنی و بعداً کوئریهای خفن روشون بزنی! دیگه نیازی نیست همیشه ساختار دادهت فقط رابطهای باشه.
from django.db import models
class MyModel(models.Model):
data = models.JSONField()
2⃣ فیلد ArrayField 🔢
اگه یه لیست یا آرایه داری و میخوای اون رو مستقیم توی دیتابیس ذخیره کنی، ArrayField بهترین انتخابه. با این فیلد، میتونی یه لیست از مقادیر (مثلاً یه سری عدد یا استرینگ) رو توی یه ستون ذخیره کنی.
from django.contrib.postgres.fields import ArrayField3⃣ فیلد HStore 🗂️
from django.db import models
class MyModel(models.Model):
tags = ArrayField(models.CharField(max_length=100), blank=True)
خب HStore یه قابلیت خاص توی Postgresه که بهت اجازه میده دادههای کلید-مقدار (key-value) رو توی دیتابیس ذخیره کنی. Django از این فیلد پشتیبانی میکنه و باهاش میتونی دادههایی شبیه به دیکشنری رو ذخیره کنی.
from django.contrib.postgres.fields import HStoreField4⃣ فیلد Range 📏
from django.db import models
class MyModel(models.Model):
attributes = HStoreField()
این فیلد بهت اجازه میده که رِنجها رو توی دیتابیس ذخیره کنی. مثلاً میخوای یه بازه تاریخی یا عددی رو نگهداری، این فیلد دقیقاً به درد همون کار میخوره.
from django.contrib.postgres.fields import DateRangeField5⃣ و در اخر Full-Text Search 🔍
from django.db import models
class MyModel(models.Model):
date_range = DateRangeField()
خب Postgres قابلیت جستجوی متنی پیشرفته داره و Django هم از این قابلیت پشتیبانی میکنه. با استفاده از این فیچر میتونی بهصورت سریع و بهینه توی متنها جستجو کنی.
from django.contrib.postgres.search import SearchVectorجمعبندی 🎯
from .models import MyModel
MyModel.objects.annotate(search=SearchVector('title', 'description')).filter(search='keyword')
استفاده از PostgreSQL توی Django یه انتخاب خیلی خوبه، چون هم دیتابیس قویایه و هم فیچرهای اختصاصی زیادی برای جنگو داره که میتونه کارتو سریعتر و راحتتر کنه. از ذخیره JSON گرفته تا جستجوی متنی، Postgres و Django یه ترکیب طلایین
#django #postgressql #postgres
🔥12❤5
💎 معرفی فریمورک Locust 💎
امروز میخوام یه فریمورک خفن برای تست بار بهتون معرفی کنم: Locust
حالا Locust چیه؟ 🐛
خب Locust یه فریمورک open-source برای تست بار (Load Testing) و بررسی عملکرد (Performance Testing) اپلیکیشنهاست. با Locust میتونی هزاران کاربر شبیهسازی کنی و ببینی وقتی کلی درخواست به سرورت میاد، چطور رفتار میکنه. بر خلاف خیلی از ابزارهای تست بار، Locust از پایتون استفاده میکنه که باعث میشه راحت و منعطف باشه 😍
چرا Locust؟ 💡
1⃣ ساده و قابلفهم: توی Locust کد تست رو با پایتون مینویسی، یعنی اگه با پایتون آشنا باشی، خیلی سریع میتونی تستها رو پیاده کنی.
2⃣ قابلیت گسترش: Locust بهت اجازه میده که به راحتی تعداد کاربران رو افزایش بدی و رفتار واقعی کاربرها رو شبیهسازی کنی.
3⃣ داشبورد وب: یه رابط کاربری وب خفن داره که میتونی تستها رو از اونجا مدیریت کنی و نتایج رو همون لحظه ببینی 📊
4⃣ انعطافپذیر: با هر API یا وب اپلیکیشنی سازگار هست و میتونی برای اپلیکیشنهای REST، SOAP و حتی اپلیکیشنهای استاتیک ازش استفاده کنی.
چطور از LOCUST استفاده کنیم؟ 🚀
برای استفاده، کافیه Locust رو نصب کنی:
بعدش میتونی یه تست ساده بنویسی. مثلاً:
این تست داره هر 1 تا 5 ثانیه یه درخواست به آدرسی که مشخص کردی میفرسته. وقتی تست رو اجرا کنی، میتونی کاربرهای شبیهسازی شده رو تنظیم کنی و نتایج رو از داشبورد ببینی.
اجرای تست 🖥️
وقتی تستت رو نوشتی، با دستور زیر میتونی Locust رو اجرا کنی:
حالا برو به آدرس
جمعبندی 🎯
فهمیدیم Locust یکی از بهترین فریمورکها برای تست بار و عملکرده. باهاش میتونی بفهمی سرورت تحت فشار چطوری کار میکنه و کلی امکانات داره که کارو برات راحت میکنه. حتماً امتحانش کن و ببین چقدر کارتو راحتتر میکنه.
امید وارم براتون مفید بود باشه :)
@ninja_learn_ir
امروز میخوام یه فریمورک خفن برای تست بار بهتون معرفی کنم: Locust
حالا Locust چیه؟ 🐛
خب Locust یه فریمورک open-source برای تست بار (Load Testing) و بررسی عملکرد (Performance Testing) اپلیکیشنهاست. با Locust میتونی هزاران کاربر شبیهسازی کنی و ببینی وقتی کلی درخواست به سرورت میاد، چطور رفتار میکنه. بر خلاف خیلی از ابزارهای تست بار، Locust از پایتون استفاده میکنه که باعث میشه راحت و منعطف باشه 😍
چرا Locust؟ 💡
1⃣ ساده و قابلفهم: توی Locust کد تست رو با پایتون مینویسی، یعنی اگه با پایتون آشنا باشی، خیلی سریع میتونی تستها رو پیاده کنی.
2⃣ قابلیت گسترش: Locust بهت اجازه میده که به راحتی تعداد کاربران رو افزایش بدی و رفتار واقعی کاربرها رو شبیهسازی کنی.
3⃣ داشبورد وب: یه رابط کاربری وب خفن داره که میتونی تستها رو از اونجا مدیریت کنی و نتایج رو همون لحظه ببینی 📊
4⃣ انعطافپذیر: با هر API یا وب اپلیکیشنی سازگار هست و میتونی برای اپلیکیشنهای REST، SOAP و حتی اپلیکیشنهای استاتیک ازش استفاده کنی.
چطور از LOCUST استفاده کنیم؟ 🚀
برای استفاده، کافیه Locust رو نصب کنی:
pip install locust
بعدش میتونی یه تست ساده بنویسی. مثلاً:
from locust import HttpUser, task, between
class MyUser(HttpUser):
wait_time = between(1, 5)
@task
def my_test(self):
self.client.get("/some-url")
این تست داره هر 1 تا 5 ثانیه یه درخواست به آدرسی که مشخص کردی میفرسته. وقتی تست رو اجرا کنی، میتونی کاربرهای شبیهسازی شده رو تنظیم کنی و نتایج رو از داشبورد ببینی.
اجرای تست 🖥️
وقتی تستت رو نوشتی، با دستور زیر میتونی Locust رو اجرا کنی:
locust -f my_test_file.py
حالا برو به آدرس
http://localhost:8089
تا داشبورد Locust رو ببینی و اپتو تست کنی.جمعبندی 🎯
فهمیدیم Locust یکی از بهترین فریمورکها برای تست بار و عملکرده. باهاش میتونی بفهمی سرورت تحت فشار چطوری کار میکنه و کلی امکانات داره که کارو برات راحت میکنه. حتماً امتحانش کن و ببین چقدر کارتو راحتتر میکنه.
#python #django #locust
🔥10👍5❤3
💎 عملیاتهای IO Bound و CPU Bound در جنگو 💎
امروز میخوایم درباره عملیاتهای IO Bound و CPU Bound صحبت کنیم و اینکه این دو نوع عملیات چطور روی عملکرد اپلیکیشنهای جنگو تاثیر میذاره.
حالا IO Bound چیه؟ 🤔
عملیاتهای IO Bound به کارهایی اشاره دارن که بیشتر زمانشون صرف ورود و خروج دادهها میشه. مثلاً وقتی داریم با دیتابیس، فایلها یا شبکه کار میکنیم. این نوع عملیات معمولاً منتظر میمونن تا دادهها از دیسک یا شبکه بیاد.
مثالهایی از IO Bound:
- خوندن و نوشتن در دیتابیس
- ارسال یا دریافت دادهها از API
- بارگذاری فایلها
حالا CPU Bound چیه؟ 🧠
عملیاتهای CPU Bound به کارهایی اشاره دارن که بیشتر زمانشون صرف محاسبات سنگین میشه. یعنی برای پردازش و محاسبات نیاز به قدرت پردازشی بالا دارن. در اینجا عملکرد CPU نقش کلیدی رو ایفا میکنه.
مثالهایی از CPU Bound:
- پردازش تصاویر و ویدئوها
- انجام محاسبات ریاضی پیچیده
- اجرای الگوریتمهای پیچیده
تفاوتهای اصلی بین IO Bound و CPU Bound 🔍
1⃣ مدت زمان انتظار:
-عملیات های IO Bound معمولاً منتظر ورود و خروج دادهها هستن و زمان زیادی رو صرف این کار میکنن.
- عملیات های CPU Bound بیشتر زمانشون رو برای پردازش و محاسبات صرف میکنن.
2⃣ تکنیکهای بهینهسازی:
- برای عملیاتهای IO Bound میتونی از Async و Threading استفاده کنی تا زمان انتظار رو کاهش بدی.
- برای CPU Bound باید به سراغ Multiprocessing بری تا بتونی از چند هسته CPU به طور همزمان استفاده کنی.
چطور در جنگو با اینها کار کنیم؟ 🚀
- برای IO Bound:
میتونی از
- برای CPU Bound:
میتونی از ماژول
جمعبندی 🎯
درک تفاوتهای بین IO Bound و CPU Bound میتونه بهت کمک کنه تا اپلیکیشنهای جنگو رو بهتر بهینهسازی کنی. اگه عملیاتهای IO Bound داری، از async استفاده کن و اگر CPU Bound هستن، برو سراغ multiprocessing.
امید وارم مفید بوده باشه :)
@ninja_learn_ir
امروز میخوایم درباره عملیاتهای IO Bound و CPU Bound صحبت کنیم و اینکه این دو نوع عملیات چطور روی عملکرد اپلیکیشنهای جنگو تاثیر میذاره.
حالا IO Bound چیه؟ 🤔
عملیاتهای IO Bound به کارهایی اشاره دارن که بیشتر زمانشون صرف ورود و خروج دادهها میشه. مثلاً وقتی داریم با دیتابیس، فایلها یا شبکه کار میکنیم. این نوع عملیات معمولاً منتظر میمونن تا دادهها از دیسک یا شبکه بیاد.
مثالهایی از IO Bound:
- خوندن و نوشتن در دیتابیس
- ارسال یا دریافت دادهها از API
- بارگذاری فایلها
حالا CPU Bound چیه؟ 🧠
عملیاتهای CPU Bound به کارهایی اشاره دارن که بیشتر زمانشون صرف محاسبات سنگین میشه. یعنی برای پردازش و محاسبات نیاز به قدرت پردازشی بالا دارن. در اینجا عملکرد CPU نقش کلیدی رو ایفا میکنه.
مثالهایی از CPU Bound:
- پردازش تصاویر و ویدئوها
- انجام محاسبات ریاضی پیچیده
- اجرای الگوریتمهای پیچیده
تفاوتهای اصلی بین IO Bound و CPU Bound 🔍
1⃣ مدت زمان انتظار:
-عملیات های IO Bound معمولاً منتظر ورود و خروج دادهها هستن و زمان زیادی رو صرف این کار میکنن.
- عملیات های CPU Bound بیشتر زمانشون رو برای پردازش و محاسبات صرف میکنن.
2⃣ تکنیکهای بهینهسازی:
- برای عملیاتهای IO Bound میتونی از Async و Threading استفاده کنی تا زمان انتظار رو کاهش بدی.
- برای CPU Bound باید به سراغ Multiprocessing بری تا بتونی از چند هسته CPU به طور همزمان استفاده کنی.
چطور در جنگو با اینها کار کنیم؟ 🚀
- برای IO Bound:
میتونی از
async
و await
استفاده کنی تا درخواستها به صورت غیر همزمان انجام بشن و سرعت اپلیکیشن بالا بره.- برای CPU Bound:
میتونی از ماژول
concurrent.futures
و ProcessPoolExecutor
استفاده کنی تا کارهای سنگین رو در چند پروسه اجرا کنی.جمعبندی 🎯
درک تفاوتهای بین IO Bound و CPU Bound میتونه بهت کمک کنه تا اپلیکیشنهای جنگو رو بهتر بهینهسازی کنی. اگه عملیاتهای IO Bound داری، از async استفاده کن و اگر CPU Bound هستن، برو سراغ multiprocessing.
#iobound #cpubound #python #django
⚡7❤3👍3
💎 معرفی پکیج honeypot 💎
امروز میخوام درباره یه پکیج خفن برای جنگو به اسم django-admin-honeypot صحبت کنم که به شما کمک میکنه جلوی دسترسیهای غیرمجاز به پنل ادمین پروژهتون رو بگیرین. این پکیج بهصورت حرفهای میتونه هکرها و رباتهایی که سعی دارن به پنل ادمین سایتتون دسترسی پیدا کنن رو گیر بندازه 😎
حالا django-admin-honeypot چیه؟ 🤔
خب django-admin-honeypot یه پکیج امنیتی برای Django هست که یک صفحه لاگین جعلی برای پنل ادمین شما ایجاد میکنه. این صفحه شبیه به صفحه لاگین اصلی به نظر میرسه، ولی در واقع تلهایه که کاربرهای غیرمجاز رو فریب میده تا اطلاعات ورودشون رو وارد کنن. از این طریق، شما میتونید بهراحتی متوجه بشید چه افرادی قصد دسترسی به پنل شما رو دارن. 💀
چه فایدهای داره؟ 🤷♂️
1⃣ ردیابی حملات:
شما میتونین هر کسی که سعی داره بدون اجازه وارد پنل ادمین بشه رو شناسایی کنین.
2⃣ کاهش ریسک حملات:
هکرها به اشتباه فکر میکنن وارد صفحه اصلی شدن و شما میتونین از این فرصت استفاده کنین تا حمله رو مدیریت کنین.
3⃣ سادگی استفاده:
بدون نیاز به تغییرات پیچیده توی پروژهتون، بهراحتی میتونید این پکیج رو نصب و استفاده کنین.
چطور از django-admin-honeypot استفاده کنیم؟ 🚀
1⃣ نصب پکیج
برای شروع، کافیه پکیج رو نصب کنی:
2⃣ اضافه کردن به پروژه
بعد از نصب، باید django-admin-honeypot رو به تنظیمات پروژه اضافه کنی. توی فایل
3⃣ تنظیمات URL
حالا وقتشه که یه مسیر جعلی برای پنل ادمین بسازی! توی فایل
نتیجه:
- مسیر
- مسیر
4⃣ تست و بررسی
حالا اگه کسی به
جمع بندی 🎯
فهمیدیم استفاده از django-admin-honeypot یه راه عالی برای گمراه کردن هکرها و افرادیه که سعی دارن به پنل ادمین شما دسترسی پیدا کنن. با ساختن یه تله ساده، میتونین از دسترسیهای غیرمجاز جلوگیری کنین و امنیت پروژهتون رو بالاتر ببرین.
امید وارم مفید بوده باشه :)
@ninja_learn_ir
امروز میخوام درباره یه پکیج خفن برای جنگو به اسم django-admin-honeypot صحبت کنم که به شما کمک میکنه جلوی دسترسیهای غیرمجاز به پنل ادمین پروژهتون رو بگیرین. این پکیج بهصورت حرفهای میتونه هکرها و رباتهایی که سعی دارن به پنل ادمین سایتتون دسترسی پیدا کنن رو گیر بندازه 😎
حالا django-admin-honeypot چیه؟ 🤔
خب django-admin-honeypot یه پکیج امنیتی برای Django هست که یک صفحه لاگین جعلی برای پنل ادمین شما ایجاد میکنه. این صفحه شبیه به صفحه لاگین اصلی به نظر میرسه، ولی در واقع تلهایه که کاربرهای غیرمجاز رو فریب میده تا اطلاعات ورودشون رو وارد کنن. از این طریق، شما میتونید بهراحتی متوجه بشید چه افرادی قصد دسترسی به پنل شما رو دارن. 💀
چه فایدهای داره؟ 🤷♂️
1⃣ ردیابی حملات:
شما میتونین هر کسی که سعی داره بدون اجازه وارد پنل ادمین بشه رو شناسایی کنین.
2⃣ کاهش ریسک حملات:
هکرها به اشتباه فکر میکنن وارد صفحه اصلی شدن و شما میتونین از این فرصت استفاده کنین تا حمله رو مدیریت کنین.
3⃣ سادگی استفاده:
بدون نیاز به تغییرات پیچیده توی پروژهتون، بهراحتی میتونید این پکیج رو نصب و استفاده کنین.
چطور از django-admin-honeypot استفاده کنیم؟ 🚀
1⃣ نصب پکیج
برای شروع، کافیه پکیج رو نصب کنی:
pip install django-admin-honeypot
2⃣ اضافه کردن به پروژه
بعد از نصب، باید django-admin-honeypot رو به تنظیمات پروژه اضافه کنی. توی فایل
settings.py
خط زیر رو اضافه کن:INSTALLED_APPS = [
# برنامههای دیگه
'admin_honeypot',
]
3⃣ تنظیمات URL
حالا وقتشه که یه مسیر جعلی برای پنل ادمین بسازی! توی فایل
urls.py
این تغییرات رو اعمال کن:from django.urls import path, include
import admin_honeypot.urls
urlpatterns = [
path('admin/', include('admin_honeypot.urls', namespace='admin_honeypot')),
path('real-admin/', admin.site.urls), # مسیر اصلی پنل ادمین واقعیتون
]
نتیجه:
- مسیر
/admin/
حالا صفحه جعلی ادمینه که تلهی شماست 😈 - مسیر
/real-admin/
هم مسیر واقعی پنل ادمین شماست که فقط خودتون میدونید.4⃣ تست و بررسی
حالا اگه کسی به
/admin/
بره و سعی کنه وارد پنل بشه، اطلاعات تلاشهاش توی لاگها ذخیره میشه و میتونین بررسی کنین که چه کسی سعی داشته پنل ادمین رو هک کنه. هر لاگ شامل زمان، آیپی و اطلاعات لاگین اشتباه فرد مهاجم میشه. 📜جمع بندی 🎯
فهمیدیم استفاده از django-admin-honeypot یه راه عالی برای گمراه کردن هکرها و افرادیه که سعی دارن به پنل ادمین شما دسترسی پیدا کنن. با ساختن یه تله ساده، میتونین از دسترسیهای غیرمجاز جلوگیری کنین و امنیت پروژهتون رو بالاتر ببرین.
#django #honeypot
👍12❤2🔥1👏1
💎 معرفی GraphQL و استفاده ازش 💎
اگه تا حالا اسم GraphQL به گوشتون خورده ولی نمیدونستید دقیقاً چیه و چه کاربردی داره، امروز قراره باهم برسیش کنیم و بفهمیم چرا این روزها انقدر محبوب شده🌟
حالا GraphQL چیه؟ 🤔
خب GraphQL یه زبان کوئری برای API هاست که توسط فیسبوک توی سال ۲۰۱۵ معرفی شد. این تکنولوژی به شما اجازه میده که دقیقاً همون دادههایی که نیاز دارین رو از سرور درخواست کنین. مهمترین ویژگی GraphQL اینه که به جای دریافت یه ساختار ثابت از اطلاعات، میتونین مشخص کنین چه دادههایی رو دقیقاً میخواین و چه دادههایی رو نمیخواین.
به زبان ساده، GraphQL به شما کنترل بیشتری روی دادههایی که از API میگیرین میده. 🌍
چرا از GraphQL استفاده کنیم؟ 🤷♂️
1⃣ دریافت دادههای دقیق 🎯
و پاسخ هم دقیقاً همون چیزی خواهد بود که درخواست کردین:
این یعنی فقط همون دادههایی که خواستین برمیگرده و هیچ اطلاعات اضافهای به شما داده نمیشه.
2⃣ بهینهسازی درخواستها 🚀
این بهینهسازی توی عملکرد و سرعت، تاثیر زیادی روی تجربه کاربری داره. 💡
3⃣ پشتیبانی از تکامل تدریجی 💻
1⃣ فیسبوک: همونطور که گفته شد، GraphQL توسط فیسبوک ایجاد شد و فیسبوک همچنان از اون توی بسیاری از محصولات خودش استفاده میکنه، مثل اپلیکیشن فیسبوک و اینستاگرام.
2⃣ گیت هاب: GraphQL به عنوان یک API اصلی توی GitHub استفاده میشه و شما میتونین از طریق GraphQL به اطلاعات پروژهها و کاربران GitHub دسترسی داشته باشین.
3⃣ شاپیفای (Shopify): توی پلتفرم Shopify، از GraphQL برای بهینهسازی و سرعت بخشیدن به APIها استفاده میشه.
حچطور از GraphQL استفاده کنیم؟ 🛠️
راهاندازی GraphQL توی پروژههای مختلف واقعاً سادهست. توی پلتفرمهایی مثل Django یا Node.js، پکیجها و کتابخونههای آمادهای وجود دارن که شما میتونین سریعاً ازشون استفاده کنین.
برای مثال، در Django، شما میتونین با استفاده از Graphene-Django خیلی راحت یه API GraphQL بسازین.
توجه ⚠️:
این فقط یه مثال ساده برای شروع هستش:
و بعد توی پروژهتون:
این کد یه کوئری ساده به اسم
جمعبندی 🎯
فهمیدیم GraphQL با انعطافپذیری و سرعت بالا، باعث میشه که APIهای بهتری طراحی کنین و تجربه کاربری بهتری ارائه بدین.
امید وارم مفید بوده باشه :)
@ninja_learn_ir
اگه تا حالا اسم GraphQL به گوشتون خورده ولی نمیدونستید دقیقاً چیه و چه کاربردی داره، امروز قراره باهم برسیش کنیم و بفهمیم چرا این روزها انقدر محبوب شده🌟
حالا GraphQL چیه؟ 🤔
خب GraphQL یه زبان کوئری برای API هاست که توسط فیسبوک توی سال ۲۰۱۵ معرفی شد. این تکنولوژی به شما اجازه میده که دقیقاً همون دادههایی که نیاز دارین رو از سرور درخواست کنین. مهمترین ویژگی GraphQL اینه که به جای دریافت یه ساختار ثابت از اطلاعات، میتونین مشخص کنین چه دادههایی رو دقیقاً میخواین و چه دادههایی رو نمیخواین.
به زبان ساده، GraphQL به شما کنترل بیشتری روی دادههایی که از API میگیرین میده. 🌍
چرا از GraphQL استفاده کنیم؟ 🤷♂️
1⃣ دریافت دادههای دقیق 🎯
یکی از بزرگترین مشکلاتی که معماریهای سنتی API دارن اینه که گاهی دادههایی که لازم نداریم رو هم به ما برمیگردونن. GraphQL این مشکل رو حل کرده. شما توی GraphQL میتونین کاملاً مشخص کنین که چه فیلدهایی از دادهها رو نیاز دارین و فقط همونها رو از سرور بگیرین.مثال: فرض کنین میخواین فقط اسم و ایمیل کاربر رو از API بگیرین. کوئری GraphQL میتونه اینطوری باشه:
{
user(id: 1) {
name
}
}
و پاسخ هم دقیقاً همون چیزی خواهد بود که درخواست کردین:
{
"data": {
"user": {
"name": "Ali",
"email": "ali@example.com"
}
}
}
این یعنی فقط همون دادههایی که خواستین برمیگرده و هیچ اطلاعات اضافهای به شما داده نمیشه.
2⃣ بهینهسازی درخواستها 🚀
یکی از مشکلات رایج توی APIهای سنتی، تعداد زیاد درخواستها (requests) برای گرفتن اطلاعات مختلفه. GraphQL به شما این امکان رو میده که با یک درخواست همه دادههای مورد نیازتون رو بگیرین. شما میتونین توی یه کوئری، اطلاعات از چندین منبع مختلف رو دریافت کنین و نیازی به ارسال چندین درخواست نیست.مثال: فرض کنین میخواین اطلاعات کاربر، لیست سفارشها و محصولاتی که خریده رو بگیرین. کوئری GraphQL بهراحتی این اطلاعات رو توی یک درخواست برمیگردونه:
{
user(id: 1) {
name
orders {
id
product {
name
price
}
}
}
}
این بهینهسازی توی عملکرد و سرعت، تاثیر زیادی روی تجربه کاربری داره. 💡
3⃣ پشتیبانی از تکامل تدریجی 💻
یکی از ویژگیهای مهم GraphQL اینه که بهراحتی میتونین API خودتون رو بدون اینکه تغییرات بزرگی به وجود بیارین، توسعه بدین. این یعنی میتونین فیلدهای جدیدی به دادههاتون اضافه کنین بدون اینکه نیاز به تغییر توی کل API داشته باشین. این قابلیت، انعطافپذیری زیادی توی توسعه و نگهداری API داره.4⃣ مستندات خودکار 📚
یکی دیگه از ویژگیهای عالی GraphQL، مستندسازی خودکارشه. از اونجایی که GraphQL یک سیستم تایپینگ قوی داره، میتونه بهصورت خودکار مستندات API رو بسازه و شما همیشه مستندات بهروز و کاملی دارین. این خیلی به درد تیمهای توسعهای میخوره که از پروژههای مختلف استفاده میکنن و همیشه باید به مستندات دقیق دسترسی داشته باشن.کاربردهای واقعی GraphQL 📈
1⃣ فیسبوک: همونطور که گفته شد، GraphQL توسط فیسبوک ایجاد شد و فیسبوک همچنان از اون توی بسیاری از محصولات خودش استفاده میکنه، مثل اپلیکیشن فیسبوک و اینستاگرام.
2⃣ گیت هاب: GraphQL به عنوان یک API اصلی توی GitHub استفاده میشه و شما میتونین از طریق GraphQL به اطلاعات پروژهها و کاربران GitHub دسترسی داشته باشین.
3⃣ شاپیفای (Shopify): توی پلتفرم Shopify، از GraphQL برای بهینهسازی و سرعت بخشیدن به APIها استفاده میشه.
حچطور از GraphQL استفاده کنیم؟ 🛠️
راهاندازی GraphQL توی پروژههای مختلف واقعاً سادهست. توی پلتفرمهایی مثل Django یا Node.js، پکیجها و کتابخونههای آمادهای وجود دارن که شما میتونین سریعاً ازشون استفاده کنین.
برای مثال، در Django، شما میتونین با استفاده از Graphene-Django خیلی راحت یه API GraphQL بسازین.
توجه ⚠️:
این فقط یه مثال ساده برای شروع هستش:
pip install graphene-django
و بعد توی پروژهتون:
import graphene
class Query(graphene.ObjectType):
hello = graphene.String()
def resolve_hello(self, info):
return "Hello, world!"
schema = graphene.Schema(query=Query)
این کد یه کوئری ساده به اسم
hello
میسازه که وقتی از GraphQL درخواست بشه، مقدار "Hello, world!"
رو برمیگردونه.جمعبندی 🎯
فهمیدیم GraphQL با انعطافپذیری و سرعت بالا، باعث میشه که APIهای بهتری طراحی کنین و تجربه کاربری بهتری ارائه بدین.
#django #api #graphql
🔥16👍3❤2
استفاده از PWA در Django 🌐
امروز میخوایم درباره یه موضوع داغ صحبت کنیم: Progressive Web Apps (PWA) و چطور میتونیم ازش توی Django استفاده کنیم. اگه دنبال این هستی که اپلیکیشن وبی بسازی که نه تنها روی مرورگرها کار کنه، بلکه تجربهای شبیه به اپلیکیشنهای موبایل به کاربران بده، PWA گزینه عالیه.
حالا PWA چی هست؟ 🤔
خب PWAها وباپلیکیشنهایی هستن که ویژگیهای اپلیکیشنهای موبایل رو دارن. این ویژگیها شامل:
1⃣ عملکرد آفلاین:
کاربران میتونن بدون اینترنت به اپلیکیشن دسترسی داشته باشن.
2⃣ نصب روی صفحه اصلی:
میتونی اپلیکیشن رو مستقیماً روی صفحه اصلی گوشی نصب کنی.
3⃣ سرعت بارگذاری بالا: PWAها به دلیل cache کردن منابع، خیلی سریع بارگذاری میشن.
چطور PWA رو توی Django پیادهسازی کنیم؟ 🚀
برای ساختن PWA با Django، مراحل زیر رو دنبال کن:
1⃣ نصب Django و تنظیم پروژه
اول از همه، یه پروژه Django جدید ایجاد کن:
2⃣ تنظیمات پروژه
حالا باید
3⃣ ساخت فایل Manifest
فایل Manifest یه فایل JSON هست که اطلاعاتی درباره اپلیکیشن تو میده. این فایل رو به اسم
4⃣ اضافه کردن Service Worker
ـService Worker یه جاوااسکریپت فایلیه که به مرورگر اجازه میده کارهایی رو در پسزمینه انجام بده، مثلاً cache کردن منابع. این فایل رو به اسم
5⃣ اضافه کردن به HTML
حالا باید فایلهای manifest و service worker رو به قالب HTML خودت اضافه کنی. به عنوان مثال، در
جمع بندی 🎉
با انجام این مراحل، شما یک PWA با Django ساختید که میتونه به کاربران تجربهای مشابه با اپلیکیشنهای موبایل بده. این یعنی کاربرها میتونن اپلیکیشن شما رو نصب کنن و حتی وقتی اینترنت ندارن هم بهش دسترسی داشته باشن. PWAها به سرعت در حال محبوبیت هستن و میتونی با استفاده از Django و این تکنیکها، یه اپلیکیشن عالی بسازی.
امید وارم مفید بوده باشه :)❤️
امروز میخوایم درباره یه موضوع داغ صحبت کنیم: Progressive Web Apps (PWA) و چطور میتونیم ازش توی Django استفاده کنیم. اگه دنبال این هستی که اپلیکیشن وبی بسازی که نه تنها روی مرورگرها کار کنه، بلکه تجربهای شبیه به اپلیکیشنهای موبایل به کاربران بده، PWA گزینه عالیه.
حالا PWA چی هست؟ 🤔
خب PWAها وباپلیکیشنهایی هستن که ویژگیهای اپلیکیشنهای موبایل رو دارن. این ویژگیها شامل:
1⃣ عملکرد آفلاین:
کاربران میتونن بدون اینترنت به اپلیکیشن دسترسی داشته باشن.
2⃣ نصب روی صفحه اصلی:
میتونی اپلیکیشن رو مستقیماً روی صفحه اصلی گوشی نصب کنی.
3⃣ سرعت بارگذاری بالا: PWAها به دلیل cache کردن منابع، خیلی سریع بارگذاری میشن.
چطور PWA رو توی Django پیادهسازی کنیم؟ 🚀
برای ساختن PWA با Django، مراحل زیر رو دنبال کن:
1⃣ نصب Django و تنظیم پروژه
اول از همه، یه پروژه Django جدید ایجاد کن:
django-admin startproject my_pwa
cd my_pwa
python manage.py startapp my_app
2⃣ تنظیمات پروژه
حالا باید
my_app
رو به INSTALLED_APPS
توی فایل settings.py
اضافه کنی:INSTALLED_APPS = [
...
'my_app',
]
3⃣ ساخت فایل Manifest
فایل Manifest یه فایل JSON هست که اطلاعاتی درباره اپلیکیشن تو میده. این فایل رو به اسم
manifest.json
در پوشه static
بساز:{
"name": "My PWA",
"short_name": "PWA",
"start_url": "/",
"display": "standalone",
"background_color": "#FFFFFF",
"theme_color": "#000000",
"icons": [
{
"src": "icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
4⃣ اضافه کردن Service Worker
ـService Worker یه جاوااسکریپت فایلیه که به مرورگر اجازه میده کارهایی رو در پسزمینه انجام بده، مثلاً cache کردن منابع. این فایل رو به اسم
sw.js
در پوشه static
بساز:self.addEventListener('install', (event) => {
event.waitUntil(
caches.open('my-pwa-cache').then((cache) => {
return cache.addAll([
'/',
'/static/icon-192x192.png',
'/static/icon-512x512.png',
// Add other resources here
]);
})
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then((response) => {
return response || fetch(event.request);
})
);
});
5⃣ اضافه کردن به HTML
حالا باید فایلهای manifest و service worker رو به قالب HTML خودت اضافه کنی. به عنوان مثال، در
base.html
:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="manifest" href="{% static 'manifest.json' %}">
<title>My PWA</title>
</head>
<body>
<h1>خوش اومدی به PWA من</h1>
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/static/sw.js').then((registration) => {
console.log('Service Worker registered with scope:', registration.scope);
});
});
}
</script>
</body>
</html>
جمع بندی 🎉
با انجام این مراحل، شما یک PWA با Django ساختید که میتونه به کاربران تجربهای مشابه با اپلیکیشنهای موبایل بده. این یعنی کاربرها میتونن اپلیکیشن شما رو نصب کنن و حتی وقتی اینترنت ندارن هم بهش دسترسی داشته باشن. PWAها به سرعت در حال محبوبیت هستن و میتونی با استفاده از Django و این تکنیکها، یه اپلیکیشن عالی بسازی.
#django #pwa
🔆 CHANNEL | GROUP
❤18👍12🔥1
سیستم مدریت محتوا (CMS) Wegtail 🐦
امروز میخوام یه کم درمورد Wagtail صحبت کنیم؛ یه CMS حرفهای و خوشدست که این روزا بین توسعهدهندههای جنگو حسابی محبوب شده. اگه یه بار بخواین یه سیستم مدیریت محتوا (CMS) حرفهای و انعطافپذیر برای پروژههاتون راه بندازین و دیگه وردپرس و اون پلاگینها و پیچیدگیهاش خستهتون کرده، حتماً Wagtail یه گزینه ایدهآل براتونه. 😎
حالا Wagtail چیه؟ 🐦
یه سیستم مدیریت محتوای اپنسورس و مبتنی بر جنگو که برای ساخت سایتهای داینامیک و مقیاسپذیر طراحی شده. توی Wagtail از امکانات عالی جنگو استفاده شده و همینطور یه UI ساده و مینیمال داره که کار باهاش رو خیلی لذتبخش میکنه. 🎨
چرا از Wagtail استفاده کنیم؟ 🤔
1⃣ سرعت و عملکرد بالا 🚀: Wagtail با پایتون و فریمورک Django ساخته شده، که از لحاظ سرعت و پرفورمنس کلاً یه سر و گردن از وردپرس بالاتره.
2⃣ سفارشیسازی قوی 🛠️: با اینکه توی وردپرس هم میشه کد سفارشی نوشت، ولی با معماری Wagtail و قدرت جنگو، میتونید هر نوع سفارشیسازیای رو راحتتر و تمیزتر انجام بدین.
3⃣ سیستم مدیریت تصاویر و ویدئو 📸: یکی از نکات قوت Wagtail سیستم مدیریت تصاویره. این CMS ابزارهای کاملی برای برش، تغییر سایز، و بهینهسازی تصاویر داره و بهتون کمک میکنه تا محتوای تصویری باکیفیتتری بسازید.
4⃣ ـUser Experience بهتر 🧑💻: UI مینیمال و سادهای که داره، کار باهاش رو راحت و لذتبخش میکنه. شما و کاربرهاتون راحتتر میتونید صفحات و محتوای سایت رو مدیریت کنید.
مقایسه با وردپرس 🆚
خب، شاید بگید وردپرس رو همه بلدن و کلی پلاگین داره و اینا. درسته، ولی اینا همیشه هم مزیت نیستن پلاگینهای وردپرس میتونن سنگین و پر از باگ باشن و امنیت سایت رو پایین بیارن. توی Wagtail شما یه کد تمیز و ساختار منظم دارین، که نیاز به پلاگینهای اضافی رو خیلی کم میکنه.
مثال ساده از قدرت Wagtail 💡
فرض کنین میخواین یه صفحه لندینگ طراحی کنید که هم داینامیک باشه و هم زیبا. با Wagtail میتونید با چند خط کد، بلوکهای محتوایی دلخواه خودتون رو بسازید و به هر شکلی که بخواین نمایش بدین. مثلاً یه بلاک تصویر، یه بلاک متن و یه بلاک دکمه که قابل ترتیبدهی باشه. این کار توی Wagtail خیلی سادهتر و سریعتر از وردپرس انجام میشه. 🎉
امنیت و بهروزرسانی 🔐
ـWagtail به خاطر معماری امنتر جنگو و جامعه فعالی که پشتیبانشه، همیشه بهروز و امنه. دیگه نیازی نیست نگران اون همه آپدیتهای وردپرس و ناسازگاری پلاگینها باشین.
جمع بندی 📚
کلاً اگه دنبال یه CMS سریع، امن و منعطف هستید که کدهای تمیز و حرفهای داشته باشه، حتماً یه بار Wagtail رو امتحان کنین. هم از کار باهاش لذت میبرید، هم پروژهتون ساختارمندتر و حرفهایتر میشه. 👌
امید وارم مفید بوده باشه :)
امروز میخوام یه کم درمورد Wagtail صحبت کنیم؛ یه CMS حرفهای و خوشدست که این روزا بین توسعهدهندههای جنگو حسابی محبوب شده. اگه یه بار بخواین یه سیستم مدیریت محتوا (CMS) حرفهای و انعطافپذیر برای پروژههاتون راه بندازین و دیگه وردپرس و اون پلاگینها و پیچیدگیهاش خستهتون کرده، حتماً Wagtail یه گزینه ایدهآل براتونه. 😎
حالا Wagtail چیه؟ 🐦
یه سیستم مدیریت محتوای اپنسورس و مبتنی بر جنگو که برای ساخت سایتهای داینامیک و مقیاسپذیر طراحی شده. توی Wagtail از امکانات عالی جنگو استفاده شده و همینطور یه UI ساده و مینیمال داره که کار باهاش رو خیلی لذتبخش میکنه. 🎨
چرا از Wagtail استفاده کنیم؟ 🤔
1⃣ سرعت و عملکرد بالا 🚀: Wagtail با پایتون و فریمورک Django ساخته شده، که از لحاظ سرعت و پرفورمنس کلاً یه سر و گردن از وردپرس بالاتره.
2⃣ سفارشیسازی قوی 🛠️: با اینکه توی وردپرس هم میشه کد سفارشی نوشت، ولی با معماری Wagtail و قدرت جنگو، میتونید هر نوع سفارشیسازیای رو راحتتر و تمیزتر انجام بدین.
3⃣ سیستم مدیریت تصاویر و ویدئو 📸: یکی از نکات قوت Wagtail سیستم مدیریت تصاویره. این CMS ابزارهای کاملی برای برش، تغییر سایز، و بهینهسازی تصاویر داره و بهتون کمک میکنه تا محتوای تصویری باکیفیتتری بسازید.
4⃣ ـUser Experience بهتر 🧑💻: UI مینیمال و سادهای که داره، کار باهاش رو راحت و لذتبخش میکنه. شما و کاربرهاتون راحتتر میتونید صفحات و محتوای سایت رو مدیریت کنید.
مقایسه با وردپرس 🆚
خب، شاید بگید وردپرس رو همه بلدن و کلی پلاگین داره و اینا. درسته، ولی اینا همیشه هم مزیت نیستن پلاگینهای وردپرس میتونن سنگین و پر از باگ باشن و امنیت سایت رو پایین بیارن. توی Wagtail شما یه کد تمیز و ساختار منظم دارین، که نیاز به پلاگینهای اضافی رو خیلی کم میکنه.
مثال ساده از قدرت Wagtail 💡
فرض کنین میخواین یه صفحه لندینگ طراحی کنید که هم داینامیک باشه و هم زیبا. با Wagtail میتونید با چند خط کد، بلوکهای محتوایی دلخواه خودتون رو بسازید و به هر شکلی که بخواین نمایش بدین. مثلاً یه بلاک تصویر، یه بلاک متن و یه بلاک دکمه که قابل ترتیبدهی باشه. این کار توی Wagtail خیلی سادهتر و سریعتر از وردپرس انجام میشه. 🎉
امنیت و بهروزرسانی 🔐
ـWagtail به خاطر معماری امنتر جنگو و جامعه فعالی که پشتیبانشه، همیشه بهروز و امنه. دیگه نیازی نیست نگران اون همه آپدیتهای وردپرس و ناسازگاری پلاگینها باشین.
جمع بندی 📚
کلاً اگه دنبال یه CMS سریع، امن و منعطف هستید که کدهای تمیز و حرفهای داشته باشه، حتماً یه بار Wagtail رو امتحان کنین. هم از کار باهاش لذت میبرید، هم پروژهتون ساختارمندتر و حرفهایتر میشه. 👌
#cms #django #python
🔆 CHANNEL | GROUP
🔥9❤4
✨ الستیک سرچ در جنگو ✨
اگه یه سیستم داری که نیاز داره روی دیتا جستجوهای سریع و پیشرفته انجام بشه، الستیک سرچ (Elasticsearch) یکی از بهترین انتخابهاست. این ابزار جستجوی قدرتمند بهت کمک میکنه تا جستجوهایی مثل فیلترهای پیچیده، جستجوی تماممتنی (Full-Text Search) و حتی پیشنهادات مرتبط رو راحت پیادهسازی کنی. حالا بیا ببینیم چطور میتونی ازش تو پروژههای جنگو استفاده کنی.
چرا الستیک سرچ؟
جنگو با ORM خودش برای کوئریها خوبه، ولی وقتی تعداد رکوردها زیاد بشه یا بخوای جستجوی خیلی پیچیده بزنی، سرعت و انعطافش کم میشه. اینجا الستیک سرچ به دادت میرسه.
تا باهاش میتونی:
🔍 جستجوهای سریعتر داشته باشی حتی با دیتاستهای بزرگ
✨ جستجوی full-text یا فازی (مثل پیشنهادهای تایپشده اشتباه) انجام بدی
دادهها رو بر اساس 📊 اولویت و امتیاز (Relevance) مرتب کنی
راهاندازی Elasticsearch در جنگو
برای اینکه الستیک سرچ رو به پروژه جنگوت اضافه کنی، مراحل زیر رو دنبال کن:
1⃣ نصب Elasticsearch
اول از همه باید الستیک سرچ رو نصب و راهاندازی کنی. میتونی از Docker استفاده کنی:
2⃣ نصب کتابخونهها
پکیجهایی مثل
3⃣ تنظیمات اولیه
توی فایل تنظیمات جنگو (settings.py)، آدرس و پورت الستیک سرچ رو مشخص کن:
ایجاد ایندکس و اتصال به مدلها
حالا باید دادههات رو به الستیک سرچ وصل کنی و ایندکس بسازی.
ایجاد Document برای مدلها
خب Document جاییه که مدلهای جنگو رو به ایندکس الستیک سرچ وصل میکنه:
ایندکس کردن دادهها
برای انتقال دادههای فعلی به الستیک سرچ:
پیادهسازی جستجو در ویوها
حالا بیا یه API برای جستجو درست کنیم:
ویو جستجو
اضافه کردن به URLها
ادامه پست بعدی
امید وارم مفید بوده باشه :)
اگه یه سیستم داری که نیاز داره روی دیتا جستجوهای سریع و پیشرفته انجام بشه، الستیک سرچ (Elasticsearch) یکی از بهترین انتخابهاست. این ابزار جستجوی قدرتمند بهت کمک میکنه تا جستجوهایی مثل فیلترهای پیچیده، جستجوی تماممتنی (Full-Text Search) و حتی پیشنهادات مرتبط رو راحت پیادهسازی کنی. حالا بیا ببینیم چطور میتونی ازش تو پروژههای جنگو استفاده کنی.
چرا الستیک سرچ؟
جنگو با ORM خودش برای کوئریها خوبه، ولی وقتی تعداد رکوردها زیاد بشه یا بخوای جستجوی خیلی پیچیده بزنی، سرعت و انعطافش کم میشه. اینجا الستیک سرچ به دادت میرسه.
تا باهاش میتونی:
🔍 جستجوهای سریعتر داشته باشی حتی با دیتاستهای بزرگ
✨ جستجوی full-text یا فازی (مثل پیشنهادهای تایپشده اشتباه) انجام بدی
دادهها رو بر اساس 📊 اولویت و امتیاز (Relevance) مرتب کنی
راهاندازی Elasticsearch در جنگو
برای اینکه الستیک سرچ رو به پروژه جنگوت اضافه کنی، مراحل زیر رو دنبال کن:
1⃣ نصب Elasticsearch
اول از همه باید الستیک سرچ رو نصب و راهاندازی کنی. میتونی از Docker استفاده کنی:
docker run -d -p 9200:9200 -e "discovery.type=single-node" elasticsearch:8.10.1
2⃣ نصب کتابخونهها
پکیجهایی مثل
elasticsearch-dsl
و django-elasticsearch-dsl
کار رو خیلی راحت میکنن: pip install elasticsearch-dsl django-elasticsearch-dsl
3⃣ تنظیمات اولیه
توی فایل تنظیمات جنگو (settings.py)، آدرس و پورت الستیک سرچ رو مشخص کن:
ELASTICSEARCH_DSL = {
'default': {
'hosts': 'localhost:9200'
}
}
ایجاد ایندکس و اتصال به مدلها
حالا باید دادههات رو به الستیک سرچ وصل کنی و ایندکس بسازی.
ایجاد Document برای مدلها
خب Document جاییه که مدلهای جنگو رو به ایندکس الستیک سرچ وصل میکنه:
from django_elasticsearch_dsl import Document
from django_elasticsearch_dsl.registries import registry
from .models import Article
@registry.register_document
class ArticleDocument(Document):
class Index:
name = 'articles' # اسم ایندکس
class Django:
model = Article
fields = [
'title',
'content',
'published_at',
]
ایندکس کردن دادهها
برای انتقال دادههای فعلی به الستیک سرچ:
python manage.py search_index --rebuild
پیادهسازی جستجو در ویوها
حالا بیا یه API برای جستجو درست کنیم:
ویو جستجو
from django.http import JsonResponse
from .documents import ArticleDocument
def search_articles(request):
query = request.GET.get('q', '')
results = ArticleDocument.search().query("multi_match", query=query, fields=["title", "content"])
data = [hit.to_dict() for hit in results]
return JsonResponse({'results': data})
اضافه کردن به URLها
from django.urls import path
from .views import search_articles
urlpatterns = [
path('search/', search_articles, name='search_articles'),
]
ادامه پست بعدی
#python #django #web
🔆 CHANNEL | GROUP
1❤17👍4
🧵 ـGenerator ها در جنگو؛ یه ابزار خاص برای بهینهسازی کدها
اگه با پایتون آشنا باشی، احتمالاً میدونی که generator ها توی صرفهجویی حافظه و تولید داده به صورت lazy خیلی کاربرد دارن. اما این ابزار توی جنگو چطوری استفاده میشه؟ چجوری میتونیم ازشون بیشترین بهره رو ببریم؟ بیا با هم بررسی کنیم.
💡 ـGenerator چیه؟
ـGenerator یه نوع iterator خاصه که وقتی نیاز داری داده تولید میکنه، نه اینکه کل داده رو یهجا توی حافظه نگه داره. توی جنگو این ابزار وقتی مفید میشه که بخوای با دادههای بزرگ کار کنی.
مثلاً:
◀️ کار با QuerySetهای سنگین
◀️ پردازش Streamهای دادهای
◀️ تولید گزارشهای حجیم
🏗 چرا توی جنگو به generator نیاز داریم؟
تصور کن یه جدول دیتابیس با میلیونها رکورد داری و باید اطلاعات رو به مرور پردازش کنی. اگه همه رکوردها رو یهجا لود کنی، سرور به احتمال زیاد میترکه. اینجا generator ها به دادت میرسن. Lazy Evaluation یعنی فقط همون چیزی که نیاز داری رو تولید کن و حافظه رو با چیزای اضافی پر نکن.
✍ استفاده از generator توی QuerySet
ـQuerySetهای جنگو به صورت پیشفرض lazy هستن. این یعنی تا وقتی که واقعاً نیاز نباشه، کوئری به دیتابیس نمیزنه. ولی میتونی این فرآیند رو با generatorها بهینهتر کنی.
مثال:
اینجا از متد iterator() استفاده کردیم که یه generator میسازه و باعث میشه کوئری به صورت chunk به chunk پردازش بشه.
🌊 ـStream کردن دادهها با generator
اگه بخوای یه فایل CSV بزرگ برای دانلود بسازی، generator یه ابزار طلاییه.
مثال:
اینجا به جای ساختن کل CSV توی حافظه، دادهها رو به صورت real-time تولید میکنیم.
🔸 نکات مهم
ـAvoid Overuse
ـCombine with Chunking
جمعبندی ✍
ـgeneratorها یه ابزار قدرتمند برای مدیریت منابع هستن، به شرطی که بدونی کجا و چطوری ازشون استفاده کنی. مخصوصاً توی پروژههای سنگین جنگو که حجم دادهها خیلی زیاده، این ابزار میتونه یه برگ برنده باشه.
امید وارم مفید بوده باشه :) ❤️
اگه با پایتون آشنا باشی، احتمالاً میدونی که generator ها توی صرفهجویی حافظه و تولید داده به صورت lazy خیلی کاربرد دارن. اما این ابزار توی جنگو چطوری استفاده میشه؟ چجوری میتونیم ازشون بیشترین بهره رو ببریم؟ بیا با هم بررسی کنیم.
💡 ـGenerator چیه؟
ـGenerator یه نوع iterator خاصه که وقتی نیاز داری داده تولید میکنه، نه اینکه کل داده رو یهجا توی حافظه نگه داره. توی جنگو این ابزار وقتی مفید میشه که بخوای با دادههای بزرگ کار کنی.
مثلاً:
◀️ کار با QuerySetهای سنگین
◀️ پردازش Streamهای دادهای
◀️ تولید گزارشهای حجیم
🏗 چرا توی جنگو به generator نیاز داریم؟
تصور کن یه جدول دیتابیس با میلیونها رکورد داری و باید اطلاعات رو به مرور پردازش کنی. اگه همه رکوردها رو یهجا لود کنی، سرور به احتمال زیاد میترکه. اینجا generator ها به دادت میرسن. Lazy Evaluation یعنی فقط همون چیزی که نیاز داری رو تولید کن و حافظه رو با چیزای اضافی پر نکن.
✍ استفاده از generator توی QuerySet
ـQuerySetهای جنگو به صورت پیشفرض lazy هستن. این یعنی تا وقتی که واقعاً نیاز نباشه، کوئری به دیتابیس نمیزنه. ولی میتونی این فرآیند رو با generatorها بهینهتر کنی.
مثال:
from django.db.models import QuerySet
def get_large_data(queryset: QuerySet):
for obj in queryset.iterator():
yield process_object(obj)
def process_object(obj):
# پردازش رکورد
return obj
اینجا از متد iterator() استفاده کردیم که یه generator میسازه و باعث میشه کوئری به صورت chunk به chunk پردازش بشه.
🌊 ـStream کردن دادهها با generator
اگه بخوای یه فایل CSV بزرگ برای دانلود بسازی، generator یه ابزار طلاییه.
مثال:
import csv
from django.http import StreamingHttpResponse
def stream_csv(queryset):
def generate():
yield ['Header1', 'Header2', 'Header3']
for obj in queryset.iterator():
yield [obj.field1, obj.field2, obj.field3]
response = StreamingHttpResponse(generate_csv(generate()), content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="data.csv"'
return response
def generate_csv(generator):
for row in generator():
yield ','.join(str(cell) for cell in row) + '\n'
اینجا به جای ساختن کل CSV توی حافظه، دادهها رو به صورت real-time تولید میکنیم.
🔸 نکات مهم
ـAvoid Overuse
اگه حجم دادهها خیلی کم باشه، استفاده از generator صرفاً پیچیدگی کد رو زیاد میکنه.
ـCombine with Chunking
اگه با دیتابیسهای بزرگ کار میکنی، استفاده از generator به همراه متدهایی مثل iterator() یا chunked() توی QuerySet میتونه حسابی عملکرد رو بهینه کنه.ـError Handling
حواست باشه که generatorها وقتی یه خطا پیش بیاد، از ادامه کار متوقف میشن. اگه نیاز داری عملیاتت ادامه پیدا کنه، باید exceptionها رو مدیریت کنی.ـPipeline-like Processing
توی پروژههای پیچیدهتر میتونی generatorها رو به هم chain کنی و مثل یه pipeline دادهها رو پردازش کنی.
جمعبندی ✍
ـgeneratorها یه ابزار قدرتمند برای مدیریت منابع هستن، به شرطی که بدونی کجا و چطوری ازشون استفاده کنی. مخصوصاً توی پروژههای سنگین جنگو که حجم دادهها خیلی زیاده، این ابزار میتونه یه برگ برنده باشه.
#django #برنامه_نویسی #پایتون
🔆 CHANNEL | GROUP
👍11❤6
خب خب خب Django Channels چیه؟ و چرا من ازش خوشم نمیاد
قبل از اینکه با هم بریم سراغ Django Channels، یه کم درباره WebSocket بگیم که اصلاً بدونیم داریم درباره چی حرف میزنیم. خب، WebSocket یه پروتکل که بهت اجازه میده ارتباط دوطرفه و دائمی بین کلاینت و سرور داشته باشی. یعنی چی؟ یعنی مثلاً تو یه اپلیکیشن چت، به جای اینکه هر چند ثانیه یه بار درخواست بفرستی "چیزی جدید اومده؟"، سرور خودش هر وقت یه پیام جدید داشت، بلافاصله میفرسته سمتت 🚀.
حالا Django Channels چی میگه؟ 🤔
ـDjango Channels یه ابزار تو اکوسیستم Djangoئه که میاد پشتیبانی از WebSocket، پروتکلهای real-time و کارای async رو به پروژههات اضافه میکنه. به زبان ساده، اگه Django عادی رو یه "خیابون یکطرفه" فرض کنیم، Channels میاد این خیابون رو دوطرفه میکنه. این یعنی میتونی کارایی مثل:
و...
رو خیلی راحتتر با Django انجام بدی.
خب پس مشکلش چیه؟ چرا من ازش خوشم نمیاد؟ 🤷♂️
از دور که نگاه میکنی، Channels خیلی جذاب به نظر میاد، ولی وقتی میخوای باهاش کارکنی، مشکلات خودش رو نشون میده:
1⃣ پیچیدگی توی تنظیمات 😵💫
ـDjango همیشه به خاطر سادگی معروف بوده، ولی Channels میاد این سادگی رو خراب میکنه خیلی خراب میکنه. باید ASGI رو راه بندازی، Redis نصب کنی، routing یاد بگیری، و کلی تنظیمات دیگه انجام بدی. یه پروژه ساده که با Django راحت بود، یهو برات میشه یه جنگل از تنظیمات.
2⃣ وابستگی به Redis 🤦♂️
یکی از مشکلات بزرگ Channels اینه که برای مدیریت eventها و ارتباطها حتماً نیاز به Redis داره. خب چرا؟ دلیلش اینه که Redis بهعنوان message broker استفاده میشه تا پیامها بین کلاینتها و سرور مدیریت بشه. ولی اگه پروژه کوچیک باشه، این وابستگی میتونه دردسرساز بشه.
3⃣ محدودیت توی scale کردن 😩
اگه پروژه کوچیک باشه، Channels بد نیست. ولی وقتی تعداد کاربران زیاد میشه و حجم درخواستها بالا میره، Channels سریع از نفس میافته. این محدودیت بیشتر به خاطر پیچیدگی WebSocket و محدودیتهای سرورهای تک رشته ای هست تا خود Channels. برای پروژههای بزرگ و real-time محور، ابزارای دیگهای مثل Socket.IO یا FastAPI خیلی بهتر عمل میکنن.
4⃣ مشکلات performance 🚨
حتی اگه پروژه خیلی هم بزرگ نباشه، Channels برای real-time پروژههای سنگین خوب عمل نمیکنه. کارای پیچیده async و ارتباطات real-time میتونن سرور رو داغون کنن. البته با تنظیم درست workerها و Redis channel layers میتونی بخشی از این مشکلات رو کم کنی، ولی باز هم کار اضافهست.
5⃣ کمبود مستندات و منابع آموزشی درست و حسابی 📚
یکی دیگه از مشکلات اینه که منابع آموزشی کامل و بهروزی برای Channels خیلی کمه. هر وقت گیر کنی، یا باید بری توی GitHub دنبال issueها، یا دست به دامن دیگران بشی. این باعث میشه زمان زیادی صرف حل مشکلات کنی.
خب حالا راهحل چیه؟ 💡
اگه بخوای real-time کار کنی، اینا میتونن گزینههای بهتری باشن:
ـFastAPI: اگه دنبال سرعت، سادگی و پرفورمنس خوب هستی، FastAPI انتخاب فوقالعادهایه. با WebSocket خیلی راحت کار میکنه و خبری از دردسرای Channels نیست 🚀.
ـSocket.IO: این یکی برای پروژههای real-time شاهکاره. خیلی ابزارای متنوع داره و با Node.js هم عالی مچ میشه.
جمعبندی 🎯
ـDjango Channels میتونه برای پروژههای کوچیک و ساده مناسب باشه، ولی اگه بحث scale، پرفورمنس یا راحتی کار مطرح باشه، اصلاً گزینه خوبی نیست. من از پیچیدگیها و محدودیتهاش خسته شدم و به جای اون سراغ ابزارای دیگه رفتم.
نظر تو چیه؟ Django Channels تا حالا اذیتت کرده یا ازش خوشت میاد؟ بگو ببینم چی تو ذهنت میگذره🧐
➖➖➖➖➖➖➖➖➖
قبل از اینکه با هم بریم سراغ Django Channels، یه کم درباره WebSocket بگیم که اصلاً بدونیم داریم درباره چی حرف میزنیم. خب، WebSocket یه پروتکل که بهت اجازه میده ارتباط دوطرفه و دائمی بین کلاینت و سرور داشته باشی. یعنی چی؟ یعنی مثلاً تو یه اپلیکیشن چت، به جای اینکه هر چند ثانیه یه بار درخواست بفرستی "چیزی جدید اومده؟"، سرور خودش هر وقت یه پیام جدید داشت، بلافاصله میفرسته سمتت 🚀.
حالا Django Channels چی میگه؟ 🤔
ـDjango Channels یه ابزار تو اکوسیستم Djangoئه که میاد پشتیبانی از WebSocket، پروتکلهای real-time و کارای async رو به پروژههات اضافه میکنه. به زبان ساده، اگه Django عادی رو یه "خیابون یکطرفه" فرض کنیم، Channels میاد این خیابون رو دوطرفه میکنه. این یعنی میتونی کارایی مثل:
چت real-time 💬
نوتیفیکیشنهای فوری 🔔
استریم داده (مثل قیمتهای ارز دیجیتال) 📈
و...
رو خیلی راحتتر با Django انجام بدی.
خب پس مشکلش چیه؟ چرا من ازش خوشم نمیاد؟ 🤷♂️
از دور که نگاه میکنی، Channels خیلی جذاب به نظر میاد، ولی وقتی میخوای باهاش کارکنی، مشکلات خودش رو نشون میده:
1⃣ پیچیدگی توی تنظیمات 😵💫
ـDjango همیشه به خاطر سادگی معروف بوده، ولی Channels میاد این سادگی رو خراب میکنه خیلی خراب میکنه. باید ASGI رو راه بندازی، Redis نصب کنی، routing یاد بگیری، و کلی تنظیمات دیگه انجام بدی. یه پروژه ساده که با Django راحت بود، یهو برات میشه یه جنگل از تنظیمات.
نکته: از Django 4.0 به بعد، پشتیبانی از ASGI مستقیم داخل هسته Django اومده، پس برای پروژههای ساده شاید نیاز نباشه کل پروژه رو وابسته به Channels کنی.
2⃣ وابستگی به Redis 🤦♂️
یکی از مشکلات بزرگ Channels اینه که برای مدیریت eventها و ارتباطها حتماً نیاز به Redis داره. خب چرا؟ دلیلش اینه که Redis بهعنوان message broker استفاده میشه تا پیامها بین کلاینتها و سرور مدیریت بشه. ولی اگه پروژه کوچیک باشه، این وابستگی میتونه دردسرساز بشه.
جایگزین: میتونی از RabbitMQ یا حتی راهحلهای سادهتر مثل In-Memory Layers برای پروژههای سبک استفاده کنی.
3⃣ محدودیت توی scale کردن 😩
اگه پروژه کوچیک باشه، Channels بد نیست. ولی وقتی تعداد کاربران زیاد میشه و حجم درخواستها بالا میره، Channels سریع از نفس میافته. این محدودیت بیشتر به خاطر پیچیدگی WebSocket و محدودیتهای سرورهای تک رشته ای هست تا خود Channels. برای پروژههای بزرگ و real-time محور، ابزارای دیگهای مثل Socket.IO یا FastAPI خیلی بهتر عمل میکنن.
4⃣ مشکلات performance 🚨
حتی اگه پروژه خیلی هم بزرگ نباشه، Channels برای real-time پروژههای سنگین خوب عمل نمیکنه. کارای پیچیده async و ارتباطات real-time میتونن سرور رو داغون کنن. البته با تنظیم درست workerها و Redis channel layers میتونی بخشی از این مشکلات رو کم کنی، ولی باز هم کار اضافهست.
5⃣ کمبود مستندات و منابع آموزشی درست و حسابی 📚
یکی دیگه از مشکلات اینه که منابع آموزشی کامل و بهروزی برای Channels خیلی کمه. هر وقت گیر کنی، یا باید بری توی GitHub دنبال issueها، یا دست به دامن دیگران بشی. این باعث میشه زمان زیادی صرف حل مشکلات کنی.
خب حالا راهحل چیه؟ 💡
اگه بخوای real-time کار کنی، اینا میتونن گزینههای بهتری باشن:
ـFastAPI: اگه دنبال سرعت، سادگی و پرفورمنس خوب هستی، FastAPI انتخاب فوقالعادهایه. با WebSocket خیلی راحت کار میکنه و خبری از دردسرای Channels نیست 🚀.
ـSocket.IO: این یکی برای پروژههای real-time شاهکاره. خیلی ابزارای متنوع داره و با Node.js هم عالی مچ میشه.
جمعبندی 🎯
ـDjango Channels میتونه برای پروژههای کوچیک و ساده مناسب باشه، ولی اگه بحث scale، پرفورمنس یا راحتی کار مطرح باشه، اصلاً گزینه خوبی نیست. من از پیچیدگیها و محدودیتهاش خسته شدم و به جای اون سراغ ابزارای دیگه رفتم.
نظر تو چیه؟ Django Channels تا حالا اذیتت کرده یا ازش خوشت میاد؟ بگو ببینم چی تو ذهنت میگذره🧐
#programming #web #django
➖➖➖➖➖➖➖➖➖
🔆 CHANNEL | GROUP
👍25❤1👎1
تا حالا کلی مطالب خفن و کاربردی تو کانال NinjaLearn براتون آماده کردیم و الان صدها مطلب مختلف و جذاب داریم.
این شما و این لیست دستهبندیهای کانال🔻:
هر کدوم از این هشتگها برای یه موضوع خاص طراحی شده تا شما به راحتی بتونید محتوای مورد نظرتون رو پیدا کنید. دیگه لازم نیست کلی تو کانال بگردید 😊
راستی میتونید بنر کانال رو برای دوستاتون هم بفرستید تا اونا هم به جمع ما بپیوندن و از این مطالب مفید استفاده کنن 😉
➖➖➖➖➖➖➖➖➖
از اونجایی که مطالب کانال خیلی متنوع و زیاد شده، تصمیم گرفتیم یه دستهبندی مرتب و منظم برای همهی پستها داشته باشیم تا شما عزیزان راحتتر بتونید محتوای مورد نظرتون رو پیدا کنید
این شما و این لیست دستهبندیهای کانال🔻:
🦫 #go: آموزشها و نکات کاربردی زبان گو
💻 #programming: مطالب برنامه نویسی
🐍 #python: ترفندها و نکات پایتونی
🦄 #django: مطالب فریمورک جنگو
⚡️ #fastapi: مطالب فریم ورک فست
🌐 #web: مطالب مرتبط به وب
📡 #network: مطالب مرتبط به شبکه
🗂️ #db: معرفی و نکات دیتابیس
🔖 #reference: معرفی مقاله و ویدیو
📢 #notif: اطلاع رسانی ها
❓ #question: سوالات جالب در برنامه نویسی
🎊 #event: رویداد هایی که معرفی کردیم
🎬 #movie: معرفی فیلم و سریال
📚 #book: معرفی کتابهای تخصصی
🤖 #AI: مطالب مرتبط به هوش مصنوعی
📊 #ml: مطالب مرتبط به یادگیری ماشین
🛠️ #backend: آموزشها و ترفندهای بکاند
🔒 #security: نکات امنیتی
⚙ #devops: مطالب مرتبط به دواپس
📺 #YouTube: ویدیوهای چنل یوتیوب ما
هر کدوم از این هشتگها برای یه موضوع خاص طراحی شده تا شما به راحتی بتونید محتوای مورد نظرتون رو پیدا کنید. دیگه لازم نیست کلی تو کانال بگردید 😊
اگه موضوع جدیدی به مطالب کانال اضافه بشه، حتماً تو این لیست قرار میگیره ✅
راستی میتونید بنر کانال رو برای دوستاتون هم بفرستید تا اونا هم به جمع ما بپیوندن و از این مطالب مفید استفاده کنن 😉
NinjaLearn Banner 🥷🤝
#category
➖➖➖➖➖➖➖➖➖
🔆 CHANNEL | GROUP
❤22👍1👎1🔥1
Ninja Learn | نینجا لرن
تا حالا کلی مطالب خفن و کاربردی تو کانال NinjaLearn براتون آماده کردیم و الان صدها مطلب مختلف و جذاب داریم. از اونجایی که مطالب کانال خیلی متنوع و زیاد شده، تصمیم گرفتیم یه دستهبندی مرتب و منظم برای همهی پستها داشته باشیم تا شما عزیزان راحتتر بتونید محتوای…
دوستانیم که تازه تشریف اوردید کانال (خیلی خوش اومدید ❤️)
حتما این دسته بندی کانال رو مطالعه کنید که از مطالب قبلی کانال استفاده ببرید 😉
حتما این دسته بندی کانال رو مطالعه کنید که از مطالب قبلی کانال استفاده ببرید 😉
Telegram
Ninja Learn | نینجا لرن
تا حالا کلی مطالب خفن و کاربردی تو کانال NinjaLearn براتون آماده کردیم و الان صدها مطلب مختلف و جذاب داریم.
از اونجایی که مطالب کانال خیلی متنوع و زیاد شده، تصمیم گرفتیم یه دستهبندی مرتب و منظم برای همهی پستها داشته باشیم تا شما عزیزان راحتتر بتونید…
از اونجایی که مطالب کانال خیلی متنوع و زیاد شده، تصمیم گرفتیم یه دستهبندی مرتب و منظم برای همهی پستها داشته باشیم تا شما عزیزان راحتتر بتونید…
❤8
جنگو کنده، پس نباید استفاده کنیم؟ 🙂↔️
یکی از بحثهای همیشگی توی گروه های جنگو اینه که "جنگو کنده، پس بریم سمت FastAPI یا Go یا ...". این حرفو زیاد شنیدم، خودمم یه زمانی فکر میکردم سرعت، همهچیزه ولی بیاین یه بار منطقی بررسی کنیم، بدون تعصب.
چرا میگن جنگو کنده؟
خب راستشو بخواین، جنگو واقعا کنده (نسبت به فریمورکهای async بیس مثل FastAPI و زبانهای کامپایلری مثل Go که توی I/O bound حرف اولو میزنن). ولی چرا؟
جنگو سینکروسه 🥸
جنگو از اساس برای وباپلیکیشنهای سنتی طراحی شده(طبیعیم هست چون ۲۰ سال پیش ساخته شد اون موقع مفهومی به اسم async به این صورت نبود).
ولی فریمورکهایی مثل FastAPI میتونن همزمان چند درخواست رو مدیریت کنن (به لطف async).
Overhead بالای ORM 🏋️♂️
ORM جنگو سنگینه. هر کوئری که میزنی، کلی پردازش اضافه انجام میده تا کارتو راحت کنه، ولی همین باعث میشه کندتر از ORMهای سبکتر باشه.
Middleware و Request Cycle پیچیدهتره 🌀
جنگو یه سری پردازشهای اضافه برای هر درخواست انجام میده (مانند middleware ها، سیگنالها، template rendering و ...)، که باعث میشه به طور طبیعی کمی کندتر باشه.
پس چرا بازم از جنگو استفاده کنیم؟
حالا که جنگو کنده، یعنی نباید سمتش بریم؟ نه بابا بذار تجربه خودمو بگم.
1⃣ سرعت، همیشه مهمترین فاکتور نیست
اکثر پروژهها، گلوگاه سرعت، فریمورک نیست، بلکه دیتابیس، شبکه، و لاجیکهای بیزینسی هستن. یه اپلیکیشن CRUD ساده که روزی ۱۰۰۰ تا درخواست داره، با FastAPI یا جنگو، تفاوت محسوسی نداره.
2⃣ توسعه سریعتر = زمان و پول بیشتر
جنگو کلی چیز آماده داره. سیستم مدیریت کاربر، فرمها، ORM، ادمین پنل، و کلی ماژول دیگه. این یعنی تو به جای ساختن همهچی از صفر، فقط تمرکزت روی بیزینس لاجیکه. توسعه سریعتر = هزینه کمتر.
3⃣ امنیت، یکپارچگی، و قابلیت اطمینان
جنگو به طور پیشفرض مقاوم در برابر حملات XSS، CSRF، SQL Injection و غیرهست. ولی FastAPI؟ باید خودت امنیت رو درست کنی و Middleware بنویسی، که اگه اشتباه کنی، فاجعه میشه
کی بریم سمت FastAPI یا Go یا هرچیز سریع؟
1⃣ وقتی واقعا به Async نیاز داری
اگه داری یه چتاپ، وبساکت، یا یه سیستم پردازش سنگین با درخواستهای همزمان بالا مینویسی، FastAPI و Go گزینههای بهتری هستن.
2⃣ وقتی هر میلیثانیه مهمه
توی سرویسهای real-time مثل سیستمهای تریدینگ، گیمینگ، یا پردازش داده سنگین، Go و Rust گزینههای بهتری هستن، چون کامپایل میشن و خیلی سریعتر از پایتون اجرا میشن.
پس چی کار کنیم؟
سرعت، همه چیز نیست، بلکه بستگی داره که چه چیزی برات مهمتره و نیاز داری بهش
➖➖➖➖➖➖➖➖➖
یکی از بحثهای همیشگی توی گروه های جنگو اینه که "جنگو کنده، پس بریم سمت FastAPI یا Go یا ...". این حرفو زیاد شنیدم، خودمم یه زمانی فکر میکردم سرعت، همهچیزه ولی بیاین یه بار منطقی بررسی کنیم، بدون تعصب.
چرا میگن جنگو کنده؟
خب راستشو بخواین، جنگو واقعا کنده (نسبت به فریمورکهای async بیس مثل FastAPI و زبانهای کامپایلری مثل Go که توی I/O bound حرف اولو میزنن). ولی چرا؟
جنگو سینکروسه 🥸
جنگو از اساس برای وباپلیکیشنهای سنتی طراحی شده(طبیعیم هست چون ۲۰ سال پیش ساخته شد اون موقع مفهومی به اسم async به این صورت نبود).
ولی فریمورکهایی مثل FastAPI میتونن همزمان چند درخواست رو مدیریت کنن (به لطف async).
Overhead بالای ORM 🏋️♂️
ORM جنگو سنگینه. هر کوئری که میزنی، کلی پردازش اضافه انجام میده تا کارتو راحت کنه، ولی همین باعث میشه کندتر از ORMهای سبکتر باشه.
Middleware و Request Cycle پیچیدهتره 🌀
جنگو یه سری پردازشهای اضافه برای هر درخواست انجام میده (مانند middleware ها، سیگنالها، template rendering و ...)، که باعث میشه به طور طبیعی کمی کندتر باشه.
پس چرا بازم از جنگو استفاده کنیم؟
حالا که جنگو کنده، یعنی نباید سمتش بریم؟ نه بابا بذار تجربه خودمو بگم.
1⃣ سرعت، همیشه مهمترین فاکتور نیست
اکثر پروژهها، گلوگاه سرعت، فریمورک نیست، بلکه دیتابیس، شبکه، و لاجیکهای بیزینسی هستن. یه اپلیکیشن CRUD ساده که روزی ۱۰۰۰ تا درخواست داره، با FastAPI یا جنگو، تفاوت محسوسی نداره.
2⃣ توسعه سریعتر = زمان و پول بیشتر
جنگو کلی چیز آماده داره. سیستم مدیریت کاربر، فرمها، ORM، ادمین پنل، و کلی ماژول دیگه. این یعنی تو به جای ساختن همهچی از صفر، فقط تمرکزت روی بیزینس لاجیکه. توسعه سریعتر = هزینه کمتر.
3⃣ امنیت، یکپارچگی، و قابلیت اطمینان
جنگو به طور پیشفرض مقاوم در برابر حملات XSS، CSRF، SQL Injection و غیرهست. ولی FastAPI؟ باید خودت امنیت رو درست کنی و Middleware بنویسی، که اگه اشتباه کنی، فاجعه میشه
کی بریم سمت FastAPI یا Go یا هرچیز سریع؟
1⃣ وقتی واقعا به Async نیاز داری
اگه داری یه چتاپ، وبساکت، یا یه سیستم پردازش سنگین با درخواستهای همزمان بالا مینویسی، FastAPI و Go گزینههای بهتری هستن.
2⃣ وقتی هر میلیثانیه مهمه
توی سرویسهای real-time مثل سیستمهای تریدینگ، گیمینگ، یا پردازش داده سنگین، Go و Rust گزینههای بهتری هستن، چون کامپایل میشن و خیلی سریعتر از پایتون اجرا میشن.
پس چی کار کنیم؟
اگه سرعت برات مهمه: Go بزن Java بزن یا ...
اگه یه API سبک و سریع لازم داری: FastAPI بزن
اگه میخوای سریع یه اپلیکیشن کامل و امن بالا بیاری: Django بهترین گزینهست
سرعت، همه چیز نیست، بلکه بستگی داره که چه چیزی برات مهمتره و نیاز داری بهش
خوشحال میشم نظرتون رو بشنوم
تو کامنتای همین پست بگید 👇
#️⃣ #programming #django #backend
➖➖➖➖➖➖➖➖➖
🥷 CHANNEL | GROUP
👍32❤4
چرا نباید لاجیک پروژه رو تو سریالایزرهای DRF پیادهسازی کنیم؟ 🚫
یه موضوع مهم هست که چرا نباید لاجیک پروژهمون رو تو سریالایزرها پیادهسازی کنیم؟ خیلی از افرادی که میشناسم متاسفانه اینکارو میکنن (پیاده سازی لاجیک توی سریالایزر ها) اگه شماهم حزو این دسته افراد هستید این پست براتون مناسبه
اول از همه سریالایزر تو DRF چیه؟
سریالایزرها تو DRF مسئول تبدیل دادهها بین فرمتهای مختلف (مثل JSON و مدلهای Django) هستن. کارشون اینه که دادهها رو بگیرن، اعتبارسنجی (validation) کنن و به شکل مناسب تحویل بدن. مثلاً یه مدل
🚫 چرا این کار بده؟
بعضیها عادت دارن تو متدهای سریالایزر (مثل
1⃣ نقض اصل Single Responsibility:
سریالایزرها برای تبدیل و اعتبارسنجی دادهها طراحی شدن، نه برای مدیریت لاجیک پروژه.
وقتی لاجیک رو اونجا مینویسین، کدتون از یه سریالایزر ساده تبدیل میشه به سریالایزر خیلی گنده که بعداً نگهداریش سخت میشه.
2⃣ کاهش Readability و Testability:
اگه لاجیک تو سریالایزر باشه، پیدا کردنش تو پروژه سختتره و تست کردنش هم پیچیده میشه. مثلاً برای تست یه محاسبه، باید کل سریالایزر رو تست کنین، نه فقط اون لاجیک خاص.
3⃣ مشکلات Scalability:
تو پروژههای بزرگ، وقتی لاجیکها تو سریالایزرها پخش بشن، دیگه نمیتونین به راحتی تغییرشون بدین یا جابهجاشون کنین. یه تغییر کوچیک تو لاجیک ممکنه کل API رو به هم بریزه.
4⃣ وابستگی بیش از حد:
سریالایزرها به مدلها و دادهها وابسته ان. اگه لاجیک پروژه رو اونجا بذارین، هر تغییری تو مدلها یا ساختار دادهها میتونه لاجیکتون رو خراب کنه.
5⃣ سخت شدن دیباگ:
وقتی یه باگ پیش میاد، نمیدونین مشکل از تبدیل دادهست یا از لاجیک پروژه، چون همهچیز قاطی شده.
سخن اخر 🗣
پیادهسازی لاجیک پروژه تو سریالایزرهای DRF مثل اینه که بخوای با چاقو سوپ بخوری؛ میشه، ولی چرا؟! سریالایزرها برای تبدیل و اعتبارسنجی دادهها طراحی شدن، نه برای نگه داشتن لاجیک پیچیده. با انتقال لاجیک به مدلها یا سرویسها، کدتون تمیزتر، قابلنگهداریتر و حرفهایتر میشه. دفعه بعد که خواستین تو سریالایزر لاجیک بنویسین، یه لحظه وایسید و بگین: اینجا جای این کارا نیست 😊
➖➖➖➖➖➖➖➖➖
یه موضوع مهم هست که چرا نباید لاجیک پروژهمون رو تو سریالایزرها پیادهسازی کنیم؟ خیلی از افرادی که میشناسم متاسفانه اینکارو میکنن (پیاده سازی لاجیک توی سریالایزر ها) اگه شماهم حزو این دسته افراد هستید این پست براتون مناسبه
اول از همه سریالایزر تو DRF چیه؟
سریالایزرها تو DRF مسئول تبدیل دادهها بین فرمتهای مختلف (مثل JSON و مدلهای Django) هستن. کارشون اینه که دادهها رو بگیرن، اعتبارسنجی (validation) کنن و به شکل مناسب تحویل بدن. مثلاً یه مدل
User
رو به JSON تبدیل میکنن یا برعکس. تا اینجا همهچیز اوکیه، ولی مشکل از جایی شروع میشه که بخوایم لاجیک اصلی پروژه رو تو همین سریالایزرها پیاده سازی کنیم.🚫 چرا این کار بده؟
بعضیها عادت دارن تو متدهای سریالایزر (مثل
to_representation
یا validate
) لاجیکهای پیچیده بنویسن، مثلاً محاسبات، فیلتر کردن دادهها یا حتی آپدیت دیتابیس. اما این کارا چندتا مشکل بزرگ به وجود میاره1⃣ نقض اصل Single Responsibility:
سریالایزرها برای تبدیل و اعتبارسنجی دادهها طراحی شدن، نه برای مدیریت لاجیک پروژه.
وقتی لاجیک رو اونجا مینویسین، کدتون از یه سریالایزر ساده تبدیل میشه به سریالایزر خیلی گنده که بعداً نگهداریش سخت میشه.
2⃣ کاهش Readability و Testability:
اگه لاجیک تو سریالایزر باشه، پیدا کردنش تو پروژه سختتره و تست کردنش هم پیچیده میشه. مثلاً برای تست یه محاسبه، باید کل سریالایزر رو تست کنین، نه فقط اون لاجیک خاص.
3⃣ مشکلات Scalability:
تو پروژههای بزرگ، وقتی لاجیکها تو سریالایزرها پخش بشن، دیگه نمیتونین به راحتی تغییرشون بدین یا جابهجاشون کنین. یه تغییر کوچیک تو لاجیک ممکنه کل API رو به هم بریزه.
4⃣ وابستگی بیش از حد:
سریالایزرها به مدلها و دادهها وابسته ان. اگه لاجیک پروژه رو اونجا بذارین، هر تغییری تو مدلها یا ساختار دادهها میتونه لاجیکتون رو خراب کنه.
5⃣ سخت شدن دیباگ:
وقتی یه باگ پیش میاد، نمیدونین مشکل از تبدیل دادهست یا از لاجیک پروژه، چون همهچیز قاطی شده.
سخن اخر 🗣
پیادهسازی لاجیک پروژه تو سریالایزرهای DRF مثل اینه که بخوای با چاقو سوپ بخوری؛ میشه، ولی چرا؟! سریالایزرها برای تبدیل و اعتبارسنجی دادهها طراحی شدن، نه برای نگه داشتن لاجیک پیچیده. با انتقال لاجیک به مدلها یا سرویسها، کدتون تمیزتر، قابلنگهداریتر و حرفهایتر میشه. دفعه بعد که خواستین تو سریالایزر لاجیک بنویسین، یه لحظه وایسید و بگین: اینجا جای این کارا نیست 😊
#️⃣ #backend #drf #django #api
➖➖➖➖➖➖➖➖➖
🥷 CHANNEL | GROUP
👍20❤3
خب خب آپدیت جدید جنگو اینجاست، ببینیم چه تغییراتی داشته🔥🛠
چند روز پیش (۲ آوریل) آپدیت جدید جنگو با ورژن ۵.۲ منتشر شد. این نسخه LTS هست و تا آوریل ۲۰۲۸ پشتیبانی میشه. توی این نسخه تغییرات بیشتر مربوط به زیرساخت هایی مثل دیتابیس و shell جنگو بودن. بریم بررسیشون کنیم.
1️⃣ ایمپورت خودکار مدل ها توی shell
از این نسخه به بعد وقتی وارد shell جنگو میشین مدل هاتون به صورت خودکار ایمپورت میشن. این ویژگی بهتون کمک میکنه که زمان کمتری برای ایمپورت کردن بزارین و باعث صرفه جویی در زمان میشه.
2️⃣ پشتیبانی از کلید اصلی مرکب(Composite Primary Key)
با اضافه شدن
3️⃣ ساده تر شدن شخصی سازی BoundField
توی این نسخه میتونید کلاس
4️⃣ فیلتر های Facet توی پنل ادمین
توی پنل ادمین جنگو، با فعالسازی ویژگی
5️⃣ فیلد های تولید شده(Generated Fields)
با معرفی
6️⃣ مقادیر پیش فرض در سطح دیتابیس
با استفاده از پارامتر
⏺️ با استفاده از لینک زیر میتونید اطلاعات بیشتری درمورد این آپدیت کسب کنید⚡️
Django 5.2 release notes
➖➖➖➖➖➖➖➖➖➖
چند روز پیش (۲ آوریل) آپدیت جدید جنگو با ورژن ۵.۲ منتشر شد. این نسخه LTS هست و تا آوریل ۲۰۲۸ پشتیبانی میشه. توی این نسخه تغییرات بیشتر مربوط به زیرساخت هایی مثل دیتابیس و shell جنگو بودن. بریم بررسیشون کنیم.
1️⃣ ایمپورت خودکار مدل ها توی shell
از این نسخه به بعد وقتی وارد shell جنگو میشین مدل هاتون به صورت خودکار ایمپورت میشن. این ویژگی بهتون کمک میکنه که زمان کمتری برای ایمپورت کردن بزارین و باعث صرفه جویی در زمان میشه.
2️⃣ پشتیبانی از کلید اصلی مرکب(Composite Primary Key)
با اضافه شدن
CompositePrimaryKey
، میتونین چند فیلد رو به عنوان کلید اصلی مشخص کنید. قبلا این کار نیاز به تنظیمات دستی توی سطح دیتابیس داشت اما الان به صورت رسمی پشتیبانی میشه و مدیریتش ساده تره.3️⃣ ساده تر شدن شخصی سازی BoundField
توی این نسخه میتونید کلاس
BoundField
رو به راحتی توی سطح پروژه یا فرم شخصی سازی کنید. با ایجاد یک کلاس که از BoundField
ارث بری میکنه و اعمال تغییرات مورد نظر میتونید اون رو به فیلد های فرم هاتون اختصاص بدین.BoundField همون چیزیه که وقتی توی قالب مینویسید form.name، پشت صحنه وظیفه داره اون فیلد رو به HTML تبدیل کنه، مقدارش رو بذاره، ارورهاش رو نشون بده و...
یجورایی رابط بین فرم و فیلد واقعی توی قالبه.
4️⃣ فیلتر های Facet توی پنل ادمین
توی پنل ادمین جنگو، با فعالسازی ویژگی
ModelAdmin.show_facets
، میتونید تعداد آیتم های توی هر فیلتر رو ببینید. این قابلیت باعث میشه اطلاعات پنل ادمین رو راحت تر مدیریت کنید.5️⃣ فیلد های تولید شده(Generated Fields)
با معرفی
GeneratedFields
، میتونید فیلد هایی تعریف کنید که مقدارشون بر اساس مقدار سایر فیلد های مدل محاسبه و ثبت میشه. این ویژگی بهتون این امکان رو میده که ستون های محاسبه شده توی دیتابیس قرار بدین.6️⃣ مقادیر پیش فرض در سطح دیتابیس
با استفاده از پارامتر
db_default
توی فیلد های مدل، مقادیر پیش فرض مستقیما توسط دیتابیس اعمال میشن. این ویژگی باعث بهبود عملکرد و سازگاری بیشتر با دیتابیس های مختلف میشه.⏺️ با استفاده از لینک زیر میتونید اطلاعات بیشتری درمورد این آپدیت کسب کنید⚡️
Django 5.2 release notes
#django #backend #python
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
❤16👍3
خب خب خب، کامند inspectdb توی جنگو⚙️
احتمالا به این فکر کردین که چطوری میشه از جدول های یه دیتابیس آماده توی جنگو استفاده کرد. راه حلش این ابزاره.
inspectdb چیه؟
با استفاده از inspectdb، جنگو میتونه ساختار جدول های دیتابیس رو بررسی کنه و یه فایل مدل جنگو(مثل
➕ شما حتی میتونید فقط یه جدول رو بررسی و تبدیل کنید:
این ابزار میتونه توی این مواقع کمکتون کنه:
1️⃣ وقتی روی یه دیتابیس قدیمی یا پروژه ی legacy کار میکنید.
2️⃣ موقع مهاجرت از یه سیستم دیگه به جنگو.
3️⃣ وقتی میخوان بدون نوشتن کلی کد دستی با یه دیتابیس خارجی کار کنید.
نکته مهم⚠️:
کدی که این ابزار تولید میکنه همیشه تمیز و ایدهآل نیست. بهتره بعد از ساخت، مدلها رو یه دور بازبینی و شخصیسازی کنید. جنگو خودش هم توی فایل تولید شده این هشدار رو مینویسه.
⏺️ برای اطلاعات بیشتر میتونید به داکیومنت جنگو مراجعه کنید:
inspectdb در جنگو
➖➖➖➖➖➖➖➖➖➖
احتمالا به این فکر کردین که چطوری میشه از جدول های یه دیتابیس آماده توی جنگو استفاده کرد. راه حلش این ابزاره.
inspectdb چیه؟
با استفاده از inspectdb، جنگو میتونه ساختار جدول های دیتابیس رو بررسی کنه و یه فایل مدل جنگو(مثل
model.py
) تولید کنه و توی خروجی نمایش بده. این یعنی دیگه نیاز نیست برای دیتبایس قدیمیتون دستی مدل بنویسید، جنگو اینکارو هم خودش انجام میده.python manage.py inspectdb > models.py
➕ شما حتی میتونید فقط یه جدول رو بررسی و تبدیل کنید:
python manage.py inspectdb my_table > models.py
این ابزار میتونه توی این مواقع کمکتون کنه:
1️⃣ وقتی روی یه دیتابیس قدیمی یا پروژه ی legacy کار میکنید.
2️⃣ موقع مهاجرت از یه سیستم دیگه به جنگو.
3️⃣ وقتی میخوان بدون نوشتن کلی کد دستی با یه دیتابیس خارجی کار کنید.
نکته مهم⚠️:
کدی که این ابزار تولید میکنه همیشه تمیز و ایدهآل نیست. بهتره بعد از ساخت، مدلها رو یه دور بازبینی و شخصیسازی کنید. جنگو خودش هم توی فایل تولید شده این هشدار رو مینویسه.
⏺️ برای اطلاعات بیشتر میتونید به داکیومنت جنگو مراجعه کنید:
inspectdb در جنگو
#⃣ #django #python #db
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
👍15