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

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

👥 ɢʀᴏᴜᴘ: https://t.iss.one/+td1EcO_YfSphNTlk
Download Telegram
این هم از دیتا تایپ های JavaScripts

@ninja_learn_ir
👍5
💣 بکگراند تسک در برنامه‌نویسی وب 💣

#پست_جدید

بکگراند تسک‌ها یا وظایف پس‌زمینه‌ای، عملیات‌هایی هستن که خارج از پراسس یا ترد اصلی اجرای برنامه (main thread) اجرا میشن.

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

چرا باید از بکگراند تسک‌ها استفاده کنیم؟

1- بهبود کارایی و پاسخ‌دهی:
اجرای عملیات‌های زمان‌بر (مثل پردازش داده‌ها، دانلود فایل‌های بزرگ، ارسال پیامک و ارسال ایمیل) در بکگراند، از قفل شدن (freezing) رابط کاربری جلوگیری می‌کنه و باعث میشه که برنامه به طور مداوم پاسخگو بمونه.

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

3- تجربه کاربری بهتر:
کاربرا انتظار دارن که برنامه‌ها به سرعت واکنش نشون بدن. اجرای وظایف سنگین در پس‌زمینه باعث میشه کاربرا تجربه‌ای روون‌ تر و بدون وقفه داشته باشن.


بکگراند تسک‌ها برای چه کارهایی مناسب هستند؟

1- ارسال ایمیل‌، پیامک و نوتیفیکیشن‌ها:
ارسال ایمیل‌ها و پیامک های تأیید، نوتیفیکیشن‌ها و سایر پیام‌های سیستم به صورت همزمان با عملیات اصلی کاربر ممکنه زمان‌بر باشه. این کارها می‌تونن به عنوان بکگراند تسک انجام بشن.

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

3- به‌روزرسانی‌های دسته‌ای:
به‌روزرسانی‌های انبوه داده‌ها در پایگاه داده، محاسبات پیچیده و تحلیل داده‌ها می‌تونه در بکگراند انجام بشه تا عملکرد برنامه تحت تأثیر قرار نگیره.

4- جمع‌آوری و تجزیه و تحلیل داده‌ها:
وظایف جمع‌آوری داده‌ها از منابع مختلف و تحلیل‌های پیچیده می‌تونن به صورت دوره‌ای در پس‌زمینه انجام بشن.


نحوه استفاده از بکگراند تسک‌ها

1- استفاده از Job Queues:
صف‌های کار (job queues) مثل Redis Queue، RabbitMQ، و Amazon SQS به شما اجازه می‌دن کارهای پس‌زمینه‌ای تون رو مدیریت و اجرا کنید.

2- وب ورکر ها در مرورگر ها:
وب ورکر ها (Web Workers) به شما اجازه می‌دن اسکریپت‌های جاوااسکریپت رو در پس‌زمینه اجرا کنید، بدون اینکه جریان اصلی برنامه تحت تأثیر قرار بگیره.

3- Task Scheduling:
ابزارها و فریم‌ورک‌هایی مثل Celery برای Python و Sidekiq برای Ruby به شما اجازه می‌دن وظایف زمان‌بندی شده رو به صورت پس‌زمینه‌ای اجرا کنید.



نمونه کد ساده با استفاده از Celery در Python:


# tasks.py

from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def send_email(recipient):
# Logic for sending email
print(f'Sending email to {recipient}')


# main.py

from tasks import send_email

# Trigger the background task
send_email.delay('[email protected]')


#پست_جدید #جنگو #پایتون #بکگراند_تسک
@ninja_learn_ir
👍9
#پست_جدید
میخوام درمورد یک موضوع خیلی جالب توی جنگو صحبت کنم که اکثرا توش مشکل دارن
خب اون چیه؟


🤓 کش شدن نتیجه کوری ها❗️


میدونستید که جنگو نتیجه کوری هارو کش میکنه؟

حالا این یعنی چی ⁉️

یعنی جنگو فقط یک بار دیتابیس رو هیت میکنه و دیتا رو میگیره و همونو کش میکنه و از دفعه های بعدی تا زمان پایان اجرای تابع فعلی از اون نتیجه کش شده استفاده میکنه

حالا بیاید توضیح بدم.

⭕️ قبلش یه نکته مهم رو بگم: ⭕️
هر چیزی که باعث ایجاد یک QuerySet جدید بشه باعث هیت شدن جدید به دیتابیس خواهد شد.

حالا بریم مثالو ببینیم:

users = User.objects.all()
print(users)

if users:
for u in users:
print(u)


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

حتما فکرمیکنید ۳ بار نه اینجوری نیست ❗️

اینجا فقط 2 بار داره به دیتابیس هیت میزنه.

1️⃣ توی خط اول ما فقط queryset رو تعریف کردیم. از اونجایی که میدونید کوری ست ها توی جنگو lazy هستن و تا وقتی که صداشون نزنیم اجرا نمیشن.

2️⃣ توی خط دوم ما queryset رو print کردیم و اولین هیتمون به دیتابیس زده میشه ولی یه نکته print نمیره کل رکورد هارو بیاره چون منطقی نیست.

پرینت یک محدودیت داره برای آوردن رکورد ها مثلا اگه شما هزار تا رکورد داشته باشید print کل اون هزار تا رو نمیاره و مثلا ۱۰۰ تاشو میاره دومین نکته اینه که اینجا هیچ کشی اتفاق نمی افته( دلیلشو جلوتر میگم)

3️⃣ توی خط سوم ما میخوایم با if بررسی کنیم کاربری وجود داره یا نه اینجا جنگو میاد کش ر و چک میکنه تا ببینه برای users ریزالتی کش شده یانه

اینجا میبینه هیچ کشی وجود نداره و در نتیجه اینجا دومین هیتمون به دیتابیس میخوره و کل رکورد هارو برمیگردونه و مثل print عمل نمیکنه و نکته بعدی اینه اینجا ریزالت کوری توی رم سرور توسط جنگو کش میشه حالا اینجا جالب میشه😁

توی خط بعدی که یه حلقه زدیم روی users اینجا میاد کش رو چک میکنه و میبینه که ریزالت users کش شده و میاد از اون کش استفاده میکنه و به دیتابیس هیچ کوری نمیزنه و درنتیجه اینجا فقط دوبار به دیتابیس هیت خورده میشه

حالا چرا print نتیجش کش نشد؟

به گفته خود جنگو، جنگو فقط زمانی ریزالت یه queryset رو کش میکنه که اون queryset کامل اجرا بشه. و توی print چون queryset کامل اجرا نمیشه منطقا ریزالتش کش نمیشه
ولی توی if چون queryset کامل اجرا شد ریزالتشم کش شد


برای اثبات این حرفم میتونید چیزایی که کش شده رو ببینید 👇

users = User.objects.all()
print(users)
print("Cache: ", users._result_cache)

if users:
print("Cache: ", users._result_cache)
for u in users:
print(u)



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

<QuerySet [<User: mohammad>]>
Cache: None
Cache: [<User: mohammad>]
mohammad

همونطور که میبینید بعد از اجرا شدن print هیچ ریزالتی کش نشده و کش خالیه چون queryset کامل اجرا نشد.

ولی وقتی if اجرا شد چون queryset کامل اجرا شد ریزالتم کش شد و ازاین به بعد از کش استفاده میکنه.

یه نکته در پایان بگم این کش تا زمانی باقی میمونه که اجرای تابع تموم شه و بعد ازاون توسط garbage collector از مموری سرور پاک میشه جنگو توسط پایتون و پایتون روی سرور اجرا میشه.

توی پستای بعدی درمورد garbage collector بیشتر توضیح میدم

#جنگو #کش_در_جنگو #برنامه_نویسی

@ninja_learn_ir
👍82
Ninja Learn | نینجا لرن
💣 بکگراند تسک در برنامه‌نویسی وب 💣 #پست_جدید بکگراند تسک‌ها یا وظایف پس‌زمینه‌ای، عملیات‌هایی هستن که خارج از پراسس یا ترد اصلی اجرای برنامه (main thread) اجرا میشن. این عملیات‌ها به گونه‌ای طراحی شدن که بدون تداخل در پاسخ‌دهی برنامه به کاربرا، وظایف خاصی…
🥦 چطوری با Celery در جنگو یک بک گراند تسک ایجاد کنیم؟ 🥦

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


سلری (Celery) چیه؟
سلری یک سیستم صف‌بندی توزیع شده هست که برای مدیریت و اجرای وظایف پس‌زمینه‌ای (background tasks) و وظایف زمان‌بندی شده (scheduled tasks) استفاده میشه. Celery در تعداد زیادی از پروژه‌های پایتونی برای بهبود کارایی و مدیریت وظایف استفاده میشه.

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

منظور از پیام در واقع تسک هایی هستن که از طریق یک مسیج بروکر مثل Redis یا RabbitMQ به همراه اطلاعات لازم و ضروری به ورکر های سلری که بکگراند تسک ها رو پردازش میکنن و انجام میدن تحویل داده میشن

سلری یک صف کار (Job Queue) با تمرکز روی پردازش زمان واقعیه در حالی که از زمان‌بندی کار (Task Scheduling) هم پشتیبانی می‌کنه.

سلری منبع باز (اوپن سورس) هست و تحت مجوز BSD مجوز داره.


ایجاد یک بکگراند تسک با سلری

1️⃣ نصب ردیس و Celery:

خب قدم اول اینه که celery رو به همراه redis نصب کنیم، ترمینال یا همون کامند پرامپت رو باز کنید و این دستور رو برای نصب سلری به همراه درایور Redis وارد کنید:

pip install celery[redis]


حالا که سلری رو به همراه درایور ردیس نصب کردید باید خود ردیس هم نصب کنید که من پیشنهاد میکنم برای این منظور از داکر استفاده کنید.

⭕️ اگه داکر رو نصب نکردید به آدرس: https://www.docker.com/ برید و داکر رو روی سیستم خودتون نصب کنید. ⭕️

بعد نصب داکر این دستور رو در ترمینال یا کامند پرامپت برای نصب و اجرای ردیس بزنید:

docker run --name some-redis -d redis


حالا که ردیس رو نصب و اجرا کردیم و سلری و درایور ردیس هم نصبه میتونیم بریم قدم بعدی


2️⃣ ستاپ کردن سلری روی پروژه جنگویی

فرض رو بر این میگیرم که یه پروژه جنگویی ایجاد کردید و آماده دارید.
برای استفاده از Celery با پروژه جنگویی، اولش باید یک نمونه (Instance) از کتابخانه Celery (به اسم "app") تعریف کنید.

اگه ساختار یک پروژه مدرن جنگویی مثل این دارید:
- proj/
- manage.py
- proj/
- __init__.py
- settings.py
- urls.py

⭕️ توجه کنید که اسم پروژه توی این مثال proj هست ⭕️

پس راه پیشنهادی ایجاد یک ماژول proj/proj/celery.py جدید هست که نمونه Celery رو تعریف می کنه:

فایل proj/proj/celery.py:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

@app.task(bind=True, ignore_result=True)
def debug_task(self):
print(f'Request: {self.request!r}')


بعد باید این برنامه رو در ماژول proj/proj/__init__.py خودتون ایمپورت کنید. این تضمین می‌کنه که هنگام شروع و بالا اومدن جنگو، برنامه بارگیری می‌شه تا دکوریتور shared_task@ ازش استفاده کنه:

فایل proj/proj/__init__.py:
from .celery import app as celery_app

__all__ = ('celery_app',)


بیایین ببینیم که در ماژول اول اتفاق می افته؟

ابتدا متغیر محیطی پیش فرض DJANGO_SETTINGS_MODULE رو برای برنامه خط فرمان celery (CLI) تنظیم می کنیم:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')


شما به این خط نیاز ندارین، اما شما رو از پاس دادن همیشگی ماژول تنظیمات جنگو به برنامه (app) سلری نجات می ده.

⭕️ همیشه باید قبل از ایجاد نمونه های برنامه سلری نوشته بشه ⭕️

همانطور که در ادامه انجام می دهیم:

app = Celery('proj')


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

ما همچنین ماژول تنظیمات جنگو رو به عنوان منبع پیکربندی برای Celery اضافه می کنیم. این به این معنی هست که شما مجبور نیستین از چندین فایل پیکربندی استفاده کنید، و در عوض Celery رو مستقیماً از تنظیمات جنگو پیکربندی کنید. اما در صورت تمایل می تونید اون ها را جدا کنید.

app.config_from_object('django.conf:settings', namespace='CELERY')


نوشتن CELERY با حروف بزرگ به این معنی هست که همه گزینه‌های پیکربندی Celery باید به جای حروف کوچیک با حروف بزرگ مشخص بشن و با CELERY_ شروع بشن، بنابراین مثلا، تنظیمات task_always_eager به CELERY_TASK_ALWAYS_EAGER تبدیل میشه و متغیر broker_url به CELERY_URL_BROKER تبدیل میشه. این در مورد تنظیمات worker ها نیز صدق می کنه، مثلا، متغیر worker_concurrency به CELERY_WORKER_CONCURRENCY تبدیل میشه.
👍11
Ninja Learn | نینجا لرن
💣 بکگراند تسک در برنامه‌نویسی وب 💣 #پست_جدید بکگراند تسک‌ها یا وظایف پس‌زمینه‌ای، عملیات‌هایی هستن که خارج از پراسس یا ترد اصلی اجرای برنامه (main thread) اجرا میشن. این عملیات‌ها به گونه‌ای طراحی شدن که بدون تداخل در پاسخ‌دهی برنامه به کاربرا، وظایف خاصی…
برای مثال، فایل/ماژول تنظیمات پروژه جنگویی ممکنه شامل این موارد باشه:

فایل settings.py:
CELERY_TIMEZONE = "Asia/tehran"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60


در عوض می‌تونید آبجکت تنظیمات رو مستقیماً ارسال کنید، اما استفاده از یک رشته بهتره چون ورکر (Worker) مجبور نیست آبجکت رو سریالایز کنه. نیم اسپیس CELERY_ هم اختیاریه، اما توصیه می شه (برای جلوگیری از overlap با تنظیمات دیگه جنگو).

در مرحله بعدی، یک روش معمول برای برنامه های قابل استفاده مجدد (Reusable) این هست که همه وظایف رو در یک ماژول tasks.py جداگونه تعریف کنن و Celery راهی برای کشف خودکار این ماژول ها داره:

app.autodiscover_tasks()


با خط بالا، Celery به‌طور خودکار وظایف/تسک های همه برنامه‌های نصب‌شده شما رو با پیروی از قرارداد tasks.py کشف می‌کنه:

- app1/
- tasks.py
- models.py
- app2/
- tasks.py
- models.py

به این ترتیب شما مجبور نیستید به صورت دستی ماژول های جداگونه رو به تنظیمات CELERY_IMPORTS اضافه کنید.

در نهایت، مثال debug_task تسکی هست که از گزینه bind=True task جدید معرفی شده در Celery 3.1 استفاده می کنه تا به راحتی به نمونه (Instance) جاب (Job) فعلی مراجعه کنه.



3️⃣ استفاده از دکوریتور shared_task decorator@:
تسک هایی که می نویسین احتمالاً در برنامه های قابل استفاده مجدد (reusable apps) زندگی می کنن و برنامه های قابل استفاده مجدد نمی تونن به خود پروژه وابسته باشند، بنابراین شما همچنین نمی تونید نمونه (instance) برنامه خودتون را مستقیماً ایمپورت کنید.

دکوریتور @shared_task به شما این امکان میده که بدون داشتن نمونه برنامه مشخص، Job ها رو ایجاد کنید:

فایل demoapp/tasks.py:

from demoapp.models import Widget

from celery import shared_task


@shared_task
def add(x, y):
return x + y


@shared_task
def mul(x, y):
return x * y


@shared_task
def xsum(numbers):
return sum(numbers)


@shared_task
def count_widgets():
return Widget.objects.count()


@shared_task
def rename_widget(widget_id, name):
w = Widget.objects.get(id=widget_id)
w.name = name
w.save()


⭕️ به جای demoapp اسم app خودتون رو بنویسید ⭕️

4️⃣ صدا زدن تسک ها:

در نهایت با متد delay میتونید تسک خودتون رو اجرا کنید:
add.delay(2, 4)

⭕️ توی این مثال اسم تابعی که تسک ما رو اجرا میکنه add هست ⭕️

5️⃣ اجرای سلری برای هندل کردن تسکا:

❗️برای اجرای سلری پیشنهاد میکنم پروژتون رو داکرایز کنید و از داکر استفاده کنید چرا که امکان اجرای سلری مستقیما روی سیستم عامل ویندوز وجود نداره (فقط کافیه یه سرویس به اسم celery داخل فایل compose ایجاد کنید و CMD اون سرویس رو به دستوری که در ادامه نوشته شده تغییر بدید)❗️

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

celery -A proj worker -l INFO


⭕️ به جای proj اسم پروژه خودتون رو بنویسید ⭕️


🌹 امیدوارم خوشتون اومده باشه 🌹

🎁 به زودی یه ویدیو آموزشی جامع برای کار با سلری ضبط میکنیم 🎁


#جنگو #سلری #celery

@ninja_learn_ir
👍13
سلام به همگی 👋

خیلی خوش اومدید 🌹

🎥 کانال آپاراتمون رو داشته باشید 🎥

قراره کلی دوره رایگان و پیشرفته توی آپارات منتشر کنیم 💣🧨

https://aparat.com/ninjalearn
👍8🔥2
Ninja Learn | نینجا لرن pinned «سلام به همگی 👋 خیلی خوش اومدید 🌹 🎥 کانال آپاراتمون رو داشته باشید 🎥 قراره کلی دوره رایگان و پیشرفته توی آپارات منتشر کنیم 💣🧨 https://aparat.com/ninjalearn»
رفقا پیج اینستاگراممون رو هم فالو کنید 🫶

قراره کلی پست آموزشی و پرسش و پاسخ بذاریم با question box و هر سوالی داشته باشید جواب میدیم

مهم نیست ابتدای راه باشید و تازه شروع کرده باشید یا حرفه ای تر باشید و سوالای advanced و پیشرفته بپرسید

همرو جواب میدیم

باتشکر 🌹

https://www.instagram.com/ninjalearn.ir/
👍5
#پست_جدید

حتما شنیدید که کوری ست ها در جنگو تنبل/lazy هستند 🤔

تواین پست میخوایم درموردش صحبت کنیم


منظور ازاینکه کوری ها تنبل هستند دقیقا چیه؟

منظور از این حرف اینه که تا وقتی که واقعا به داده ها نیاز پیدا نشه ارزیابی نمیشن (کوری ست evaluate نمیشن)

و این ویژگی به پرفورمنس خیلی کمک میکنه


به مثال زیر توجه کنید👇



      users = User.objects.all() 



خب همینجور که میبینید ما کوری رو نوشتیم ولی اگه ریکوست های سرور رو چک کنیم میبینم هیچ ریکوستی به دیتابیس نمیخوره


ولی دراین مثال👇

      users = User.objects.all() 

if users:

for user in users:

print(user.name)



در اینجا چون ما از شرط (if) استفاده کردیم کوری ست evaluate میشه و میاد بررسی میکنه ایا کاربری وجود داره یانه و پس از اون میاد نام همه کاربرارو بر میگردونه


شاید براتون سوال شده باشه evaluate یعنی چی؟

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

#جنگو #کوری_ست #lazy_querysets



@ninja_learn_ir
7👍3🔥1
سلام دوستان 👋 از کدوم گزینه بیشتر پست بذاریم واستون؟
Final Results
76%
Django
12%
Python
7%
JavaScript
2%
Node.js
0%
Express.js
0%
Next.js
2%
همه گزینه ها🫡
1
#پست_جدید

توی پست قبلی درمورد lazy بودن کوری ست ها صحبت کردیم


توی این پست میخوایم درموردش عمیق تر بشیم


توجه❗️
تمام مثال های این پست با توجه به معماری MVT در نظر گرفته شده است.

به مثال زیر توجه کنید 👇

def get_users_list(request): 

users = User.objects.all()

return render(request, "panel/ users.html", {"users": users})

خب بنظرتون توی این مرحله کوری ست evaluate میشه؟

خیر هیچوقت در این مرحله evaluate نمیشه و توی تمپلیت وقتی که داریم روش یه عملیتای انجام میدیم evaluate میشه ( جلوتر توضیح میدم)



به این مثال توجه کنید 👇

{% for user in users %} 

<h1> {{user.name}} </h1>

{% endfor %}


همونطور که میبینید دراین کد ما اومدیم درون تمپلیت روی users حلقه for زدیم و اسامی کاربران رو گرفتیم

با توجه به lazy بودن کوری ست ها که در پست قبل توضیح دادم در مرحله حلقه زدن عملیات evaluation صورت میگیره و کوری ست تبدیل به کد sql میشه و به دیتا بیس فرستاده میشه و ریزالت رو برمیگردونه



پس بازم اینجا اثبات شد فقط وقتی کوری ست اجرا میشه که بهش نیاز پیدا کنیم



#جنگو #کوری_ست #lazy_querysets



@ninja_learn_ir
👍18
بچه ها پست جدید تو اینستا منتشر شد 😁

خیلی ممنون میشم با حمایتاتون به ما انرژی بدید❤️

لینک پست 👇

https://www.instagram.com/p/C9uwDy7owe6/?igsh=YjM2MHltYzRvaWoz

@ninja_learn_ir
👍4🔥1
سلام رفقا 👋
صبح تون بخیر
کدوم دوره آموزشی رو بیشتر از همه دوست دارید واستون ضبط کنیم؟ 🆓️ دوره به صورت کاملا رایگان تو آپارت منتشر خواهد شد 🆓️
Final Results
7%
مینی دوره جنگو
22%
امنیت در برنامه نویسی وب
17%
مقدمه ای بر SQL و دیتابیس
2%
مینی دوره پایتون
7%
مینی دوره جاوااسکریپت
12%
مینی دوره آموزش ORM جنگو
32%
مینی دوره آموزش DRF
👍6
#پست_جدید

🔒 تراکنش (transaction) در فریمورک جنگو 🔒

دراین پست میخوام درمورد یک بحث جالب که اکثرا نمیدونند و یا در اون مشکل دارند صحبت کنم


حالا اون چیه؟ 🤔


عملیات transaction


بریم درموردش داخل جنگو توضیح بدیم

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

این قابلیت به شما اجازه میده تا یک گروه از عملیات رو بصورت atomic انجام بدید.

منظور از atomic یعنی همه عملیاتی که ما میخوایم روی دیتابیس انجام بدیم باید با موفقیت انجام بشن و حتی اگه یکیشون موفقیت آمیز نباشه بقیشونم به حالت قبلی برمیگردن یا به عبارتی rollback میشن

حالا بیاید با یک مثال بهتر درکش کنیم


فرض کنید یک سایت وبلاگ مثل ویرگول دارید که موجودیت های (Entities) Blog و BlogStatus داره. میدونیم که BlogStatus وضعیت انتشار Blogهستش.

روال کار اینجوریه وقتی که یه Blog درست میشه همزمان با اون یک BlogStatus هم درست میشه تا ادمین بیاد با استفاده از BlogStatusاون بلاگ رو تایید کنه یا تایید نکنه

اگه در این مراحل خطایی رخ بده (مثلا قبل از ایجاد BlogStatus رکورد Blog در دیتابیس ذخیره نشده باشه) میخوایم تراکنش را بصورت اتمیک لغو کنیم.

در اینجا transaction.atomic به کمکمون میاد. با استفاده از این دکوریتور، اگه هر یک از مراحل ایجاد Blogو BlogStatus با مشکل مواجه بشه، تراکنش به صورت اتمیک لغو میشه و تغییرات در دیتابیس انجام نمیشه.



به مثال زیر توجه کنید 👇

from django.db import transaction 

from .models import Blog, BlogStatus



@transaction.atomic

def create_blog_status(title, description, blog_status_data):


blog = Blog.objects.create(title=title, description=description, ... )

blog_status= BlogStatus.objects.create(blog=blog, status=PENDING)

# Other operations related to blog status creation


در این مثال، اگر هر کدوم از دستورات create با مشکل مواجه بشه، تراکنش به صورت اتمیک لغو میشه و هیچ تغییری در دیتابیس صورت نمیگیره. این به ما کمک می‌کنه تا داده‌های ناقص در دیتابیس ذخیره نشند.



برای استفاده از transaction.atomic کافیه که این دکوریتور رو بالای تابع‌هایی که تراکنش‌ها را انجام میدند، قرار بدیم. این دکوریتور به طور خودکار تراکنش
‌ها را مدیریت می‌کنه و در صورت بروز خطا، تغییرات رو لغو می‌کنه.

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

#django #جنگو #transactions


@ninja_learn_ir
12👍4🔥1
سلام رفقا 👋

تو اینستا پست جدید گذاشتیم بیاید حمایت کنید لطفا 🙏

کوئسشن باکس هم گذاشتیم هر کی هر سوالی داره بیاد بپرسه
همه رو جواب میدیم ☺️

https://www.instagram.com/ninjalearn.ir?igsh=ZDk5bDBmNXBudnl6
🔥8
#پست_جدید

💎 تایپ هینت (Type Hint) در پایتون 💎

تایپ هینت (Type Hint) یا "نشانه‌گذاری نوع" در پایتون، روشی برای مشخص کردن نوع داده‌هایی هست که یه تابع می‌تونه بپذیره و برگردونه. این قابلیت از نسخه 3.5 به بعد به پایتون اضافه شده و به بهبود خوانایی و فهم کد کمک می‌کنه.

مثال‌های پایه‌ای از Type Hint:

در ادامه به برخی مثال‌های ساده و کاربردی اشاره می‌کنیم:

1️⃣ نشانه‌گذاری نوع آرگومان‌ها و نوع بازگشتی توابع

def greet(name: str) -> str:
return f"Hello, {name}"

def add(a: int, b: int) -> int:
return a + b


در این مثال، تابع greet یک آرگومان از نوع str میگیره و یه str برمی‌گردونه. تابع add دو آرگومان از نوع int میگیره و یک int برمی‌گردونه.


2️⃣ استفاده از انواع داده پیچیده‌تر

from typing import List, Dict

def get_names() -> List[str]:
return ["Alice", "Bob", "Charlie"]

def get_ages() -> Dict[str, int]:
return {"Alice": 30, "Bob": 25}


در اینجا، List[str] نشان‌دهنده لیستی از رشته‌ها و Dict[str, int] نشان‌دهنده دیکشنری‌ای هست که کلیدهاش رشته و مقادیرش عدد صحیح هستن.



3️⃣ استفاده از Optional

گاهی ممکنه یه تابع مقداری را برگردونه یا مقدار None برگردونه. در این مواقع از Optional استفاده می‌کنیم:

from typing import Optional

def find_item(items: List[str], item: str) -> Optional[int]:
try:
return items.index(item)
except ValueError:
return None


تابع find_item ممکنه یک عدد صحیح (int) یا None برگردونه.



4️⃣ استفاده از Union

زمانی که یه متغیر یا آرگومان می‌تونه چندین نوع داده مختلف داشته باشه، از Union استفاده می‌کنیم:

from typing import Union

def get_value(value: Union[int, str]) -> str:
if isinstance(value, int):
return f"The number is {value}"
else:
return f"The string is {value}"


در اینجا، آرگومان value می‌تونه از نوع int یا str باشه.



5️⃣ استفاده از Any

اگر نوع داده مشخص نیست یا می‌تونه هر نوع داده‌ای باشه، از Any استفاده می‌کنیم:

from typing import Any

def print_value(value: Any) -> None:
print(f"The value is {value}")


جمع‌بندی
تایپ هینت ها در پایتون به شما کمک می‌کنن تا کدهای خواناتری بنویسین و با استفاده از ابزارهای بررسی تایپ خطاهای تایپ رو قبل از اجرای کد پیدا کنید. این قابلیت می‌تونه به ویژه در پروژه‌های بزرگ و تیم‌های توسعه نرم‌افزار مفید باشه. با استفاده از type hint ها، می‌تونید کدهای خودتون رو مستندسازی کنید و اون ها رو قابل فهم‌تر کنید و آسون‌تر نگهداری کنید.


#پایتون #python

@ninja_learn_ir
🔥13
Ninja Learn | نینجا لرن pinned «سلام رفقا 👋 تو اینستا پست جدید گذاشتیم بیاید حمایت کنید لطفا 🙏 کوئسشن باکس هم گذاشتیم هر کی هر سوالی داره بیاد بپرسه همه رو جواب میدیم ☺️ https://www.instagram.com/ninjalearn.ir?igsh=ZDk5bDBmNXBudnl6»
Ninja Learn | نینجا لرن
سلام رفقا 👋
صبح تون بخیر
کدوم دوره آموزشی رو بیشتر از همه دوست دارید واستون ضبط کنیم؟ 🆓️ دوره به صورت کاملا رایگان تو آپارت منتشر خواهد شد 🆓️
خب رفقا

اکثرتون دوره DRF خواستید

بزودی یه دوره کاربردی و Practical از DRF واستون ضبط میکنیم ✌️

منتظر خبرای خوب باشید 😊

شبتون بخیر 🌹
👍14
دوستان برای دوره drf دوست دارید به عنوان تمرین چه پروژه ای بزنیم؟👀
Final Results
30%
سایت اگهی (مثل دیوار)
7%
وبلاگ
41%
سیستم ازمون انلاین
22%
سوشیال مدیا
🔥7
#پست_جدید

💎 فرق بین let ،const و var در جاوااسکریپت برای تعریف متغیر 💎

تو جاوااسکریپت، سه نوع کلیدواژه (Keyword) برای تعریف متغیرها استفاده میشه: var، let و const.

هر کدوم از این کلیدواژه‌ها رفتار و ویژگی‌های خاص خودشون رو دارن که در ادامه به توضیح و مقایسه اون ها با مثال‌های مختلف می‌پردازیم.

1️⃣ کلمه کلیدی var:

کلمه کلیدی var قدیمی‌ترین روش برای تعریف متغیرها در جاوااسکریپته. متغیرهایی که با var تعریف میشن دارای این ویژگی‌ ها هستن:


دامنه (Scope):
کلمه کلیدی var به صورت "function scope" هست، به این معنی که اگه داخل یک تابع تعریف بشه، فقط در داخل همون تابع قابل دسترسیه. خارج از توابع، متغیرهای var در سطح Global تعریف میشن.

در block scope (داخل {})، متغیرهای var به صورت local عمل نمی‌کنن و همچنان در سطح تابع یا Global تعریف میشن.

Hoisting:
متغیرهای var به بالای محدوده (scope) خودشون هوست میشن، به این معنی که میشه قبل از تعریف اونها ازشون استفاده کرد.

مثال:

console.log(a); // undefined
var a = 5;
console.log(a); // 5

if (true) {
var b = 10;
}
console.log(b); // 10


2️⃣ کلمه کلیدی let:

کلمه کلیدی let یکی از دو روش جدیدتر (ES6) برای تعریف متغیر هاست. متغیرهایی که با let تعریف میشن دارای این ویژگی‌ها هستن:

دامنه (Scope):
کلمه کلیدی let دارای "block scope" هست، به این معنی که فقط در داخل بلاکی (بین {}) که داخلش تعریف شدن قابل دسترسی هستن.

Hoisting:
متغیرهای let هویست نمیشن و در محدوده‌ی temporal dead zone (TDZ) تا زمانی که تعریف نشدن قابل دسترسی نیستند.

مثال:

if (true) {
let x = 10;
console.log(x); // 10
}
// console.log(x); // ReferenceError: x is not defined

console.log(y); // ReferenceError: y is not defined
let y = 5;
console.log(y); // 5



3️⃣ کلمه کلیدی const:

کلمه کلیدی const یک روش جدیدتر (ES6) دیگه برای تعریف متغیر هاست. متغیرهایی که با const تعریف میشن دارای این ویژگی‌ ها هستن:


دامنه (Scope):
متغیر های const هم مشابه let دارای "block scope" هستن.

Hoisting:
متغیر های const مشابه let هویست نمیشن و در TDZ تا زمانی که تعریف نشدن قابل دسترسی نیستن.


تغییر مقدار (Reassignment):
متغیرهای const نمی‌تونن دوباره مقداردهی بشن، به این معنیه که پس از تعریف، نمیشه مقدار جدیدی بهشون داد. این نکته برای آبجکت ها و آرایه‌ها به معنای تغییرناپذیریشون نیست بلکه فقط به معنای تغییرناپذیری رفرنس (Reference) اونهاست.

مثال:

const pi = 3.14;
console.log(pi); // 3.14

// pi = 3.15; // TypeError: Assignment to constant variable

if (true) {
const y = 10;
console.log(y); // 10
}
// console.log(y); // ReferenceError: y is not defined

const arr = [1, 2, 3];
arr.push(4); // این مجاز ه چون ما مرجع آرایه رو تغییر نمیدیم بلکه مقدار داخلش رو تغییر میدیم
console.log(arr); // [1, 2, 3, 4]

// arr = [5, 6, 7]; // TypeError: Assignment to constant variable



جمع‌بندی

var:
دارای function scope، متغیرها به بالای scope هویست میشن.

let:
دارای block scope، متغیرها در محدوده‌ی TDZ هستن و هویست نمیشن.

const:
دارای block scope، متغیرها در محدوده‌ی TDZ هستن و هوست نمیشن، قابل تغییر نیستن پس از
تعریف.

⭕️ استفاده از let و const به دلیل رفتارهای مدرن‌تر و قابل پیش‌بینی‌ترشون نسبت به var توصیه میشه. ⭕️


#جاوااسکریپت #javascript

@ninja_learn_ir
7
سلام مجدد رفقا 👋

امروزم پست جدید تو اینستا گذاشتیم بیاید حمایت کنید لطفا 🙏

دمتون گرم 🌹
https://www.instagram.com/p/C9zyG7COigf/
4