Ninja Learn | نینجا لرن
1.27K 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
سلام رفقا 👋

صبحتون بخیر

بازم مثل هر روز پست جدید داریم تو اینستا راجب پایتون 🐍

ممنون میشم بیاید حمایت کنید

واقعا بهمون انرژی میده آموزش های بیشتری بذاریم 🌹

https://www.instagram.com/p/C91mSFVuGKv/?igsh=OGJjN3I2dW56bmI1
5
#پست_جدید

💎 فیکسچر (fixure) در جنگو 💎

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

چرا بهش نیاز داریم؟

1️⃣ تست‌های دقیق‌تر: با داشتن داده‌های مشخص، می‌تونیم تست‌های دقیق‌تری بنویسیم و مطمئن بشیم که همه چیز طبق انتظار کار می‌کنه.

2️⃣ تست‌های سریع‌تر: به جای اینکه هر بار قبل از اجرای تست‌ها، داده‌های مورد نیازمون رو به صورت دستی وارد دیتابیس کنیم، با استفاده از فیکسچر این کار رو یک بار انجام میدیم و در تست‌های بعدی از همون داده‌ها استفاده می‌کنیم.

3️⃣ تکرارپذیری تست‌ها: با استفاده از فیکسچر، می‌تونیم مطمئن باشیم که هر بار که تست‌هامون رو اجرا می‌کنیم، نتیجه یکسانی خواهیم داشت.

ساختن یه فیکسچر
برای ساختن یه فیکسچر، یه فایل با پسوند json یا yaml ایجاد می‌کنیم و داده‌های مورد نظرمون رو به صورت ساخت‌یافته در اون تعریف می‌کنیم.

مثال با فرمت JSON:

[
{
"model": "myapp.Product",
"pk": 1,
"fields": {
"name": "گوشی موبایل سامسونگ",
"price": 5000000
}
},
{
"model": "myapp.Category",
"pk": 1,
"fields": {
"name": "گوشی موبایل"
}
}
]


در این مثال، ما دو رکورد برای مدل‌های Product و Category تعریف کردیم.

استفاده از فیکسچر در تست‌ها

from django.test import TestCase
from .models import Product

class ProductTestCase(TestCase):
fixtures = ['products.json']

def test_product_detail(self):
product = Product.objects.get(pk=1)
self.assertEqual(product.name, 'گوشی موبایل سامسونگ')

در این مثال، ما به کلاس تست‌مون گفتیم که قبل از اجرای هر تستی، فیکسچر products.json رو لود کنه. بعد، در تست test_product_detail، محصول با id برابر با ۱ رو پیدا می‌کنیم و مطمئن می‌شیم که نام محصول درسته.


دستورات لازم و ساخت و لود کردن فیکسچر

1️⃣ ساختن یه فیکسچر با دستور dumpdata
دستور dumpdata بهت اجازه میده که داده‌های موجود در دیتابیس رو به صورت یک فایل JSON یا YAML خروجی بگیری. این فایل خروجی رو میتونی به عنوان فیکسچر استفاده کنی.

# برای خروجی گرفتن از همه مدل‌ها به صورت JSON:Bash
python manage.py dumpdata app_name.ModelName --format json --indent 2 --output my_fixture.json

# برای خروجی گرفتن از یک مدل خاص به صورت YAML:
python manage.py dumpdata app_name.ModelName --format yaml--indent 2 --output my_fixture.yaml


2️⃣ استفاده از فیکسچر با دستور loaddata
دستور loaddata بهت اجازه میده که داده‌های موجود در یک فایل فیکسچر رو به دیتابیس اضافه کنی.

# برای بارگذاری داده‌های یک فایل JSON:
python manage.py loaddata my_fixture.json

# برای بارگذاری داده‌های یک فایل YAML:
python manage.py loaddata products.yaml


مثال عملی
فرض کن یه وبسایت فروشگاهی داریم و میخوایم یه تست بنویسیم که بررسی کنه آیا محصولی با نام خاص در دیتابیس وجود داره یا نه. اول از همه، با استفاده از دستور dumpdata از مدل Product یه فیکسچر میگیریم:

python manage.py dumpdata app_name.Product --format json --indent 2 --output product.json

سپس، در تستمون، این فیکسچر رو لود می‌کنیم و محصول مورد نظر رو جستجو می‌کنیم:

from django.test import TestCase
from .models import Product

class ProductTestCase(TestCase):
fixtures = ['products.json']

def test_product_exists(self):
product = Product.objects.get(name='گوشی موبایل سامسونگ')
self.assertIsNotNone(product)


⭕️ نکات کلیدی فیکسچر به زبان ساده
ساختار فیکسچر: فیکسچرت باید شبیه به همون چیزی باشه که توی دیتابیس داری. مثلاً اگه یه مدل محصول داری، فیکسچرت هم باید یه محصول رو تعریف کنه.
اسم‌گذاری فیکسچر: به فیکسچرت یه اسم بامعنا بده تا بفهمی توش چه داده‌هایی داری. مثلاً products.json یعنی توش اطلاعات محصول‌ها هست.
مدیریت فیکسچر: وقتی تست‌های زیادی می‌نویسی، باید یه جوری فیکسچرهات رو مرتب کنی تا گم نشی. می‌تونی از فولدرهای مختلف یا ابزارهای مخصوص استفاده کنی.


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


⭕️ توجه: برای اطلاعات بیشتر و مثال های عملی تر، میتونید به مستندات رسمی جنگو مراجعه کنین.

#جنگو #تست #فیکسچر #برنامه_نویسی
👍42
Ninja Learn | نینجا لرن
🎥 رفقا دوره DRF ای که خواستید در حال ضبط هست و بزودی منتشر میشه و کلی چیز جدید و پیشرفته قراره بگیرید 👌

دومین دوره ای که بیشترین رای رو آورده دوره امنیت توی برنامه نویسی وبه به نظرتون دوره بعدی دوره امنیت توی برنامه نویسی وب باشه؟ 🤔
خب رفقا ۶۲ درصد به دوره امنیت رای دادید 😃

دوره بعد از DRF، امنیت توی برنامه نویسی وب هست 🤘

یه چیزایی از امنیت توی برنامه نویسی وب یادتون میدم که توی دوره های پولی هم کسی یاد نمیده 😉

منتظرش باشید 🔥
🔥7
رفقا، بنظرتون بعضی اوقات کوئیز بذاریم واستون دانش و تخصص خودتون رو بسنجید؟
Anonymous Poll
87%
آره، بذار
13%
نه، حسش نیست
1
سلام رفقا 👋

امیدوارم حال دلتون عالی باشه 😄

امروز یه پست خیلی مهم راجب جنگو داریم

مشکلی که خیلیا دارن و کسی توی دوره های آموزشی یادش نمیده یا کمتر کسی یاد میده

منتظرش باشید راس ساعت ۶ منتشر میشه 🤟

ارادتمند شما 🌹
👍4
🟡 کوئیز جاوااسکریپت

خروجی این کد چیه؟ (5 * "-")console.log
Anonymous Quiz
9%
Error
61%
پنج تا خط تیره (-----)
24%
NaN
6%
هیچکدوم
1
#پست_جدید

💎 مشکل N+1 توی جنگو 💎

امروز می‌خوایم در مورد یکی از مشکلاتی که ممکنه توی پروژه‌های جنگو باهاش برخورد کنیم صحبت کنیم. این مشکل اسمش N+1 هست و اگه بدونیم چیه و چطوری حلش کنیم، می‌تونیم برنامه‌های بهینه‌تر و سریع‌تری بنویسیم.


مشکل N+1 چیه؟

فرض کنید یک وبسایت فروشگاهی داریم که توش محصولات و دسته‌ بندی های محصولات داریم. هر محصول به یک دسته تعلق داره و هر دسته می‌تونه چندین محصول داشته باشه.

class Category(models.Model):
    name = models.CharField(max_length=100)

class Product(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)


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


چطوری از این مشکل جلوگیری کنیم؟


1️⃣ متد select_related:

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


مزایای استفاده از متد select_related؟

1- سرعت بیشتر: چون تعداد دفعات مراجعه به دیتابیس رو کم می‌کنه.
2- کاهش بار سرور: با کاهش تعداد کوئری‌ها، فشار روی سرور کمتر میشه.
3- کد تمیزتر: کدت منظم‌تر و قابل فهم‌تر میشه.


2️⃣ ابزار django-debug-toolbar:

جنگو یک ابزار دیباگ خیلی خوب داره به اسم django-debug-toolbar که بهتون کمک می‌کنه تا بتونین مشکلات پرفورمنسی برنامه‌تون رو شناسایی کنین. این ابزار بهتون نشون می‌ده که کدتون چند بار به دیتابیس مراجعه کرده و کجا مشکل N+1 وجود داره. با استفاده از این ابزار می‌تونین به راحتی مشکل N+1 رو پیدا کنین و برطرفش کنین.

⭕️ برای نصب این پکیج به این آدرس برید:
https://django-debug-toolbar.readthedocs.io/en/latest/installation.html


جمع‌بندی:

مشکل N+1 یکی از مشکلاتی هست که ممکنه در پروژه‌های جنگو باهاش برخورد کنین. این مشکل باعث میشه که برنامه‌تون کند بشه و پرفورمنسش کاهش پیدا کنه. با استفاده از متد select_related و ابزار django-debug-toolbar می‌تونین به راحتی این مشکل رو حل کنین و برنامه‌های بهینه‌تر و سریع‌تری بنویسین.

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

#جنگو #برنامه_نویسی #مشکل_N_plus_one #بهینه‌سازی #django_debug_toolbar
👍10
#کوئیز_جاوااسکریپت

کدام یک از روش‌های زیر برای اضافه کردن یک عنصر جدید به انتهای یک آرایه در جاوا اسکریپت صحیح است؟🤔
Anonymous Quiz
17%
array.add(element)
38%
array.push(element)
42%
array.append(element)
4%
array.insert(element)
👍4
#پست_جدید

💎 تست نویسی با pytest درجنگو 💎

امروز میخوایم با یکی از ابزارهای قدرتمند برای تست کردن اپلیکیشن‌های جنگویی آشنا بشیم به اسم Pytest 😁

چرا pytest؟
چون که خیلی ساده و روان هست، کلی قابلیت کاربردی داره و جامعه کاربری بزرگی پشتشه. با pytest میتونیم با خیال راحت کدهامون رو بنویسیم و مطمئن باشیم که همه چیز سر جای خودش کار میکنه.

1️⃣ اولین قدم: نصب pytest
برای نصب pytest کافیه توی ترمینال پروژه جنگوییتون این دستور رو بزنید:

pip install pytest

2️⃣ دومین قدم: پیکربندی Pytest

پیکربندی یعنی اینکه به Pytest بگیم چطوری تست‌هامون رو اجرا کنه. مثلاً بگیم تست‌هامون کجا هستن، چه جوری گزارش بدیم و از چه ابزارهای اضافه‌ای استفاده کنیم.

فایل پیکربندی: pytest.ini
برای پیکربندی Pytest، از فایلی به اسم pytest.ini استفاده می‌کنیم. این فایل رو تو ریشه پروژه یا توی پوشه‌ای که تست‌هامون توش هست می‌ذاریم.

پیکربندی برای پروژه های جنگو:👇

[pytest]
addopts = --verbose
testpaths = tests
DJANGO_SETTINGS_MODULE = 'myproject.settings.test'


حالا بریم چندتا مثال ببینیم😁


مثال های ساده:

1️⃣ تست مدل‌ها (models)
فرض کنین یه مدل User داریم:

from django.db import models

class User(models.Model):
username = models.CharField(max_length=100)
email = models.EmailField()

برای تست این مدل میتونیم یه تست بنویسیم که بررسی کنه آیا فیلدهای username و email اجباری هستن یا نه:

import pytest
from .models import User

def test_user_creation():
with pytest.raises(ValueError):
user = User.objects.create()

این تست سعی میکنه یه کاربر بدون مقداردهی کردن فیلدهای username و email ایجاد کنه. چون این فیلدها اجباری هستن، باید یه خطا از نوع ValueError بگیره.

2️⃣ تست ویوها (views)
حالا بیاین یه ویو ساده رو تست کنیم که یه لیست از
def user_list(request):
users = User.objects.all()
return render(request, 'users.html', {'users': users})

برای تست این ویو، میتونیم از یه کلاینت تست استفاده کنیم تا درخواست GET به این ویو بفرسته و نتیجه رو بررسی کنیم:
from django.test import Client

def test_user_list_view():
client = Client()
response = client.get('/users/')
assert response.status_code == 200

این تست یه درخواست GET به آدرس '/users/' میفرسته و بررسی میکنه که آیا پاسخ با کد وضعیت 200 (OK) برگشته یا نه.

3️⃣ تست URL ها
برای تست URL ها هم میتونیم از تابع resolve استفاده کنیم:

from django.urls import resolve

def test_user_list_url():
url = resolve('/users/')
assert url.func == user_list

این تست بررسی میکنه که آیا URL '/users/' به ویوی user_list اشاره میکنه یا نه.

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

⭕️ نکته: این فقط یه مقدمه بود! pytest قابلیت‌های خیلی بیشتری داره که میتونیم ازشون استفاده کنیم. مثلاً میتونیم تست‌های پارامتریزه شده، تست‌های پیچیده تر و تست‌های مربوط به قالب‌ها (templates) بنویسیم.
میتونید برای مطالعه بیشتر به داکیومنت pytest سر بزنید

#جنگو #پایتون #pytest
8
💎 ساختن چندتا ابجکت بصورت همزمان (bulk_create) در جنگو 💎

امروز میخوایم در مورد یکی از قابلیت‌های خیلی کاربردی جنگو به اسم Bulk Create صحبت کنیم. این قابلیت وقتی به دردتون میخوره که بخواید چندتا داده رو یکجا به دیتابیس اضافه کنید. مثلا فرض کنید میخواید اطلاعات ۱۰ تا محصول جدید رو تو فروشگاه آنلاینتون ثبت کنید. اگه بخواید هر کدوم رو تک تک سیو کنید که کلی وقتتون رو میگیره و اصلا به صرفه و بهینه نیست.

حالا ببینم Bulk Create چطوری کار میکنه؟🤔

به جای اینکه برای هر داده یه دستور سیو جداگانه بنویسیم، با Bulk Create میتونیم همه داده ها رو یکجا داخل یه لیست بریزیم و با یه دستور ساده همه رو با هم سیو کنیم. اینجوری سرعت کارمون خیلی بیشتر میشه و منابع سرور هم کمتر مصرف میشه.

1️⃣ مثال اول: اضافه کردن چندتا محصول جدید

فرض کنید مدل محصول ما این شکلیه:

class Product(models.Model):
name = models.CharField(max_length=100)
price = models.FloatField()
description = models.TextField()


حالا میخوایم چندتا محصول جدید به این شکل اضافه کنیم: 👇


products = [
Product(name='گوشی آیفون 14', price=15000000, description='بهترین گوشی سال'),
Product(name='لپتاپ دل XPS 13', price=25000000, description='لپتاپ فوق سبک و قدرتمند'),
# ... و بقیه محصولات
]

Product.objects.bulk_create(products)

با این کد، همه محصولات داخل لیست products یکجا به دیتابیس اضافه میشن.

2️⃣ مثال دوم: اضافه کردن چندتا کامنت به یک پست


class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
text = models.TextField()

comments = [
Comment(post=post, text='کامنت اول'),
Comment(post=post, text='کامنت دوم'),
# ... و بقیه کامنت‌ها
]

Comment.objects.bulk_create(comments)


اینجا هم به همین صورت، همه کامنت‌ها به یکجا به پست موردنظر اضافه میشن.

نکات مهم:

توجه: Bulk Create فقط برای ایجاد اشیاء جدید استفاده میشه. برای آپدیت کردن اشیاء موجود باید از روش‌های دیگه استفاده کنید.

بهینه سازی ⏱️: برای بهبود عملکرد، سعی کنید تعداد اشیایی که در هر بار Bulk Create ایجاد میکنید رو بهینه کنید. خیلی زیاد یا خیلی کم بودن تعداد اشیاء میتونه روی عملکرد سیستم تاثیر بگذاره.

خطاها : اگر در حین اجرای Bulk Create خطایی رخ بده، هیچکدوم از اشیاء ایجاد نمیشن. پس حتما قبل از اجرا، داده‌ها رو به خوبی اعتبارسنجی کنید.

جمع‌بندی

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

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

امیدوارم این آموزش براتون مفید بوده باشه :)

#جنگو #BulkCreate #برنامه_نویسی #پایتون #توسعه_وب #django #python #webdevelopment
👍122
بچه ها توی پیج کوسشن باکس گذاشتیم✌️

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

لینک کوسشن باکس👇
https://www.instagram.com/stories/ninjalearn.ir/3422061628463170151?igsh=MWF3ODl6aGw0ajhlZg==
👍3
سلام رفقا 👋

امیدوارم حال دلتون عالی باشه ❤️ متوجه شدیم پست های اینستامون رو دوست ندارید بنا به دلایلی و بازخورد نمیگیریم ازتون تو اینستا 🤔 دلیلش چیه به نظرتون؟ لطفا کمکمون کنید پست های بهتری بذاریم تو اینستا 🌹
Anonymous Poll
3%
با موضوع پستا حال نمیکنم
18%
کیفیت پستا پایینه
50%
حال ندارم بیام اینستا
29%
اکانت اینستا ندارم
👍3
💎 ریس کاندیشن (race condition) 💎

چند وقت پیش یه مشکلی داشتم که حسابی سرمو به دیوار کوبید. داشتم روی یه پروژه کار می‌کردم که یهو دیدم همه چی قاتی پاتی شده! 😫
بعد از کلی تحقیق فهمیدم که مشکل از یه چیز به اسم "ریس کاندیشن" بوده.

ریس کاندیشن چیه؟

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

ریس کاندیشن توی جنگو چطور پیش میاد؟

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

چطور از ریس کاندیشن جلوگیری کنیم؟

نگران نباشید، راه حل‌هایی برای این مشکل وجود داره. یکی از روش‌های رایج استفاده از قفل‌ها (Lock) هست. با استفاده از قفل‌ها می‌تونیم مطمئن بشیم که فقط یک درخواست در یک لحظه به یک داده خاص دسترسی داشته باشه.

در جنگو چطور؟

جنگو ابزارهای خوبی برای مدیریت ریس کاندیشن در اختیارمون قرار می‌ده. مثلا می‌تونیم از transaction و F() expressions استفاده کنیم.

🔒عملیات Transaction: با استفاده از transaction می‌تونیم یه سری عملیات رو به صورت یکپارچه انجام بدیم. یعنی اگه یکی از این عملیات با شکست مواجه بشه، همه عملیات لغو میشه. (توی پستای قبلی درموردش توضیح دادم)

استفاده از F() expressions: با استفاده از F() expressions می‌تونیم مقدار یک فیلد رو بر اساس مقدار فعلی اون فیلد تغییر بدیم. این کار به ما کمک می‌کنه تا از بروز مشکلات ناشی از همزمانی چندین درخواست جلوگیری کنیم.

📑خلاصه کلام:

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

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

💎 کلوژر (closure) در جاوااسکریپت 💎

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

کلوژر چیه؟

تصور کنید یه جعبه دارید که توش یه آبنبات و یه یادداشت هست. آبنبات رو می‌خورید، اما یادداشت همیشه با جعبه همراهه و هر وقت جعبه رو باز کنید، یادداشت رو می‌بینید. کلوژر هم همینجوریه!

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

مثال ساده:👇

function createCounter() {
let count = 0;
return function() {
count++;
return count;
}
}

let counter = createCounter();
console.log(counter()); // 1
console.log(counter());
// 2

در این مثال، تابع createCounter یه شمارنده می‌سازه. هر بار که این تابع رو صدا می‌زنیم، یه تابع جدید برمی‌گردونه که به متغیر count دسترسی داره. این متغیر حتی بعد از اینکه تابع createCounter اجرا شد، وجود داره و هر بار که تابع برگردونده شده رو صدا می‌زنیم، مقدار count یک واحد اضافه میشه.

چرا کلوژر مهمه؟

🏢 ساختارهای داده: کلوژر به ما کمک می‌کنه ساختارهای داده مثل private variables رو پیاده‌سازی کنیم.

مدولار بودن: با استفاده از کلوژر می‌تونیم کدهایمون رو به بخش‌های کوچکتر و مستقل تقسیم کنیم.

♻️ پیاده سازی Callback functions در کلوژر: کلوژر callback function‌ ها خیلی کاربرد داره.

✏️ طراحی الگوهای مختلف: بسیاری از الگوهای طراحی جاوااسکریپت از کلوژر استفاده می‌کنند.

خلاصه:

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

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

#جاوااسکریپت #کلوژر #برنامه_نویس
👍5
💎 کوکی (cookie) ها در وب 💎

🍪 کوکی چیه؟

تصور کن هر بار که به یک وبسایت میری، اون وبسایت یه یادداشت کوچولو توی کامپیوتر یا موبایلت می‌ذاره. این یادداشت‌ها رو کوکی میگن. کوکی‌ها فایل‌های خیلی کوچیکی هستن که اطلاعات خیلی کم و ساده‌ای رو ذخیره می‌کنن. مثلاً یادشون می‌مونه که تو چه اسم کاربری رو انتخاب کردی یا چه محصولاتی رو توی سبد خریدت گذاشتی.

کوکی‌ها چیکار می‌کنن؟

کوکی‌ها به وبسایت‌ها کمک می‌کنن تا:

1️⃣ تو رو بشناسن: وقتی دوباره به وبسایتی برمیگردی، کوکی‌ها به وبسایت کمک می‌کنن تا بفهمه که تو قبلاً اونجا بودی و تنظیمات شخصی‌سازی شده‌ تورو یادش بیاره.

2️⃣ تجربه‌ی کاربری رو بهتر کنن: مثلاً وقتی یه محصول رو توی یک فروشگاه آنلاین می‌بینی و بعد به سایت دیگه ای میری، ممکنه تبلیغات همون محصول رو ببینی. این به خاطر کوکی‌هاست که اطلاعاتی از جستجوهای قبلی تو ذخیره شده.

3️⃣ وبسایت رو بهتر کنند: وبسایت‌ها با استفاده از اطلاعاتی که از کوکی‌ها به دست می‌ آرند، می‌تونن وبسایتشون رو بهبود بدن و اون رو برای کاربران جذاب‌تر کنن.

کوکی‌ها چطور ساخته میشن؟

وقتی تو به یک وبسایت میری، سرور اون وبسایت (یعنی کامپیوتر بزرگی که وبسایت رو اجرا می‌کنه) یه کوکی رو می‌سازه و به مرورگرت می‌فرسته. مرورگرت هم اون کوکی رو توی کامپیوتر یا موبایلت ذخیره می‌کنه.

🍪 انواع کوکی‌ها

کوکی‌ها انواع مختلفی دارن که هر کدومشون کار خاصی انجام میدن. مثلاً:

1️⃣ کوکی‌های session: این کوکی‌ها فقط تا زمانی که تو در وبسایت هستی وجود دارن و وقتی از وبسایت خارج شدی، حذف میشن.

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

حرف آخر

کوکی‌ها به طور کلی بدون ضرر هستن و برای بهبود تجربه کاربری استفاده میشن. اما بعضی وقت‌ها ممکنه کوکی‌ها برای ردیابی فعالیت‌های آنلاینت استفاده بشن که این موضوع ممکنه نگرانی‌هایی رو در مورد حریم خصوصی ایجاد کنه.

امیدوارم این توضیحات برات مفید بوده باشه. اگر سوالی داشتی، حتما بپرس.

#کوکی #وبسایت #حریم_خصوصی #اینترنت
👍11🔥2
#پست_جدید

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

امروز میخوایم در مورد یکی از ابزارهای جذاب و کاربردی جنگو به اسم سیگنال‌ها (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
دوستان از محتوای کانال خوشتون میاد؟🤔 اگه نه ممنون میشم توی کامنتا بگید تا بهترشون کنیم❤️
Anonymous Poll
81%
بله عالین 😀
14%
نه جالب نیستن 🥱
5%
مزخرفن 😒
1
🚀 آموزش ساخت یک IDE ساده با پایتون و Tkinter

در این آموزش، نحوه ساخت یک محیط توسعه یکپارچه (IDE) ساده با استفاده از پایتون و کتابخانه Tkinter را به شما نشان خواهیم داد. این IDE به شما امکان می‌دهد تا کدهای پایتون خود را نوشته، ذخیره و اجرا کنید. برای شروع، از ابزارهای پایه‌ای استفاده خواهیم کرد، اما شما می‌توانید با افزودن قابلیت‌های بیشتر، IDE خود را پیشرفته‌تر کنید.

🛠 نصب Tkinter
Tkinter معمولاً با پایتون به صورت پیش‌فرض نصب می‌شود. اما اگر آن را ندارید، می‌توانید از دستور زیر برای نصب آن استفاده کنید:

pip install tk
📋 مراحل ساخت IDE

1. ایجاد پنجره اصلی IDE
2. افزودن ویجت‌های متن برای نوشتن کد
3. افزودن منوها برای باز کردن، ذخیره و اجرای فایل‌ها
4. اضافه کردن قابلیت اجرای کد پایتون

1. ایجاد پنجره اصلی IDE

ابتدا یک پنجره اصلی ایجاد می‌کنیم:
import tkinter as tk
from tkinter import filedialog, Text
import subprocess

def create_main_window():
window = tk.Tk()
window.title("پایتون IDE")
window.geometry("800x600")
return window

if __name__ == "__main__":
main_window = create_main_window()
main_window.mainloop()
2. افزودن ویجت‌های متن برای نوشتن کد

برای نوشتن کد، یک ویجت Text اضافه می‌کنیم:
def add_text_widget(window):
text_widget = Text(window, wrap='none')
text_widget.pack(expand=True, fill='both')
return text_widget

if __name__ == "__main__":
main_window = create_main_window()
text_editor = add_text_widget(main_window)
main_window.mainloop()
3. افزودن منوها برای باز کردن، ذخیره و اجرای فایل‌ها

یک منو برای باز کردن، ذخیره و اجرای فایل‌ها اضافه می‌کنیم:
def add_menu(window, text_widget):
menu = tk.Menu(window)
window.config(menu=menu)

file_menu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="فایل", menu=file_menu)

def open_file():
file_path = filedialog.askopenfilename(defaultextension=".py", filetypes=[("Python files", "*.py")])
if file_path:
with open(file_path, "r", encoding="utf-8") as file:
code = file.read()
text_widget.delete(1.0, tk.END)
text_widget.insert(tk.END, code)

def save_file():
file_path = filedialog.asksaveasfilename(defaultextension=".py", filetypes=[("Python files", "*.py")])
if file_path:
with open(file_path, "w", encoding="utf-8") as file:
code = text_widget.get(1.0, tk.END)
file.write(code)

def run_code():
code = text_widget.get(1.0, tk.END)
exec(code)

file_menu.add_command(label="باز کردن", command=open_file)
file_menu.add_command(label="ذخیره", command=save_file)
file_menu.add_separator()
file_menu.add_command(label="اجرا", command=run_code)

if __name__ == "__main__":
main_window = create_main_window()
text_editor = add_text_widget(main_window)
add_menu(main_window, text_editor)
main_window.mainloop()
4. اضافه کردن قابلیت اجرای کد پایتون

برای اجرای کد پایتون، از توابع داخلی پایتون استفاده می‌کنیم:
`
import tkinter as tk
from tkinter import filedialog, Text, messagebox

def create_main_window():
window = tk.Tk()
window.title("پایتون IDE")
window.geometry("800x600")
return window

def add_text_widget(window):
text_widget = Text(window, wrap='none')
text_widget.pack(expand=True, fill='both')
return text_widget

def add_menu(window, text_widget):
menu = tk.Menu(window)
window.config(menu=menu)

file_menu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="فایل", menu=file_menu)

def open_file():
file_path = filedialog.askopenfilename(defaultextension=".py", filetypes=[("Python files", "*.py")])
if file_path:
with open(file_path, "r", encoding="utf-8") as file:
code = file.read()
text_widget.delete(1.0, tk.END)
👍9🔥2
https://t.iss.one/+td1EcO_YfSphNTlk

دوستان این لینک گروهه میتونید توش جوین شید و چت بکنید و سوالاتونو بپرسید یا ... هرکار دیگه ای
👍2