Ninja Learn | نینجا لرن
1.26K subscribers
96 photos
36 videos
11 files
307 links
یادگیری برنامه نویسی به سبک نینجا 🥷
اینجا چیزایی یاد میگیری که فقط نینجاهای وب‌ بلدن 🤫

📄 Send me post: https://t.me/NoronChat_bot?start=sec-fdggghgebe

👥 ɢʀᴏᴜᴘ: https://t.me/+td1EcO_YfSphNTlk
Download Telegram
💎 ساخت کامندهای کاستوم توی جنگو 💎

امروز می‌خوام یه موضوع خفن از جنگو رو بهتون توضیح بدم، اینکه چجوری می‌تونیم کامندهای کاستوم توی جنگو بسازیم. 😎

احتمالاً تا حالا با کامندهای پیش‌فرض جنگو مثل 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


@ninja_learn_ir
👍93🔥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 فوق‌العاده ساده‌ست. با یه دستور می‌تونی نصبش کنی:

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

@ninja_learn_ir
👍62
💎 پکیج Django Cleanup مدیریت خودکار فایل‌های اضافی 💎

امروز می‌خوام در مورد یه کتابخونه خیلی کاربردی به اسم 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


@ninja_learn_ir
👍112🔥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 رو نصب کنی. اگه از اوبونتو استفاده می‌کنی، این دستور رو بزن:

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


@ninja_learn_ir
👍63🔥3
💎 استفاده از PostgreSQL با Django 💎

امروز می‌خوایم درباره PostgreSQL و اینکه چرا این دیتابیس رابطه‌ای با Django فوق‌العاده مچ میشه، صحبت کنیم. همچنین چندتا از فیچرهای خاصی که جنگو برای این دیتابیس داره رو معرفی می‌کنیم

چرا PostgreSQL؟ 🤔
خب PostgreSQL یه دیتابیس رابطه‌ای قدرتمنده که خیلی‌ها بهش میگن "Postgres". این دیتابیس اوپن سورس، خیلی خوب با Django هماهنگ میشه و خیلی امکانات و قابلیت‌های پیشرفته‌ای رو ارائه میده که وقتی با جنگو کار می‌کنی حسابی به درد می‌خوره. از جمله پشتیبانی از JSONB، قفل‌های پیچیده، پارتیشن‌بندی داده‌ها و ... 😍

چطوری از PostgreSQL توی Django استفاده کنیم؟ 🛠️

1⃣ اول از همه، باید مطمئن شی که PostgreSQL رو نصب داری.

2⃣ بعدش توی پروژه جنگویی، توی فایل settings.py باید دیتابیس رو به Postgres وصل کنی. یه همچین چیزی:
  
  
   DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.postgresql',
           'NAME': 'your_db_name',
           'USER': 'your_db_user',
           'PASSWORD': 'your_db_password',
           'HOST': 'localhost',
           'PORT': '5432',
       }
   }
  
حالا می‌تونی از قابلیت‌های خفن Postgres استفاده کنی و دیتابیس پروژه‌ت رو به یه سطح بالاتر ببری! 🚀

فیچرهای خاص 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 ArrayField
   from django.db import models

   class MyModel(models.Model):
       tags = ArrayField(models.CharField(max_length=100), blank=True)
3⃣ فیلد HStore 🗂️ 
خب HStore یه قابلیت خاص توی Postgresه که بهت اجازه میده داده‌های کلید-مقدار (key-value) رو توی دیتابیس ذخیره کنی. Django از این فیلد پشتیبانی می‌کنه و باهاش می‌تونی داده‌هایی شبیه به دیکشنری رو ذخیره کنی.

 
   from django.contrib.postgres.fields import HStoreField
   from django.db import models

   class MyModel(models.Model):
       attributes = HStoreField()
  
4⃣ فیلد Range 📏 
   این فیلد بهت اجازه میده که رِنج‌ها رو توی دیتابیس ذخیره کنی. مثلاً می‌خوای یه بازه تاریخی یا عددی رو نگه‌داری، این فیلد دقیقاً به درد همون کار می‌خوره.

  
   from django.contrib.postgres.fields import DateRangeField
   from django.db import models

   class MyModel(models.Model):
       date_range = DateRangeField()
  
5⃣ و در اخر Full-Text Search 🔍 
خب 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


@ninja_learn_ir
🔥125
💎 معرفی فریم‌ورک Locust 💎

امروز می‌خوام یه فریم‌ورک خفن برای تست بار بهتون معرفی کنم: 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


@ninja_learn_ir
🔥10👍53
💎 عملیات‌های 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:
می‌تونی از async و await استفاده کنی تا درخواست‌ها به صورت غیر همزمان انجام بشن و سرعت اپلیکیشن بالا بره.

- برای CPU Bound:
می‌تونی از ماژول concurrent.futures و ProcessPoolExecutor استفاده کنی تا کارهای سنگین رو در چند پروسه اجرا کنی.

جمع‌بندی 🎯
درک تفاوت‌های بین IO Bound و CPU Bound می‌تونه بهت کمک کنه تا اپلیکیشن‌های جنگو رو بهتر بهینه‌سازی کنی. اگه عملیات‌های IO Bound داری، از async استفاده کن و اگر CPU Bound هستن، برو سراغ multiprocessing.

امید وارم مفید بوده باشه :)

#iobound #cpubound #python #django


@ninja_learn_ir
73👍3
💎 معرفی پکیج honeypot 💎

امروز می‌خوام درباره یه پکیج خفن برای جنگو به اسم 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



@ninja_learn_ir
👍122🔥1👏1
💎 معرفی GraphQL و استفاده ازش 💎

اگه تا حالا اسم GraphQL به گوشتون خورده ولی نمی‌دونستید دقیقاً چیه و چه کاربردی داره، امروز قراره باهم برسیش کنیم و بفهمیم چرا این روزها انقدر محبوب شده🌟

حالا GraphQL چیه؟ 🤔

خب GraphQL یه زبان کوئری برای API هاست که توسط فیسبوک توی سال ۲۰۱۵ معرفی شد. این تکنولوژی به شما اجازه می‌ده که دقیقاً همون داده‌هایی که نیاز دارین رو از سرور درخواست کنین. مهم‌ترین ویژگی GraphQL اینه که به جای دریافت یه ساختار ثابت از اطلاعات، می‌تونین مشخص کنین چه داده‌هایی رو دقیقاً می‌خواین و چه داده‌هایی رو نمی‌خواین.

به زبان ساده، GraphQL به شما کنترل بیشتری روی داده‌هایی که از API می‌گیرین می‌ده. 🌍

چرا از GraphQL استفاده کنیم؟ 🤷‍♂️

1⃣ دریافت داده‌های دقیق 🎯
یکی از بزرگ‌ترین مشکلاتی که معماری‌های سنتی API دارن اینه که گاهی داده‌هایی که لازم نداریم رو هم به ما برمی‌گردونن. GraphQL این مشکل رو حل کرده. شما توی GraphQL می‌تونین کاملاً مشخص کنین که چه فیلدهایی از داده‌ها رو نیاز دارین و فقط همون‌ها رو از سرور بگیرین.
مثال: فرض کنین می‌خواین فقط اسم و ایمیل کاربر رو از API بگیرین. کوئری GraphQL می‌تونه این‌طوری باشه:

{
user(id: 1) {
name
email
}
}

و پاسخ هم دقیقاً همون چیزی خواهد بود که درخواست کردین:

{
"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


@ninja_learn_ir
🔥16👍32
استفاده از 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 رو امتحان کنین. هم از کار باهاش لذت می‌برید، هم پروژه‌تون ساختارمندتر و حرفه‌ای‌تر می‌شه. 👌

امید وارم مفید بوده باشه :)

#cms #django #python


🔆 CHANNEL | GROUP
🔥94
الستیک سرچ در جنگو

اگه یه سیستم داری که نیاز داره روی دیتا جستجوهای سریع و پیشرفته انجام بشه، الستیک سرچ (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
117👍4
🧵 ـ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
👍116
خب خب خب 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
👍251👎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
جنگو کنده، پس نباید استفاده کنیم؟ 🙂‍↔️

یکی از بحث‌های همیشگی توی گروه های جنگو اینه که "جنگو کنده، پس بریم سمت 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
👍324
چرا نباید لاجیک پروژه رو تو سریالایزرهای 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
👍203
خب خب آپدیت جدید جنگو اینجاست، ببینیم چه تغییراتی داشته🔥🛠
چند روز پیش (۲ آوریل) آپدیت جدید جنگو با ورژن ۵.۲ منتشر شد. این نسخه 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، جنگو میتونه ساختار جدول های دیتابیس رو بررسی کنه و یه فایل مدل جنگو(مثل 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