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

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

👥 ɢʀᴏᴜᴘ: https://t.iss.one/+td1EcO_YfSphNTlk
Download Telegram
#پست_جدید

💎 سیگنال‌ها در جنگو 💎

امروز میخوایم در مورد یکی از ابزارهای جذاب و کاربردی جنگو به اسم سیگنال‌ها (signals) صحبت کنیم.
سیگنال‌ها مثل یه جور اعلان یا نوتیفیکیشن هستن که وقتی اتفاق خاصی توی پروژه شما میفته، ارسال میشن.
مثلا وقتی یه کاربر جدید ثبت‌نام می‌کنه، یه داده جدید اضافه میشه یا یه مدل حذف میشه، سیگنالی ارسال میشه.

سیگنال‌ها چه شکلی هستن؟

سیگنال‌ها به چند دسته کلی تقسیم میشن:

1️⃣ سیگنال‌های مدل: این سیگنال‌ها به تغییرات در مدل‌های شما مربوط میشن. مثلا وقتی یه رکورد جدید اضافه میشه، تغییر می‌کنه یا حذف میشه، سیگنالی ارسال میشه.

2️⃣ سیگنال‌های مدیریت: این سیگنال‌ها به عملیات مدیریت پایگاه داده مربوط میشن. مثلا وقتی شما دستور migrate رو اجرا می‌کنید، سیگنالی ارسال میشه.

3️⃣ سیگنال‌های درخواست/پاسخ: این سیگنال‌ها به درخواست‌ها و پاسخ‌های HTTP مربوط میشن. مثلا وقتی یه درخواست به سرور شما ارسال میشه یا پاسخ داده میشه، سیگنالی ارسال میشه.

4️⃣ سیگنال‌های تست: این سیگنال‌ها به اجرای تست‌های شما مربوط میشن.

5️⃣ سیگنال‌های دیتابیس: این سیگنال‌ها به اتصال به دیتابیس مربوط میشن.

6️⃣ سیگنال‌های اپ احراز هویت: این سیگنال‌ها به عملیات مربوط به احراز هویت کاربران مربوط میشن.


🔬 مثال‌های عملی از سیگنال‌ها:

1️⃣ مثال 1: ارسال ایمیل خوشامدگویی پس از ثبت‌نام کاربر

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.mail import send_mail  


from .models import User

@receiver(post_save, sender=User)
def send_welcome_email(sender, instance, created, **kwargs):
    if created:  

        send_mail(
            'خوش آمدید!',
            'از ثبت‌نام شما در سایت ما متشکریم.',
            '[email protected]',
            [instance.email],
            fail_silently=False,
        )


در این مثال، هر وقت یک کاربر جدید ثبت‌نام میشه، سیگنال post_save برای مدل User ارسال میشه و تابع send_welcome_email اجرا میشه و یک ایمیل خوشامدگویی برای کاربر جدید ارسال می‌شود.


2️⃣ مثال 2: ایجاد پروفایل کاربری به صورت خودکار
from django.db.models.signals import post_save
from django.dispatch import receiver

from .models import User, Profile

@receiver(post_save, sender=User)
def create_profile(sender,  
instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

در این مثال، هر وقت یک کاربر جدید ثبت‌نام می‌شود، به طور خودکار یک پروفایل برای او ایجاد می‌شود.


3️⃣ مثال 3: بروزرسانی یک فیلد پس از تغییر فیلد دیگر
from django.db.models.signals import pre_save
from django.dispatch import receiver

from .models import MyModel

@receiver(pre_save, sender=MyModel)
def update_last_activity(sender, instance, **kwargs):
    if instance.is_active:
        instance.last_activity = datetime.now()


در این مثال، هر وقت فیلد is_active یک مدل تغییر کرد، فیلد last_activity هم به روز میشه.


مزایای استفاده از سیگنال‌ها:

کاهش کد تکراری: با استفاده از سیگنال‌ها، نیازی نیست کدهای تکراری رو در جاهای مختلف پروژه بنویسید.

📄 افزایش خوانایی کد: استفاده از سیگنال‌ها باعث میشه کد شما تمیزتر و خواناتر بشه.

🔺سهولت در توسعه: سیگنال‌ها به شما کمک می‌کنن تا برنامه‌های پیچیده‌تری رو توسعه بدید.


معایب استفاده از سیگنال‌ها:

😖 پیچیدگی: استفاده نادرست از سیگنال‌ها می‌تونه باعث پیچیدگی بیش از حد کد بشه.

🔋 کاهش سرعت: در بعضی موارد، استفاده از سیگنال‌ها می‌تونه سرعت اجرای برنامه رو کاهش بده.

نکات مهم:
از سیگنال‌ها با احتیاط استفاده کنید و از ایجاد حلقه‌های بی‌نهایت خودداری کنید.
سیگنال‌ها رو برای کارهای ساده و تکراری استفاده کنید.
برای کارهای پیچیده بهتره از ابزارهای دیگری مثل Celery استفاده کنید.

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

#سیگنال #signals #django #backend
👍103🥴1
🔬 مثال واقعی
فرض کنین می‌خواین به سایت amazon.com برین:

1️⃣مرورگر شما اول به سرور DNS مراجعه می‌کنه.

2️⃣سرور DNS بررسی می‌کنه که amazon.com رو به کدوم آدرس IP باید متصل کنه.

3️⃣آدرس IP رو به مرورگر برمی‌گردونه.

4️⃣مرورگر شما به اون آدرس IP متصل میشه و سایت آمازون رو لود می‌کنه.

حالا تصور کنین که این فرآیند قراره هزاران بار در روز تکرار بشه.
اگه DNS وجود نداشت، باید هر بار یه سری عدد طولانی رو به خاطر می‌سپردین تا به سایت مورد نظر برسین 🙄

جمع‌بندی
فهمیدیم DNS واقعاً مثل یه جادو عمل می‌کنه که کاربرها بدون اینکه نیازی به حفظ کردن آدرس‌های پیچیده داشته باشن، می‌تونن به راحتی به سایت‌ها دسترسی پیدا کنن. این سیستم پیچیده با یه سری قوانین و پروتکل‌های خاص کار می‌کنه که باعث میشه وب به شکلی که ما می‌شناسیم، وجود داشته باشه.

امیدوارم این توضیحات کامل‌ بوده باشه و تونسته باشم مفهوم DNS رو براتون روشن کنم. اگه هنوز سوالی دارین یا چیزی براتون مبهمه، حتماً بپرسین 😄

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

#DNS #web #backend


@ninja_learn_ir
15😁1
💎 احرازهویت Authentication در جنگو 💎

امروز می‌خوام در مورد یکی از مهم‌ترین مباحث دنیای وب، یعنی Authentication یا همون احراز هویت در جنگو (Django) صحبت کنم. 🛡️ اگر توسعه‌دهنده وب هستیدقطعا می‌دونید که چقدر این موضوع مهمه! پس بیاید بدون معطلی بریم سر اصل مطلب! 🚀

1⃣ احراز هویت ساده (Simple Authentication) 🆔
این ساده‌ترین نوع احراز هویت توی جنگوئه. به طور پیش‌فرض جنگو یک سیستم احراز هویت داخلی داره که کاربرا رو با استفاده از نام کاربری و رمز عبور وارد سیستم می‌کنه. این روش بیشتر برای پروژه‌های کوچیک و ساده مناسبه.

چطوری پیاده‌سازیش کنیم؟ 🤔
اول باید توی تنظیمات پروژه، app مربوط به احراز هویت جنگو (django.contrib.auth) رو فعال کنید.
بعدش می‌تونید با استفاده از فرم‌های پیش‌فرض یا ساخت فرم‌های خودتون، کاربرا رو ثبت نام و وارد سیستم کنید.


2⃣ احراز هویت با توکن (Token Authentication)
🔑
این روش مخصوص زمانی هست که شما دارید یه API می‌سازید و می‌خواید کاربرانتون با استفاده از توکن بهش دسترسی پیدا کنن. توی این روش، به جای نام کاربری و رمز عبور، یک توکن به کاربر داده می‌شه که باید اون رو توی هدر درخواست‌ها قرار بده.


چطور پیاده‌سازیش کنیم؟🤔
از کتابخونه‌های مثل Django Rest Framework استفاده کنید.
بعدش با استفاده از TokenAuthentication و صدور توکن برای هر کاربر، می‌تونید این روش رو پیاده کنید.


3⃣ احراز هویت JWT (JSON Web Token
) 📜
خب JWT یه نوع خاص از توکنه که اطلاعات کاربر رو داخل خودش ذخیره می‌کنه. این نوع توکن‌ها خیلی امن و پرکاربرد هستن و به خصوص برای پروژه‌های SPA (Single Page Application) خیلی مناسبن.


چطور پیاده‌سازیش کنیم؟🤔
از کتابخونه‌های مثل djangorestframework-simplejwt استفاده کنید.
بعدش با پیکربندی صحیح، می‌تونید توکن‌های JWT رو برای کاربران صادر و اعتبارسنجی کنید.


4⃣ احراز هویت با OAuth 2.0 🌐
این روش بیشتر برای وقتی مناسبه که می‌خواید کاربرانتون با حساب‌های شبکه‌های اجتماعی یا سرویس‌های دیگه مثل گوگل و فیسبوک وارد سایت بشن. OAuth 2.0 یه پروتکل امن برای این نوع احراز هویته.

چطور پیاده‌سازیش کنیم؟ 🤔
از کتابخونه django-allauth یا social-auth-app-django استفاده کنید.
بعدش با انجام تنظیمات مربوطه، می‌تونید کاربران رو از طریق سرویس‌های مختلف احراز هویت کنید.


5⃣ احراز هویت دو مرحله‌ای (Two-Factor Authentication) 🔐
اگه می‌خواید امنیت بیشتری برای کاربران فراهم کنید، می‌تونید احراز هویت دو مرحله‌ای رو پیاده کنید. توی این روش، علاوه بر رمز عبور، یه کد تایید هم برای کاربر ارسال می‌شه که باید اون رو وارد کنه.


چطور پیاده‌سازیش کنیم؟ 🤔
از کتابخونه django-two-factor-auth استفاده کنید.
بعد از تنظیمات اولیه، می‌تونید این قابلیت رو به اپلیکیشن خودتون اضافه کنید.



جمع‌بندی 🧩
هر کدوم از این روش‌ها کاربرد خاص خودشون رو دارن و بسته به نیاز پروژه، می‌تونید یکی یا چند تا از این‌ها رو پیاده کنید. امنیت توی دنیای وب خیلی مهمه، پس به هیچ وجه ازش غافل نشید! 🕵️‍♂️

اگه سوالی دارید یا نیاز به کمک بیشتر دارید، حتما بپرسید. 💬

پست بعدی رو هم از دست ندید که می‌خوام در مورد Authorization صحبت کنم. 😉

#authentication #auth #django #backend


@ninja_learn_ir
👍103🤯1
💎 همه چیز درمورد Authorization درجنگو 💎

خب، توی پست قبلی درباره Authentication یا همون احراز هویت صحبت کردیم.
حالا نوبت به مرحله بعدی یعنی Authorization (مجوز دسترسی) رسیده 🔓 اینجا میخوایم بررسی کنیم که بعد از این‌که کاربر احراز هویت شد، چطور می‌تونیم مشخص کنیم به چه بخش‌هایی از سایت یا اپلیکیشن دسترسی داشته باشه. 🚪

1⃣ حالا Authorization چیه؟ 🤔
به طور ساده، Authorization یعنی تعیین سطح دسترسی کاربر به منابع مختلف. مثلا فرض کنید توی یه اپلیکیشن خبری دارید؛ نویسنده‌ها اجازه دارن مقاله بنویسن، ولی فقط مدیران میتونن اونا رو منتشر کنن. 📝 اینجا Authorization تعیین می‌کنه که کی به چی دسترسی داشته باشه.

2⃣ استفاده از Permissions در جنگو 🛡️
جنگو به صورت پیش‌فرض یه سیستم Permission داره که با استفاده از اون می‌تونید برای هر مدل (Model) مشخص کنید که کدوم کاربر یا گروه به چه عملیاتی دسترسی داشته باشه.

چطور پیاده‌سازیش کنیم؟ 🤔
می‌تونید از مجوزهای پیش‌فرض جنگو استفاده کنید که شامل add ، change  delete و view هستن.
برای ایجاد مجوزهای اختصاصی هم میتونید توی مدل‌ها (Model) از Meta و permissions استفاده کنید و مجوز های جدید تعریف کنید.

3⃣ ـGroup-Based Permissions 👥
یکی از امکانات عالی جنگو، سیستم گروه‌بندی کاربراست. شما می‌تونید کاربرا رو توی گروه‌های مختلف دسته‌بندی کنید و بعد براساس هر گروه، مجوزهای مختلفی بهشون بدید. مثلا یه گروه مدیران (Admins) داشته باشید که همه مجوزها رو دارن، و یه گروه کاربران عادی (Users) که دسترسی محدودتری دارن.

چطور پیاده‌سازیش کنیم؟ 🤔
اول باید گروه‌ها رو از طریق پنل ادمین جنگو یا از طریق کد بسازید.
بعدش می‌تونید کاربرا رو به گروه‌ها اضافه کنید و مجوزهای خاص رو به گروه‌ها اختصاص بدید.

4⃣ پیاده‌سازی Authorization در API ها 🔐
اگه دارید یه API می‌سازید، می‌تونید از Django Rest Framework برای مدیریت پرمیشن استفاده کنید. DRF به شما اجازه میده از کلاس‌های Permission استفاده کنید تا کنترل کاملی روی این داشته باشید که چه کسی به چه چیزی دسترسی داره.

چطور پیاده‌سازیش کنیم؟ 🤔
می‌تونید از permissions.IsAuthenticated برای اطمینان از این‌که فقط کاربران احراز هویت شده به API دسترسی دارن، استفاده کنید.
همچنین می‌تونید مجوزهای سفارشی بسازید و ازشون استفاده کنید. مثلا permissions.IsAdminUser برای ادمین‌ها.

5⃣ ـObject-Level Permissions 🛠️
این نوع مجوزها وقتی به کار میاد که بخواید دسترسی‌ها رو بر اساس هر شیء خاص تعیین کنید. مثلا یه کاربر فقط بتونه پروفایل خودش رو ببینه و نه پروفایل بقیه کاربرا. جنگو و DRF هر دو از این نوع مجوزها پشتیبانی می‌کنن.

چطور پیاده‌سازیش کنیم؟ 🤔
برای DRF میتونید BasePermission رو کاستومایز کنید و لاجیک خودتون رو برای هر شیء پیاده کنید.
میتونید از روش‌های مختلف مثل اورراید کردن متد get_object در ویوهای DRF استفاده کنید.

6⃣ احراز هویت بر اساس Role 🏷️
یکی از روش‌های پیشرفته‌تر برای Authorization، استفاده از Role‌هاست. توی این روش، هر کاربر یه نقش یا Role داره و مجوزها بر اساس این نقش‌ها تعیین می‌شن.

چطور پیاده‌سازیش کنیم؟
می‌تونید از پکیج‌هایی مثل django-role-permissions استفاده کنید.
رول های مختلف رو تعریف کنید و به هر رول یه سری مجوز اختصاص بدید.
جمع‌بندی 🧩
فهمیدیم Authorization یکی از مهم‌ترین بخش‌های هر اپلیکیشن وبه و با استفاده از اون میتونید دسترسی کاربران رو به خوبی مدیریت کنید. امنیت همیشه باید اولویت باشه، پس حواستون باشه که مجوزها رو درست تنظیم کنید تا کسی نتونه از طریق ضعف‌های امنیتی به بخش‌های حساس دسترسی پیدا کنه. 🕵️‍♀️

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

#django #backend #auth


@ninja_learn_ir
10👍3🔥2🤩1
💎 ساخت کامندهای کاستوم توی جنگو 💎

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

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

این سوال خیلی از بچه‌هایی که تو زمینه بک‌اند کار می‌کنن هست که "آیا لازمه DevOps هم یاد بگیریم یا نه؟".
خب جواب ساده‌اش اینه:
بله، ولی بستگی داره چقدر! بیایید یه نگاه دقیق‌تر بندازیم.

چرا DevOps؟

خب DevOps یه فرایند برای اینه که فاصله بین توسعه‌دهنده‌ها (مثل ما که کد می‌زنیم) و تیم‌های عملیات (کسایی که کد رو روی سرورها اجرا می‌کنن) کمتر بشه.
اگه شما به‌عنوان یه بک‌اند دولوپر، کمی از DevOps سر دربیاری، این به معنیه که می‌تونی توی مراحل دیپلویمنت و مدیریت پروژه نقش فعال‌تری داشته باشی و کدت رو با خیال راحت‌تری بیاری بالا. این یعنی کمتر وابسته به تیم‌های دیگه‌ای و سریع‌تر مشکلات رو هندل می‌کنی.


چقدر باید بلد باشیم؟ 📚

حالا سوال مهم اینه: چقدر باید DevOps بلد باشیم؟
نمی‌خواد یه متخصص کامل DevOps باشی، ولی دونستن چند تا موضوع پایه‌ای کمک زیادی بهت می‌کنه:

1⃣ کار با Git و CI/CD: دونستن نحوه کار با ابزارهای CI/CD (مثل Jenkins یا GitLab CI) خیلی ضروریه. چون کدایی که می‌نویسی باید خودکار تست و دیپلوی بشن.

مثال: فرض کن شما کدت رو نوشتی و از طریق یه لوله CI/CD خودکار تست می‌شه و اگر همه چی اوکی باشه، روی سرور دیپلوی می‌شه. با این کار خیالت راحت‌تره که چیزی خراب نشده.

2⃣ آشنایی با Docker: دیگه این روزا کار کردن بدون Docker سخته. بهتره بدونی چطور اپت رو داخل کانتینرهای Docker ببری و اجرا کنی.

مثال: اگه بخوای برنامه‌ات رو سریع روی چندتا سیستم مختلف بدون مشکل اجرا کنی، Docker می‌تونه مثل یه قهرمان کمکت کنه.

3⃣ کار با سرورها: حداقل باید با محیط‌های Linux و مدیریت سرورهای ساده آشنا باشی. مثلاً بدونی چطور سرویس‌ها رو استارت کنی، لاگ‌ها رو بخونی و یه سری دستورات پایه‌ای رو بزنی.

مثال: فرض کن اپت روی یه سرور مشکل پیدا کرده و لاگ ارورها رو می‌خونی تا سریع تر مشکل رو پیدا کنی. اگر اصولی بلد نباشی، باید منتظر بمونی تا یکی دیگه بیاد کمکت کنه.

4⃣ مدیریت کانفیگ‌ها: ابزارهایی مثل Ansible یا Terraform برای مدیریت و اتوماسیون کانفیگ سرورها کمک بزرگی هستن. ولی اگه تو محیط‌های کوچیک کار می‌کنی، حتی آشنایی با دستورای ساده Bash هم کافیه.


جمع بندی 🎯

در نهایت، اگه بک‌اند دولوپری هستی، دونستن مباحث DevOps بهت کمک می‌کنه مستقل‌تر و قوی‌تر عمل کنی. لازم نیست همه‌چیز رو فول باشی، اما آشنایی با اصول و ابزارهای پایه‌ای مثل Docker، Git، CI/CD و مدیریت سرورهای لینوکسی کارتو راحت‌تر می‌کنه.

هر چی بیشتر بلد باشی، هم برای خودت بهتره، هم توی تیم می‌درخشی. 😎

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

#backend #devops


@ninja_learn_ir
1👍245
ـ Dependency Injection چیه؟ 🤔

امروز میخوایم بررسی کنیم Dependency Injection یا همون تزریق وابستگی چیه
خب Dependency injection یه مفهومی توی برنامه‌نویسی شی‌گراست که به ساده‌ترین شکل می‌شه گفت برای جداسازی وابستگی‌ها بین کلاس‌ها استفاده می‌شه. یعنی چی؟ یعنی به جای اینکه هر کلاس خودش مستقلاً وابستگی‌های مورد نیازش رو بسازه، این وابستگی‌ها از بیرون بهش تزریق می‌شه. این کار باعث می‌شه کد ما تمیزتر، انعطاف‌پذیرتر و قابل تست‌تر بشه.

چرا مهمه؟ 🤨

فرض کن یه کلاس داری که برای کارکردش نیاز به یه سری سرویس‌های دیگه داره. مثلاً کلاسی که مسئول لاگین کاربره، نیاز به سرویس دیتابیس داره. حالا اگه این سرویس رو خود کلاس بسازه، دیگه وابستگی محکمی بین این دو تا وجود داره. یعنی هر وقت بخوای دیتابیس رو عوض کنی، باید بری توی این کلاس دست ببری. اما اگه از Dependency Injection استفاده کنی، می‌تونی هر وقت خواستی به این کلاس هر دیتابیسی که دوست داری تزریق کنی، بدون اینکه نیاز باشه توی کدش تغییری بدی.

یه مثال ساده 🤓

فرض کن کلاس زیر رو داری که برای ارسال پیام نیاز به یه سرویس پیام‌رسان داره:

class NotificationService:
def __init__(self):
self.sender = EmailSender()

def send(self, message):
self.sender.send(message)


اینجا کلاس NotificationService مستقیم وابسته به EmailSender هست، یعنی اگه بعداً بخوای از یه روش دیگه برای ارسال پیام (مثلاً SMSSender) استفاده کنی، باید بری کد این کلاس رو تغییر بدی. این باعث می‌شه کدات به هم گره بخورن و انعطاف‌پذیری کم بشه.

حالا با استفاده از Dependency Injection اینجوری می‌نویسیمش:

class NotificationService:
def __init__(self, sender):
self.sender = sender

def send(self, message):
self.sender.send(message)


تو این حالت، sender (که می‌تونه EmailSender، SMSSender یا هر چیز دیگه‌ای باشه) از بیرون به NotificationService تزریق می‌شه. حالا اگه بخوای نوع ارسال پیام رو تغییر بدی، فقط کافیه یه شیء جدید بهش تزریق کنی:

email_sender = EmailSender()
sms_sender = SMSSender()

notification = NotificationService(email_sender) # استفاده از ایمیل
notification.send("Hello via Email!")

notification_sms = NotificationService(sms_sender) # استفاده از SMS
notification_sms.send("Hello via SMS!")



مزایای Dependency Injection 📈

1⃣ قابلیت تست بیشتر: چون وابستگی‌ها از بیرون تزریق می‌شن، می‌تونی راحت‌تر mock کنی و تست بنویسی.

2⃣ انعطاف‌پذیری بیشتر: راحت می‌تونی وابستگی‌های مختلف رو جایگزین کنی بدون اینکه توی کلاس تغییر بدی.

3⃣ کاهش coupling: وابستگی بین کلاس‌ها کمتر می‌شه و این باعث می‌شه کدات مستقل‌تر باشن.

جمع‌بندی 🎯

فهمیدیم که Dependency Injection بهت کمک می‌کنه که کدهای تمیزتری داشته باشی که راحت‌تر تست و اپدیت میشن. خیلی وقتا که بخوای یه اپلیکیشن بزرگ و مقیاس‌پذیر بنویسی، این الگو می‌تونه کارتو خیلی راحت‌تر کنه. پس دفعه بعد که داشتی کد می‌زدی و حس کردی یه کلاس داره زیادی به کلاس‌های دیگه وابسته می‌شه، به فکر استفاده از این روش باش 😉

ممنون میشم با ریکشن و شیر از ما حمایت کنید :) ❤️‍🔥

#programing #backend



@ninja_learn_ir
23
🎢 برنامه‌نویسی Async

شاید زیاد به گوشت خورده باشه: Async Programming، ولی خب، دقیقاً یعنی چی؟ 🤔 بیایید با هم ببینیم چجوری می‌شه باهاش پروژه‌هامونو بهتر و سریع‌تر توسعه بدیم.

حالا Async چیه؟ 🤔
تصور کن یه کافه پر سر و صدا داری؛ مشتری‌ها میان، سفارش می‌دن، می‌شینن و منتظر آماده شدن سفارش می‌مونن. حالا فرض کن فقط یه کارمند داری که باید یکی‌یکی سفارش بگیره و هرکدوم آماده شد، بده دست مشتری. 😴 اما اگه از Async کمک بگیری، این کارمند می‌تونه همه سفارش‌ها رو پشت سر هم بگیره و هربار که یه سفارش آماده شد، همونو تحویل بده. بدون اینکه لازم باشه به مشتری بگه "منتظر بمون"

حالا Async چجوری کار می‌کنه؟
برنامه‌نویسی Async بهت اجازه می‌ده که تسک‌ها رو همزمان اجرا کنی. مثلا موقع درخواست به یه سرور خارجی (API)، می‌تونی به برنامه بگی به جای منتظر موندن، همزمان یه کار دیگه هم انجام بده.

کجا به درد می‌خوره؟
▶️ API Calling:
وقتی داری اطلاعات می‌گیری، منتظر نمی‌مونی، یه تسک دیگه اجرا می‌کنی. 🚀

▶️ File Handling:
خوندن و نوشتن فایل‌های بزرگ بدون توقف کد. 📂

▶️ Web Scraping:
همزمان چندین صفحه رو بررسی می‌کنی.

یه مثال ساده از Async با Python و Js🐍

فرض کن یه فانکشن می‌خوایم بنویسیم که ۲ ثانیه بخوابه و بعد یه متن چاپ کنه. حالا ببین فرق sync و async چیه:

import asyncio

# Sync
def print_sync():
print("Starting Sync...")
time.sleep(2)
print("Done Sync!")

# Async
async def print_async():
print("Starting Async...")
await asyncio.sleep(2)
print("Done Async!")

# اجرا
asyncio.run(print_async())

حالا Js :
// Sync
function printSync() {
console.log("Starting Sync...");
sleep(2000); // این تابع sleep فقط برای شبیه‌سازیه
console.log("Done Sync!");
}

function sleep(ms) {
const start = Date.now();
while (Date.now() - start < ms) {}
}

// Async
async function printAsync() {
console.log("Starting Async...");
await new Promise(resolve => setTimeout(resolve, 2000));
console.log("Done Async!");
}

// اجرا
printAsync();



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

#async #sync #backend


@ninja_learn_ir
🔥16👍2🍾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
خب خب خب ورژن‌بندی اپلیکیشن‌ها چیه؟ 📌

احتمالاً توی پروژه‌ها دیدی که نسخه نرم‌افزارها یه چیزی مثل 1.2.3 هست. ولی این اعداد چه معنی‌ای دارن؟ آیا یه ورژن 1.2.3 بهتر از 1.2.2ـه؟ بیاید یه بار برای همیشه اینو ببینیم

📌 استاندارد ورژن‌بندی (Semantic Versioning - SemVer)
ساختار استاندارد ورژن‌بندی معنایی (Semantic Versioning) معمولاً این شکلیه:
X.Y.Z 

X (Major - تغییرات بزرگ)
وقتی این عدد تغییر کنه، یعنی کلی چیز عوض شده مثلاً سازگاری عقبگرد (backward compatibility) شکسته شده و ممکنه کدهای قدیمی دیگه کار نکنن یا به عبارتی BREAKING CHANGE به وجود اومده.

Y (Minor - قابلیت‌های جدید)
اگه این عدد تغییر کنه، یعنی قابلیتای جدید اضافه شده ولی همچنان سازگاری با نسخه قبلی حفظ شده.

Z (Patch - رفع باگ‌ها و بهبودها)
فقط باگ فیکس یا بهینه‌سازیای جزئی انجام شده و هیچ قابلیت جدیدی اضافه نشده.

🔹 مثال عملی از ورژن‌بندی
فرض کن داریم روی یه اپلیکیشن کار می‌کنیم:
1.0.0 → نسخه اولیه منتشر شد.
1.1.0 → یه قابلیت جدید مثل ورود با گوگل اضافه شد.
1.1.1 → یه باگ توی صفحه لاگین فیکس شد.
2.0.0ساختار دیتابیس عوض شد و نسخه‌های قبلی دیگه کار نمی‌کنن.

🔍 پس کی باید Major، Minor یا Patch رو تغییر بدیم؟
وقتی API رو تغییر دادی و ممکنه کدای قدیمی دیگه کارنکنن؟
‏Major رو ببر بالا 🚀

یه فیچر جدید اضافه کردی ولی چیزی از قبل به مشکل نمیخوره؟
‏Minor رو ببر بالا 📈

فقط یه باگ کوچیک فیکس کردی؟
‏Patch رو ببر بالا 🛠️

🔹 انواع مختلف ورژن بندی؟
گاهی وقتا می‌بینی که ورژنا این شکلیه:
🔸1.2.3-alpha → نسخه آزمایشی (قبل از انتشار اصلی)

🔸 1.2.3-beta → نسخه بتا، برای تست کاربرا
🔸 1.2.3-rc1 → نسخه Release Candidate که تقریباً آماده است

جمع‌بندی
ورژن‌بندی معنایی باعث میشه بفهمیم یه نسخه چقدر تغییر کرده و آیا آپدیتش برای ما مشکلی ایجاد می‌کنه یا نه.

#️⃣ #programming #backend



🥷 CHANNEL | GROUP
👌19👍1
خب خب خب SMTP چیه؟ 📩

امروز می‌خوام درباره‌ی یه چیز خیلی مهم تو دنیای وب حرف بزنم: SMTP یا همون Simple Mail Transfer Protocol. شاید تا حالا اسمش رو شنیده باشین، ولی دقیقا چیه و چطور کار می‌کنه؟

📨 ‏SMTP چیه؟
‏SMTP یه پروتکل استاندارده که مسئول ارسال ایمیل‌ ها‌هست. اگه ایمیل رو مثل یه نامه در نظر بگیریم، SMTP همون پیک‌پستی‌ایه که نامه‌ت رو از صندوق تو به مقصد می‌رسونه.
این پروتکل تعیین می‌کنه که ایمیل از کجا بیاد، کجا بره و چجوری به درستی تحویل داده بشه.

🛠 چجوری کار می‌کنه؟
وقتی یه ایمیل می‌فرستی، پشت صحنه این اتفاقات میفته:
1️⃣ اتصال به سرور:
کلاینت ایمیل (مثل Gmail یا Outlook) به یه سرور SMTP متصل می‌شه تا ایمیل رو ارسال کنه.


2️⃣ دستورات ارسال می‌شن:

دستوراتی مثل HELO (یا EHLO) اجرا می‌شن تا ارتباط برقرار بشه. بعد، MAIL FROM و RCPT TO مشخص می‌کنن ایمیل از کجا اومده و قراره به کجا بره.

3️⃣ متن ایمیل ارسال می‌شه:
با دستور DATA، متن و جزئیات ایمیل به سرور فرستاده می‌شه. درست مثل وقتی که نامه‌ت رو به پیک‌پست تحویل می‌دی.


4️⃣ تأیید و پایان ارتباط:
بعد از ارسال، سرور یه تأییدیه می‌فرسته و ارتباط قطع می‌شه. این یعنی ایمیل با موفقیت ارسال شده.


🔒 نکات مهم درباره‌ی SMTP
🔹 استاندارد جهانی:
تقریباً همه‌ی سرویس‌های ایمیل از SMTP استفاده می‌کنن، پس یه پروتکل مشترکه.


🔹 امنیت بالا:
بیشتر سرورها از TLS/SSL استفاده می‌کنن تا ایمیل‌ها رمزنگاری بشن و کسی نتونه تو مسیر ارسال، اطلاعات رو بدزده.


🔹 دستورات مهم:
‏HELO, MAIL FROM, RCPT TO, DATA از دستورات کلیدی SMTP هستن که تو پروسه‌ی ارسال اجرا می‌شن.


🔹 احراز هویت SMTP AUTH:
بیشتر سرورها برای جلوگیری از سوءاستفاده، قبل از ارسال ایمیل، ازت می‌خوان که لاگین کنی. این باعث می‌شه اسپمرها نتونن از سرور سوءاستفاده کنن.
🎯 چرا SMTP مهمه؟
ما وقتی یه ایمیل می‌فرستیم، معمولا حواسمون به این نیست که چجوری ارسال می‌شه. اما پشت پرده، SMTP داره حسابی کار می‌کنه تا مطمئن بشه ایمیل سالم و بدون مشکل می‌رسه. بدون این پروتکل، ارسال ایمیل کلی دردسر داشت و ممکن بود پیام‌ها گم بشن یا به درستی تحویل داده نشن.

جمع‌بندی
‏SMTP همون پیک‌پست دیجیتاله که ایمیل‌های ما رو جابه‌جا می‌کنه. با یه سری دستورات استاندارد و نکات امنیتی مثل TLS/SSL و SMTP AUTH، ایمیل‌ها رو با امنیت و اطمینان کامل ارسال می‌کنه.

#️⃣ #programming #web #backend



🥷 CHANNEL | GROUP
10👍2🔥1👌1
خب خب خب WSO Web Shell چیه؟ 🕵️‍♂️

امروز می‌خوام درباره‌ی یه چیز خطرناک و مهم تو دنیای وب حرف بزنم: WSO Web Shell. شاید اسمش رو شنیده باشی، ولی دقیقا چیه و چرا باید حواست بهش باشه؟ بیا با هم ببینیم!

📡WSO Web Shell چیه؟
‏WSO Web Shell یه اسکریپت کوچیکه (معمولا با PHP نوشته می‌شه) که هکرها مثل یه در مخفی روی سرور سایتت می‌ذارن. وقتی این اسکریپت اونجاست، هکر می‌تونه هر وقت دلش خواست از راه در برگرده، دستور بده، فایل آپلود کنه یا حتی کل سایتت رو به هم بریزه. انگار یه کلید سایتتو دستش داره که هر موقع بخواد در سایتت رو باز می‌کنه.

🛠 چجوری کار می‌کنه؟
پشت صحنه این ماجرا اینجوری پیش می‌ره:

1️⃣ نقطه ورود:
هکرها دنبال یه راه نفوذ می‌گردن. مثلا اگه سایتت یه بخش آپلود فایل داره (مثل عکس پروفایل) و درست امن نشده(درواقع درست اعتبار سنجی نشده)، به جای عکس، این اسکریپت رو آپلود می‌کنن. یا از باگ‌هایی مثل SQL Injection و XSS سوءاستفاده می‌کنن تا این فایل رو روی سرورت بذارن.

2️⃣ دسترسی مخفی:
بعد از آپلود، فقط کافیه هکر یه آدرس خاص مثل
www.siteto.com/uploads/wso.php

رو تو مرورگر بزنه.
یه صفحه ساده باز می‌شه که بهش اجازه می‌ده دستوراتش رو اجرا کنه.

3️⃣ کنترل کامل:
حالا هکر می‌تونه فایلات رو ببینه، تغییر بده، اطلاعاتت رو بدزده یا حتی سایتت رو قفل کنه. مثل اینه که کلید خونه‌ت رو به یه غریبه داده باشی و اون تو خونت هرکاری بکنه.

🔒 نکات مهم درباره‌ی WSO Web Shell

🔹 کوچیک ولی خطرناک:
این اسکریپت خیلی ساده‌ست، ولی چون دسترسی کامل به سرور می‌ده، یه تهدید بزرگه.

🔹 تشخیص سخت:
چون شبیه فایلای معمولی PHP سایت می‌مونه، پیدا کردنش کار آسونی نیست مگه اینکه دنبالش بگردی.

🔹 استفاده همیشگی:
هکرا اینو می‌ذارن که هر وقت خواستن برگردن، بدون دردسر دوباره وارد بشن.

🎯 چطور جلوشو بگیری؟
برای اینکه سایتت از دست این در مخفی در امان بمونه، این کارا رو بکن:

آپدیت نگه دار:
سیستم مدیریت محتوا (مثل وردپرس)، پلاگین‌ها و قالبت رو همیشه به‌روز کن. این آپدیت‌ها باگ‌ها رو می‌بندن.

رمز قوی:
رمزهای پیچیده بذار و احراز هویت دو مرحله‌ای رو فعال کن.

فایل‌ها رو چک کن:
هر چند وقت یه بار سرورت رو نگاه کن، ببین فایل مشکوکی مثل wso.php اونجا نیست.

فایروال وب (WAF):
این ابزار ترافیک مشکوک رو قبل از رسیدن به سرورت بلاک می‌کنه.

کدنویسی امن:

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


جمع‌بندی
‏WSO Web Shell همون در پشتی مخفیه که هکرا تو سرورت کار می‌ذارن تا هر وقت دلشون خواست برگردن و خرابکاری کنن. ولی با یه کم دقت، آپدیت نگه داشتن سایت و رعایت نکات امنیتی، می‌تونی جلوی این دردسر رو بگیری.

#️⃣ #security #backend


🥷 CHANNEL | GROUP
👍5❤‍🔥1🔥1👌1
خب خب خب WebSocket در Fastapi 🌀

امروز می‌خوام درباره‌ی یه موضوع باحال و کاربردی تو دنیای وب حرف بزنم: پیاده‌سازی WebSocket در FastAPI اگه دنبال ساخت اپلیکیشن‌های realtime مثل چت، داشبوردهای زنده یا بازی‌های آنلاین هستین، این پست براتون خیلی مفیده. پس با من همراه باشین تا با هم یاد بگیریم WebSocket چیه و چطور می‌تونیم تو FastAPI ازش استفاده کنیم.

🧠 WebSocket چیه و چرا مهمه؟
‏ WebSocket یه پروتکل ارتباطیه که به کلاینت (مثل مرورگر) و سرور اجازه می‌ده یه ارتباط دوطرفه و همیشگی داشته باشن. برعکس HTTP که فقط یه درخواست می‌فرستی و یه پاسخ می‌گیری، WebSocket این امکان رو می‌ده که هر دو طرف هر وقت خواستن پیام بفرستن و بگیرن، بدون اینکه نیاز باشه کلاینت مدام درخواست بفرسته. این برای اپلیکیشن‌هایی که نیاز به آپدیت‌های زنده دارن، مثل چت روم‌ها، اعلان‌های realtime یا بازی‌های آنلاین، عالیه

🚀 FastAPI و WebSocket

FastAPI یه فریم‌ورک وب مدرن و سریع برای پایتونه. یکی از قابلیت‌های باحالش هم پشتیبانی از WebSocketه. FastAPI از Starlette استفاده می‌کنه (یه فریم‌ورک ASGI سبک و قدرتمند)، و همین باعث می‌شه بتونیم به راحتی WebSocket رو پیاده‌سازی کنیم.

🛠 چطوری WebSocket رو تو FastAPI پیاده‌سازی کنیم؟

برای شروع، باید از کلاس WebSocket تو FastAPI استفاده کنیم. بیاین با یه مثال ساده شروع کنیم:
from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"پیامت این بود: {data}")

تو این کد:
یه endpoint به اسم /ws ساختیم.

وقتی کلاینت بهش وصل می‌شه، سرور با accept() ارتباط رو قبول می‌کنه.

بعدش تو یه حلقه پیام‌های کلاینت رو می‌گیره و همونو برمی‌گردونه.


به این می‌گن یه Echo Server ساده هر چی کلاینت بفرسته، سرور عینشو برمی‌گردونه.

📡 یه مثال پیشرفته‌تر: چت روم با WebSocket

حالا بیاین یه چیز باحال‌تر بسازیم، مثلاً یه چت روم که چندتا کلاینت بتونن بهش وصل بشن و پیام‌هاشون رو به هم بفرستن. برای این کار، باید اتصال‌های فعال رو مدیریت کنیم. یه کلاس به اسم ConnectionManager می‌سازیم که لیست اتصال‌ها رو نگه داره و بتونیم بهشون پیام بفرستیم یا به همه broadcast کنیم.
from fastapi import FastAPI, WebSocket
from typing import List

app = FastAPI()

class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []

async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)

def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)

async def send_personal_message(self, message: str, websocket: WebSocket):
await websocket.send_text(message)

async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)

manager = ConnectionManager()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
await manager.send_personal_message(f"تو نوشتی: {data}", websocket)
await manager.broadcast(f"یکی گفت: {data}")
except Exception as e:
print(f"خطا: {e}")
finally:
manager.disconnect(websocket)

اینجا چی داریم؟
‏ConnectionManager یه کلاسه که اتصال‌های فعال رو تو یه لیست نگه می‌داره.
وقتی کلاینت وصل می‌شه، به لیست اضافه می‌شه (connect) و وقتی قطع می‌شه، حذف می‌شه (disconnect).

‏send_personal_message به یه کلاینت خاص پیام می‌فرسته.

‏broadcast به همه کلاینت‌های وصل‌شده پیام رو می‌فرسته.

تو endpoint، پیام کلاینت رو می‌گیریم، به خودش یه جواب شخصی می‌دیم و به بقیه هم broadcast می‌کنیم.

جمع‌بندی

‏WebSocket تو FastAPI به شما این امکان رو می‌ده که اپلیکیشن‌های realtime و جذاب بسازین. از چت روم‌ها گرفته تا داشبوردهای زنده و بازی‌های آنلاین.

خب اینم از این امید وارم مفید بوده باشه :]

#️⃣  #fastapi #backend #python


🥷 CHANNEL | GROUP
👍11👌53🔥2👏1🤩1