چرا باید همین امروز از uv استفاده کنید؟
یک ابزار بهجای پنج ابزار
دیگر نیاز نیست با pip، venv، pyenv، pipx و poetry درگیر شوید.
سریع. واقعاً سریع.
نصاب و حلکننده Rust = سرعت باور نکردنی.
قابلتکرار
لاکفایل + sync کار تیمی و CI/CD را بدون دردسر میکند.
طراحیشده برای پایتون مدرن
PEP 517/518، معماری pyproject-first، متادیتای تمیز.
سازگار با هر جریان کاری
FastAPI، Django، پروژههای ML، ابزارهای CLI - همهچیز.
در نهایت پیشنهادم اینه که دفعه ی بعدی که خواستید یک پروژه ی پایتونی رو استارت بزنید، حتما کار با
پارت اول UV
پارت دوم UV
پارت سوم UV
پارت چهارم UV
پ.ن: یادتون نره پست رو با دوستاتون به اشتراک بذارید ❤️❤️
#پارت_پنجم #python #uv #virtualenv #tutorial #پایتون #آموزش_پایتون #برنامه_نویسی
@PhiloLearn
یک ابزار بهجای پنج ابزار
دیگر نیاز نیست با pip، venv، pyenv، pipx و poetry درگیر شوید.
سریع. واقعاً سریع.
نصاب و حلکننده Rust = سرعت باور نکردنی.
قابلتکرار
لاکفایل + sync کار تیمی و CI/CD را بدون دردسر میکند.
طراحیشده برای پایتون مدرن
PEP 517/518، معماری pyproject-first، متادیتای تمیز.
سازگار با هر جریان کاری
FastAPI، Django، پروژههای ML، ابزارهای CLI - همهچیز.
در نهایت پیشنهادم اینه که دفعه ی بعدی که خواستید یک پروژه ی پایتونی رو استارت بزنید، حتما کار با
UV رو امتحان کنید. یه حسی بهم میگه اصلا از این کار پشیمون نخواهید شد.پارت اول UV
پارت دوم UV
پارت سوم UV
پارت چهارم UV
پ.ن: یادتون نره پست رو با دوستاتون به اشتراک بذارید ❤️❤️
#پارت_پنجم #python #uv #virtualenv #tutorial #پایتون #آموزش_پایتون #برنامه_نویسی
@PhiloLearn
❤2
Forwarded from محتوای آزاد سهراب (Sohrab)
توی این ویدئو رفتیم سراغ دستور pwd تا ببینیم دقیقاً چیکار میکنه و یک پیادهسازی ساده از اون رو داخل سی پلاس پلاس (بله سی پلاس پلاس) انجام دادیم.
تماشا از یوتوب
تماشا از پیرتوب
@SohrabContents
تماشا از یوتوب
تماشا از پیرتوب
@SohrabContents
❤3
درسته که ۲۰۲۵ سال لینوکس دسکتاپ نبود ولی
۲۰۲۶ دیگه واقعا قراره سال لینوکس دسکتاپ باشه...
#fun@PhiloLearn
۲۰۲۶ دیگه واقعا قراره سال لینوکس دسکتاپ باشه...
#fun@PhiloLearn
❤3
یه لایبر بامزه ی GUI پایتونی پیدا کردم به اسم PyWebview.
خیلی ساده بگم:
PyWebview یه جور wrapper کوچیک و خلوته که میاد یه پنجره سبک برایت باز میکنه و داخلش HTML/CSS/JS خودت رو میذاری. نه الکترونه که رم سیستم رو بخوره، نه پیچیدگی فریمورکهای UI رو داره.
بکند پایتون + مرورگر خلوت = اپ دسکتاپ تمیز.
چرا باید ازش خوشت بیاد؟
- چون واقعا سبکه.
- چون اتصال پایتون به فرانت خیلی راحته.
- چون روی ویندوز، لینوکس و مک نیتو اجرا میشه.
- و بهترین بخش: دقیقا همون چیزی رو بهت میده که لازم داری، بدون خزعبلات اضافه.
برای نصب؟
اولین کدتون:
یه پنجره باز میشه، همینقدر ساده و بیدردسر.
لینک:
https://pywebview.flowrl.com
#ابزار #پایتون
💙💙 @PhiloLearn 💙💙
خیلی ساده بگم:
PyWebview یه جور wrapper کوچیک و خلوته که میاد یه پنجره سبک برایت باز میکنه و داخلش HTML/CSS/JS خودت رو میذاری. نه الکترونه که رم سیستم رو بخوره، نه پیچیدگی فریمورکهای UI رو داره.
بکند پایتون + مرورگر خلوت = اپ دسکتاپ تمیز.
چرا باید ازش خوشت بیاد؟
- چون واقعا سبکه.
- چون اتصال پایتون به فرانت خیلی راحته.
- چون روی ویندوز، لینوکس و مک نیتو اجرا میشه.
- و بهترین بخش: دقیقا همون چیزی رو بهت میده که لازم داری، بدون خزعبلات اضافه.
برای نصب؟
pip install pywebview
اولین کدتون:
import webview
window = webview.create_window("PyWebview Demo", html="<h1>Hello World!</h1>")
webview.start()
یه پنجره باز میشه، همینقدر ساده و بیدردسر.
لینک:
https://pywebview.flowrl.com
#ابزار #پایتون
💙💙 @PhiloLearn 💙💙
👍2
۹. از User مدل پیشفرض Django استفاده کنم یا یه User سفارشی بسازم؟
جواب کوتاه:
با همون User پیشفرض شروع کن. برای پروژهی بعدیت برو سمت User سفارشی.
🟢 چه زمانی از User پیشفرض استفاده کنیم؟
- وقتی یک پروژه جدید رو شروع میکنی
- وقتی همون حالت عادی username/email/password برات کافیه
- وقتی داری پروتوتایپ میسازی
- وقتی میتونی با یه Profile مدل اضافی امکانات بیشتر اضافه کنی
🔵 چه زمانی User سفارشی لازم داریم؟
- وقتی میخوای ورود فقط با ایمیل باشه (بدون username)
- وقتی فیلدهای کاربر خیلی متفاوتن
- وقتی از همون اول پروژه این تصمیم رو گرفتی (بعداً تغییر دادنش سخت میشه)
اگر الان داری از User پیشفرض استفاده میکنی:
این روش ۹۰٪ مواقع کافیه و دردسرهای Custom User رو هم نداره.
اگر از صفر داری شروع میکنی و User سفارشی میخوای:
قانون من:
اگر شک داری، اصلاً سمت User سفارشی نرو. همون User پیشفرض + مدل Profile بهترین انتخابه.
پ.ن: یادتون نره پستا رو با دوستاتون به اشتراک بذارید ❤️❤️
پارت اول ۲۰ سوال جنگو
پارت دوم ۲۰ سوال جنگو
پارت سوم ۲۰ سوال جنگو
پارت چهارم ۲۰ سوال جنگو
پارت پنجم ۲۰ سوال جنگو
پارت ششم ۲۰ سوال جنگو
پارت هفتم ۲۰ سوال جنگو
پارت هشتم ۲۰ سوال جنگو
#پارت_نهم #جنگو #django #پایتون #برنامه_نویسی
@PhiloLearn
جواب کوتاه:
با همون User پیشفرض شروع کن. برای پروژهی بعدیت برو سمت User سفارشی.
🟢 چه زمانی از User پیشفرض استفاده کنیم؟
- وقتی یک پروژه جدید رو شروع میکنی
- وقتی همون حالت عادی username/email/password برات کافیه
- وقتی داری پروتوتایپ میسازی
- وقتی میتونی با یه Profile مدل اضافی امکانات بیشتر اضافه کنی
🔵 چه زمانی User سفارشی لازم داریم؟
- وقتی میخوای ورود فقط با ایمیل باشه (بدون username)
- وقتی فیلدهای کاربر خیلی متفاوتن
- وقتی از همون اول پروژه این تصمیم رو گرفتی (بعداً تغییر دادنش سخت میشه)
اگر الان داری از User پیشفرض استفاده میکنی:
# توسعه User با OneToOne Profile
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField()
avatar = models.ImageField()
phone = models.CharField(max_length=20)
# دسترسی
user.profile.bio
این روش ۹۰٪ مواقع کافیه و دردسرهای Custom User رو هم نداره.
اگر از صفر داری شروع میکنی و User سفارشی میخوای:
# User سفارشی با ورود ایمیلی
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']
settings.py :AUTH_USER_MODEL = 'core.User'
قانون من:
اگر شک داری، اصلاً سمت User سفارشی نرو. همون User پیشفرض + مدل Profile بهترین انتخابه.
پ.ن: یادتون نره پستا رو با دوستاتون به اشتراک بذارید ❤️❤️
پارت اول ۲۰ سوال جنگو
پارت دوم ۲۰ سوال جنگو
پارت سوم ۲۰ سوال جنگو
پارت چهارم ۲۰ سوال جنگو
پارت پنجم ۲۰ سوال جنگو
پارت ششم ۲۰ سوال جنگو
پارت هفتم ۲۰ سوال جنگو
پارت هشتم ۲۰ سوال جنگو
#پارت_نهم #جنگو #django #پایتون #برنامه_نویسی
@PhiloLearn
❤2
۱۰. بهترین روش برای مدیریت آپلود فایل در Django چیه؟
جواب کوتاه:
از FileField استفاده کن و برای محیط واقعی (production) فایلها رو روی S3 یا Google Cloud Storage بذار.
🟢 برای پروژههای کوچیک (کمتر از ۱۰۰۰ کاربر)
سرو کردن فایلها با nginx:
این روش برای توسعه و پروژههای کوچیک کاملاً اوکیه.
🔵 برای پروداکشن (Production)
برو سراغ django-storages + S3
مدل تغییری نمیکنه:
و Django خودش آپلود به S3 رو هندل میکنه:
🔒 نکات امنیتی
۱. نوع فایل رو چک کن
۲. اندازه فایل رو محدود کن
قانون من:
برای توسعه و تست از فایلسیستم لوکال استفاده کن. برای پروڈاکشن S3 بهترین انتخابه.
پ.ن: یادتون نره پستا رو با دوستاتون به اشتراک بذارید ❤️❤️
پارت اول ۲۰ سوال جنگو
پارت دوم ۲۰ سوال جنگو
پارت سوم ۲۰ سوال جنگو
پارت چهارم ۲۰ سوال جنگو
پارت پنجم ۲۰ سوال جنگو
پارت ششم ۲۰ سوال جنگو
پارت هفتم ۲۰ سوال جنگو
پارت هشتم ۲۰ سوال جنگو
پارت نهم ۲۰ سوال جنگو
#پارت_دهم #جنگو #django #پایتون #برنامه_نویسی
@PhiloLearn
جواب کوتاه:
از FileField استفاده کن و برای محیط واقعی (production) فایلها رو روی S3 یا Google Cloud Storage بذار.
🟢 برای پروژههای کوچیک (کمتر از ۱۰۰۰ کاربر)
# ذخیره فایل روی فایلسیستم لوکال
class Document(models.Model):
file = models.FileField(upload_to='documents/')
سرو کردن فایلها با nginx:
location /media/ {
alias /var/www/myproject/media/;
}این روش برای توسعه و پروژههای کوچیک کاملاً اوکیه.
🔵 برای پروداکشن (Production)
برو سراغ django-storages + S3
# settings.py
INSTALLED_APPS += ['storages']
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
AWS_STORAGE_BUCKET_NAME = 'mybucket'
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
مدل تغییری نمیکنه:
class Document(models.Model):
file = models.FileField(upload_to='documents/')
و Django خودش آپلود به S3 رو هندل میکنه:
document = Document.objects.create(file=request.FILES['file'])
🔒 نکات امنیتی
۱. نوع فایل رو چک کن
from django.core.exceptions import ValidationError
def validate_file_extension(value):
allowed = ['.pdf', '.doc', '.docx']
ext = os.path.splitext(value.name)[1]
if ext.lower() not in allowed:
raise ValidationError('Unsupported file type')
class Document(models.Model):
file = models.FileField(
upload_to='documents/',
validators=[validate_file_extension]
)
۲. اندازه فایل رو محدود کن
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
fields = ['file']
def clean_file(self):
file = self.cleaned_data['file']
if file.size > 10 * 1024 * 1024: # 10MB
raise ValidationError('File too large (max 10MB)')
return file
قانون من:
برای توسعه و تست از فایلسیستم لوکال استفاده کن. برای پروڈاکشن S3 بهترین انتخابه.
پ.ن: یادتون نره پستا رو با دوستاتون به اشتراک بذارید ❤️❤️
پارت اول ۲۰ سوال جنگو
پارت دوم ۲۰ سوال جنگو
پارت سوم ۲۰ سوال جنگو
پارت چهارم ۲۰ سوال جنگو
پارت پنجم ۲۰ سوال جنگو
پارت ششم ۲۰ سوال جنگو
پارت هفتم ۲۰ سوال جنگو
پارت هشتم ۲۰ سوال جنگو
پارت نهم ۲۰ سوال جنگو
#پارت_دهم #جنگو #django #پایتون #برنامه_نویسی
@PhiloLearn
❤2
Forwarded from FuckingProgrammingBook
چاپ سوم این راهنمای معتبر، کاربرد عملی توسعه آزمونمحور (TDD) در ساخت برنامههای وب واقعی با پایتون را نشان میدهد. شما میآموزید که چگونه با نوشتن آزمونها قبل از هر بخش کد و سپس نوشتن حداقل کد لازم برای عبور از آنها، به نرمافزاری تمیز، قابل اعتماد و با قابلیت نگهداری بالا دست یابید. این کتاب که برای پایتون ۳.۱۱ و جنگو ۴ بهروز شده، با بیانی عملی و مثالمحور، مبانی جنگو، سلنیوم، جاوااسکریپت، Git و Mock Objects را آموزش داده و نشان میدهد TDD چگونه طراحی سادهتر و اطمینان بیشتر به کد را به ارمغان میآورد. مباحث کلیدی شامل گردش کار کامل TDD، نوشتن آزمون واحد و عملکردی، mock objects، استقرار خودکار با Docker، تست در محیط stage، یکپارچهسازی مستمر (CI) و ساخت REST API با رابط جاوااسکریپت میشود.
لینک کتاب
#book
@FuckingProgrammingBooks
📚📚 @PhiloLearn 📚📚
لینک کتاب
#book
@FuckingProgrammingBooks
📚📚 @PhiloLearn 📚📚
👍1
پیشنهاد و انتقاد و درخواستی اگر داشتید، دایرکت کانال @PhiloLearn درش به روی همه ی شما عزیزان بازه 💙💙
❤1
Forwarded from Linuxor ?
آقای Geoffrey Hinton، معروف به پدرخوانده AI، یه هشدار داده که اگه فکر میکنین با رشد سریع هوش مصنوعی بهتره رشتهتون رو عوض کنین، دست نگه دارین. Computer Science فقط کدنویسی نیست، یادگیری سیستمها، ریاضی و حل مسئله مهارتهایی هستن که AI هیچ وقت نمیتونه کامل جایگزینشون بشه.
حتی اگه AI داره خیلی از کارای برنامهنویسی رو انجام میده، داشتن پایه قوی توی CS هنوز ارزش داره و کمک میکنه که بتونین نوآوری کنین و مهارتهاتون رو به سطح بعدی برسونین. Hinton حتی توصیه کرده کدنویسی رو یاد بگیرین؛ مثل خوندن لاتین، شاید مستقیم استفاده نکنین ولی مغزتون رو قوی میکنه.
@Linuxor
حتی اگه AI داره خیلی از کارای برنامهنویسی رو انجام میده، داشتن پایه قوی توی CS هنوز ارزش داره و کمک میکنه که بتونین نوآوری کنین و مهارتهاتون رو به سطح بعدی برسونین. Hinton حتی توصیه کرده کدنویسی رو یاد بگیرین؛ مثل خوندن لاتین، شاید مستقیم استفاده نکنین ولی مغزتون رو قوی میکنه.
@Linuxor
❤1
۱۱. چطور یک پروژه بزرگ Django رو ساختاردهی کنم؟
جواب کوتاه:
بر اساس ویژگی (Feature) ساختار بده، نه بر اساس لایه (models/views/serializers).
❌ ساختار بد (بر اساس لایه)
مشکل:
برای فهمیدن یه فیچر باید بین ۵ تا فایل بپری. سرعتت افتضاح میشه.
✅ ساختار خوب (بر اساس فیچر)
اینجوری هر فیچر همه فایلهای مربوط به خودش رو داره.
خوانایی بالا میره و نگهداری راحتتر میشه.
🟦 برای پروژههای خیلی بزرگ
وقتی هر app خیلی گنده شد، میتونی داخلش فولدرهای لایهای بسازی:
این ساختار برای تیمهای بزرگ یا پروژههای enterprise عالیه.
قانون من:
کدی که با هم استفاده میشه باید کنار هم باشه.
اگه برای پیدا کردن یک فیچر باید اسکرول کنی یا بپری اینور و اونور، ساختارت اشتباهه.
پ.ن: یادتون نره پستا رو با دوستاتون به اشتراک بذارید ❤️❤️
پارت اول ۲۰ سوال جنگو
پارت دوم ۲۰ سوال جنگو
پارت سوم ۲۰ سوال جنگو
پارت چهارم ۲۰ سوال جنگو
پارت پنجم ۲۰ سوال جنگو
پارت ششم ۲۰ سوال جنگو
پارت هفتم ۲۰ سوال جنگو
پارت هشتم ۲۰ سوال جنگو
پارت نهم ۲۰ سوال جنگو
پارت دهم ۲۰ سوال جنگو
#پارت_یازدهم #جنگو #django #پایتون #برنامه_نویسی
@PhiloLearn
جواب کوتاه:
بر اساس ویژگی (Feature) ساختار بده، نه بر اساس لایه (models/views/serializers).
❌ ساختار بد (بر اساس لایه)
myproject/
├── models/
│ ├── user.py
│ ├── post.py
│ └── comment.py
├── views/
│ ├── user_views.py
│ ├── post_views.py
│ └── comment_views.py
├── serializers/
│ ├── user_serializers.py
│ ├── post_serializers.py
│ └── comment_serializers.py
└── ...
مشکل:
برای فهمیدن یه فیچر باید بین ۵ تا فایل بپری. سرعتت افتضاح میشه.
✅ ساختار خوب (بر اساس فیچر)
myproject/
├── users/
│ ├── models.py
│ ├── views.py
│ ├── serializers.py
│ ├── urls.py
│ └── tests.py
├── posts/
│ ├── models.py
│ ├── views.py
│ ├── serializers.py
│ ├── urls.py
│ └── tests.py
└── core/
├── utils.py
├── middleware.py
└── base_models.py
اینجوری هر فیچر همه فایلهای مربوط به خودش رو داره.
خوانایی بالا میره و نگهداری راحتتر میشه.
🟦 برای پروژههای خیلی بزرگ
وقتی هر app خیلی گنده شد، میتونی داخلش فولدرهای لایهای بسازی:
myproject/
├── users/
│ ├── models/
│ │ ├── user.py
│ │ ├── profile.py
│ │ └── permissions.py
│ ├── views/
│ │ ├── auth.py
│ │ ├── profile.py
│ │ └── admin.py
│ ├── serializers/
│ ├── tests/
│ └── urls.py
└── ...
این ساختار برای تیمهای بزرگ یا پروژههای enterprise عالیه.
قانون من:
کدی که با هم استفاده میشه باید کنار هم باشه.
اگه برای پیدا کردن یک فیچر باید اسکرول کنی یا بپری اینور و اونور، ساختارت اشتباهه.
پ.ن: یادتون نره پستا رو با دوستاتون به اشتراک بذارید ❤️❤️
پارت اول ۲۰ سوال جنگو
پارت دوم ۲۰ سوال جنگو
پارت سوم ۲۰ سوال جنگو
پارت چهارم ۲۰ سوال جنگو
پارت پنجم ۲۰ سوال جنگو
پارت ششم ۲۰ سوال جنگو
پارت هفتم ۲۰ سوال جنگو
پارت هشتم ۲۰ سوال جنگو
پارت نهم ۲۰ سوال جنگو
پارت دهم ۲۰ سوال جنگو
#پارت_یازدهم #جنگو #django #پایتون #برنامه_نویسی
@PhiloLearn
❤6
PhiloLearn | فیلولرن
def validate_file_extension(value):
allowed = ['.pdf', '.doc', '.docx']
ext = os.path.splitext(value.name)[1]
if ext.lower() not in allowed:
raise ValidationError('Unsupported file type')
allowed = ['.pdf', '.doc', '.docx']
ext = os.path.splitext(value.name)[1]
if ext.lower() not in allowed:
raise ValidationError('Unsupported file type')
دوستان توی کامنت ها اشاره کردن که این روش درستی نیست و خب حق با ایشان است. اینکار میتونه خطرات خیلی زیادی هم به همراه داشته باشه.
اگر خواستید نوع فایل رو چک کنید راه های به نسبت امن تر و بهینه تر زیادی هست.
مثلا شما میتونید خودتون Head فایل رو چک کنید یا از libmagic و لایبری پایتون
مثال:
لینک pypi
#نکتک@PhiloLearn
اگر خواستید نوع فایل رو چک کنید راه های به نسبت امن تر و بهینه تر زیادی هست.
مثلا شما میتونید خودتون Head فایل رو چک کنید یا از libmagic و لایبری پایتون
python-magic استفاده کنید که استفاده ازش هم خیلی راحته.مثال:
>>> import magic
>>> magic.from_file("testdata/test.pdf")
'PDF document, version 1.2'
# recommend using at least the first 2048 bytes, as less can produce incorrect identification
>>> magic.from_buffer(open("testdata/test.pdf", "rb").read(2048))
'PDF document, version 1.2'
>>> magic.from_file("testdata/test.pdf", mime=True)
'application/pdf'
لینک pypi
#نکتک@PhiloLearn
PyPI
python-magic
File type identification using libmagic
❤5
Forwarded from DevTwitter | توییت برنامه نویسی
لازم نیست ساعتها گوگل کنی برای پیدا کردن APIهای رایگان!
یه ریپازیتوری که هر دولوپری باید تو بوکمارکهاش داشته باشه:
https://github.com/public-apis/public-apis
لیست کاملاً مرتبشده و بهروز از صدها API عمومی و رایگان در همه حوزهها: Weather - Finance - Music - Animals - Jokes - Crypto Maps و صدها مورد دیگه.
@DevTwitter | <POURYA/>
یه ریپازیتوری که هر دولوپری باید تو بوکمارکهاش داشته باشه:
https://github.com/public-apis/public-apis
لیست کاملاً مرتبشده و بهروز از صدها API عمومی و رایگان در همه حوزهها: Weather - Finance - Music - Animals - Jokes - Crypto Maps و صدها مورد دیگه.
@DevTwitter | <POURYA/>
❤3
۱۲. از سیگنالهای Django استفاده کنم یا مستقیم متد را صدا بزنم؟
جواب کوتاه:
۹۰٪ مواقع مستقیم متد رو صدا بزن. سیگنال فقط وقتی لازم شد.
✔️ کی از سیگنال استفاده کنیم؟
فقط وقتی:
- میخوای اپها از هم جدا باشن (app A نباید app B رو import کنه)
- با مدلهای داخلی Django کار داری (مثل User، Group)
- میخوای اپهای سومشخص بتونن به eventهای تو واکنش نشون بدن
❌ کی از سیگنال استفاده نکنیم؟
وقتی:
- کدها در یک اپ هستن
- میخوای جریان کد واضح و قابلردگیری باشه
- دیباگ کردن مهمه
سیگنالها جریان کد رو پنهان میکنن و پیدا کردن مشکل سخت میشه.
مثال:
❌ مثال بد – سیگنال بیدلیل
مشکل:
اصلاً معلوم نیست ایمیل کجا ارسال میشه! پاکِ پنهانی.
✅ مثال خوب – مستقیم و واضح
واضح، قابلفهم، ساده برای دیباگ.
✅ مثال خوب – وقتی سیگنال واقعاً لازم است (برای decoupling)
در اپ analytics که نباید از اپ orders ایمپورت مستقیم داشته باشه:
اینجا سیگنال کاملاً منطقیه.
قانون من:
اگر میتونی متد رو مستقیم صدا بزنی، سیگنال استفاده نکن.
سیگنال رو فقط وقتی لازم داری که واقعا decoupling مهم باشه.
پ.ن: یادتون نره پستا رو با دوستاتون به اشتراک بذارید ❤️❤️
پارت اول ۲۰ سوال جنگو
پارت دوم ۲۰ سوال جنگو
پارت سوم ۲۰ سوال جنگو
پارت چهارم ۲۰ سوال جنگو
پارت پنجم ۲۰ سوال جنگو
پارت ششم ۲۰ سوال جنگو
پارت هفتم ۲۰ سوال جنگو
پارت هشتم ۲۰ سوال جنگو
پارت نهم ۲۰ سوال جنگو
پارت دهم ۲۰ سوال جنگو
پارت یازدهم ۲۰ سوال جنگو
#پارت_دوازدهم #جنگو #django #پایتون #برنامه_نویسی
@PhiloLearn
جواب کوتاه:
۹۰٪ مواقع مستقیم متد رو صدا بزن. سیگنال فقط وقتی لازم شد.
✔️ کی از سیگنال استفاده کنیم؟
فقط وقتی:
- میخوای اپها از هم جدا باشن (app A نباید app B رو import کنه)
- با مدلهای داخلی Django کار داری (مثل User، Group)
- میخوای اپهای سومشخص بتونن به eventهای تو واکنش نشون بدن
❌ کی از سیگنال استفاده نکنیم؟
وقتی:
- کدها در یک اپ هستن
- میخوای جریان کد واضح و قابلردگیری باشه
- دیباگ کردن مهمه
سیگنالها جریان کد رو پنهان میکنن و پیدا کردن مشکل سخت میشه.
مثال:
❌ مثال بد – سیگنال بیدلیل
from django.db.models.signals import post_save
from django.dispatch import receiver
class Order(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
total = models.DecimalField(max_digits=10, decimal_places=2)
@receiver(post_save, sender=Order)
def send_order_confirmation(sender, instance, created, **kwargs):
if created:
send_email(instance.user.email, 'Order confirmed')
مشکل:
اصلاً معلوم نیست ایمیل کجا ارسال میشه! پاکِ پنهانی.
✅ مثال خوب – مستقیم و واضح
class Order(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
total = models.DecimalField(max_digits=10, decimal_places=2)
def send_confirmation_email(self):
send_email(self.user.email, 'Order confirmed')
# In view
order = Order.objects.create(user=user, total=100)
order.send_confirmation_email()
واضح، قابلفهم، ساده برای دیباگ.
✅ مثال خوب – وقتی سیگنال واقعاً لازم است (برای decoupling)
در اپ analytics که نباید از اپ orders ایمپورت مستقیم داشته باشه:
from django.dispatch import receiver
from orders.signals import order_created # Custom signal
@receiver(order_created)
def track_order_analytics(sender, order, **kwargs):
AnalyticsEvent.objects.create(
event_type='order_created',
order_id=order.id
)
اینجا سیگنال کاملاً منطقیه.
قانون من:
اگر میتونی متد رو مستقیم صدا بزنی، سیگنال استفاده نکن.
سیگنال رو فقط وقتی لازم داری که واقعا decoupling مهم باشه.
پ.ن: یادتون نره پستا رو با دوستاتون به اشتراک بذارید ❤️❤️
پارت اول ۲۰ سوال جنگو
پارت دوم ۲۰ سوال جنگو
پارت سوم ۲۰ سوال جنگو
پارت چهارم ۲۰ سوال جنگو
پارت پنجم ۲۰ سوال جنگو
پارت ششم ۲۰ سوال جنگو
پارت هفتم ۲۰ سوال جنگو
پارت هشتم ۲۰ سوال جنگو
پارت نهم ۲۰ سوال جنگو
پارت دهم ۲۰ سوال جنگو
پارت یازدهم ۲۰ سوال جنگو
#پارت_دوازدهم #جنگو #django #پایتون #برنامه_نویسی
@PhiloLearn
❤4
Forwarded from DevTwitter | توییت برنامه نویسی
رقیبمون با یه محصول "زشت" بازار رو گرفت؛ در حالی که ما درگیر خوشگل کردن دکمهها بودیم!
چند سال پیش توی پروژهای بودم که مدیرش عاشق کلمه پرفکت بود. هر دوشنبه جلسه میذاشتیم. روی وایتبرد ایدههای شاهکار مینوشتیم. "این دکمه انیمیشن داشته باشه."، "اون گزارش باید خروجی اکسل و PDF همزمان بده."، "UI باید در حد اپل باشه."
ما داشتیم برای ایدهآل میجنگیدیم. احساس میکردیم قراره تاریخسازی میکنیم.
نتیجه؟ یه فاجعهی تمامعیار.
۶ ماه گذشت و ما هنوز داشتیم دکمهها رو پولیش میکردیم. یه روز صبح بیدار شدیم و دیدیم رقیبمون با یه محصول "نصفه و نیمه"، "زشت" و "باگدار" اومد بالا.
ما خندیدیم: "این چیه؟ آبروریزیه!" ولی بازار نخندید. بازار خرید.
چرا؟ چون وقتی ما داشتیم توی آزمایشگاه روی "کمالگرایی" کار میکردیم، اونا داشتن توی "بازار" فیدبک میگرفتن. اونا باگهاشون رو با مشتری حل کردن، ما باگهامون رو با تخیلاتمون.
به این پدیده میگن: Feature Creep (خزش ویژگی). این قاتلیه که با لباس شیک کیفیت میاد تو شرکتت و استارتاپت رو خفه میکنه.
رید هافمن (بنیانگذار لینکدین) یه جمله داره که میگه: "اگر از اولین نسخه محصولتان شرمنده نیستید، یعنی خیلی دیر لانچ کردهاید."
محصول کامل، محصولیه که مرده. محصول زنده، ناقصه ولی داره کار میکنه.
درس امروز: هر فیچری که قبل از لانچ (فقط برای خوشگلتر شدن) اضافه میکنی، یه میخ جدید به تابوت محصولته.
@DevTwitter | <Hossein Moradi/>
چند سال پیش توی پروژهای بودم که مدیرش عاشق کلمه پرفکت بود. هر دوشنبه جلسه میذاشتیم. روی وایتبرد ایدههای شاهکار مینوشتیم. "این دکمه انیمیشن داشته باشه."، "اون گزارش باید خروجی اکسل و PDF همزمان بده."، "UI باید در حد اپل باشه."
ما داشتیم برای ایدهآل میجنگیدیم. احساس میکردیم قراره تاریخسازی میکنیم.
نتیجه؟ یه فاجعهی تمامعیار.
۶ ماه گذشت و ما هنوز داشتیم دکمهها رو پولیش میکردیم. یه روز صبح بیدار شدیم و دیدیم رقیبمون با یه محصول "نصفه و نیمه"، "زشت" و "باگدار" اومد بالا.
ما خندیدیم: "این چیه؟ آبروریزیه!" ولی بازار نخندید. بازار خرید.
چرا؟ چون وقتی ما داشتیم توی آزمایشگاه روی "کمالگرایی" کار میکردیم، اونا داشتن توی "بازار" فیدبک میگرفتن. اونا باگهاشون رو با مشتری حل کردن، ما باگهامون رو با تخیلاتمون.
به این پدیده میگن: Feature Creep (خزش ویژگی). این قاتلیه که با لباس شیک کیفیت میاد تو شرکتت و استارتاپت رو خفه میکنه.
رید هافمن (بنیانگذار لینکدین) یه جمله داره که میگه: "اگر از اولین نسخه محصولتان شرمنده نیستید، یعنی خیلی دیر لانچ کردهاید."
محصول کامل، محصولیه که مرده. محصول زنده، ناقصه ولی داره کار میکنه.
درس امروز: هر فیچری که قبل از لانچ (فقط برای خوشگلتر شدن) اضافه میکنی، یه میخ جدید به تابوت محصولته.
@DevTwitter | <Hossein Moradi/>
👍5❤1🤣1
دوستان
میشه بگید که بالایی به نظرتون بهتره یا پایینی
غزل 102
غزل 102
دوش آگهی ز یارِ سفر کرده داد باد
من نیز دل به باد دهم، هر چه باد باد
کارم بدان رسید که همرازِ خود کنم
هر شام برق لامِع و هر بامداد باد
در چینِ طرهٔ تو دل بی حِفاظِ من
هرگز نگفت مسکنِ مألوف یاد باد
امروز قدرِ پندِ عزیزان شناختم
یا رب روانِ ناصحِ ما از تو شاد باد
خون شد دلم به یادِ تو هر گَه که در چمن
بندِ قبایِ غنچهٔ گل میگشاد باد
از دست رفته بود وجودِ ضعیفِ من
صبحم به بویِ وصلِ تو جان باز داد، باد
حافظ نهادِ نیکِ تو کامت بر آورد
جانها فدایِ مردمِ نیکو نهاد باد
میشه بگید که بالایی به نظرتون بهتره یا پایینی
غزل 102
دوش آگهی ز یارِ سفر کرده داد باد
من نیز دل به باد دهم، هر چه باد باد
کارم بدان رسید که همرازِ خود کنم
هر شام برق لامِع و هر بامداد باد
در چینِ طرهٔ تو دل بی حِفاظِ من
هرگز نگفت مسکنِ مألوف یاد باد
امروز قدرِ پندِ عزیزان شناختم
یا رب روانِ ناصحِ ما از تو شاد باد
خون شد دلم به یادِ تو هر گَه که در چمن
بندِ قبایِ غنچهٔ گل میگشاد باد
از دست رفته بود وجودِ ضعیفِ من
صبحم به بویِ وصلِ تو جان باز داد، باد
حافظ نهادِ نیکِ تو کامت بر آورد
جانها فدایِ مردمِ نیکو نهاد باد
غزل 102
دوش آگهی ز یارِ سفر کرده داد باد
من نیز دل به باد دهم، هر چه باد باد
کارم بدان رسید که همرازِ خود کنم
هر شام برق لامِع و هر بامداد باد
در چینِ طرهٔ تو دل بی حِفاظِ من
هرگز نگفت مسکنِ مألوف یاد باد
امروز قدرِ پندِ عزیزان شناختم
یا رب روانِ ناصحِ ما از تو شاد باد
خون شد دلم به یادِ تو هر گَه که در چمن
بندِ قبایِ غنچهٔ گل میگشاد باد
از دست رفته بود وجودِ ضعیفِ من
صبحم به بویِ وصلِ تو جان باز داد، باد
حافظ نهادِ نیکِ تو کامت بر آورد
جانها فدایِ مردمِ نیکو نهاد باد