Django Experience
697 subscribers
4 videos
8 links
در این چنل تجربه‌ ها و پروژه‌ های شخصی‌ خودم رو
در مورد زبان پایتون و فریم‌ ورک Django به اشتراک میزارم؛ همراه با نکات فنی و مسیر یادگیری در توسعه‌ی وب

📩 ارتباط با من: @web_project10
Download Telegram
📌 پروژه Rest Blog API با Django Rest Framework

با سلام،
در این پروژه یک RESTful API برای سیستم وبلاگ‌نویسی طراحی و پیاده‌سازی شده است که با استفاده از فریم‌ورک‌های قدرتمند Django و Django Rest Framework توسعه یافته است.

هدف اصلی از توسعه این پروژه، ارائه‌ی یک زیرساخت بک‌اند کاملاً ماژولار، امن و مقیاس‌پذیر برای مدیریت محتوای وبلاگی است به ‌طوری که بتوان از آن در پروژه‌های واقعی نیز بهره گرفت

در این API امکانات متداولی که در سیستم‌های مدیریت محتوا (CMS) انتظار می‌رود، مانند ایجاد و مدیریت پست‌ها، دسته‌بندی مطالب، ثبت و مدیریت نظرات کاربران، ثبت‌نام و ورود ایمن با توکن JWT، تعیین سطوح دسترسی (permissions) و ارسال ایمیل‌های سیستمی (مانند فعال‌سازی حساب کاربری) پیاده‌سازی شده است.

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

🧩 تکنولوژی‌ها و ابزارهای استفاده‌شده:

Django و Django Rest Framework برای توسعه‌ی API

PostgreSQL به عنوان دیتابیس اصلی

Docker و Docker Compose برای داکرایز کردن پروژه و مدیریت سرویس‌ها

smtp4dev برای شبیه‌سازی سرور ایمیل در محیط توسعه

JWT (SimpleJWT) برای پیاده‌سازی احراز هویت و مدیریت توکن‌ها

🛠 ویژگی‌های کلیدی پروژه:

ساختار تمیز و ماژولار مناسب برای توسعه در مقیاس بزرگ

مدیریت پست‌ها، دسته‌بندی‌ها، نظرات و کاربران

سطوح دسترسی مختلف با استفاده از permissionها و decorators

امکان فیلتر، جستجو و صفحه‌بندی روی داده‌ها

ارسال ایمیل (تست با smtp4dev) برای فعال‌سازی حساب و سایر رویدادها

مستندسازی کامل API با Swagger UI و drf_spectacular

نوشتن تست‌های پوششی برای بخش‌های مهم پروژه

تنظیمات چندگانه برای محیط توسعه و تولید

📦 پروژه به‌صورت کامل داکرایز شده و آماده اجرا در محیط containarized می‌باشد.

📂 لینک گیت‌هاب:
🔗 github.com/Mohammadparsa1384/Rest_Blog_Api


📂 داکیومنت endpoint های پروژه :

🔗 dev-api-server.liara.run
26👍7🔥3
🛡️ محافظت از فرم لاگین با Django-Defender

حملات brute-force 🔐 یکی از رایج‌ ترین روش‌های نفوذ به وبسایت‌ ها هستند
جایی که هکرا با تلاش‌های مکرر سعی میکنن رمز عبور کاربران را حدس بزنند.
کتابخانه‌ی Django-Defender ابزاری سبک، سریع و مطمئن برای مقابله با این حملات در پروژه‌های Django است.

امکانات کلیدی

🚫 شمارش تلاش‌های ناموفق ورود و بلاک کردن کاربر یا ip

استفاده از کش (Redis یا Memcached) برای عملکرد سریع

⏱️ امکان تنظیم تعداد تلاش‌های مجاز و زمان بلاک (cool-off)

📊 ذخیره لاگ‌ها و مشاهده آنها در پنل مدیریت Django

🔐 بلاک بر اساس ip یا ترکیب یوزرنیم + ip

⚙️ نصب و راه‌اندازی
pip install django-defender


در settings.py تنظیمات پایه رو برای کانفیگ django defender اضافه کنید:

INSTALLED_APPS = [
...,
"defender",
]

MIDDLEWARE = [
...,
"defender.middleware.FailedLoginMiddleware",
]

تنظیمات اصلی:
DEFENDER_REDIS_URL = "redis://127.0.0.1:6379/0"
DEFENDER_LOGIN_FAILURE_LIMIT = 5
DEFENDER_COOLOFF_TIME = 300
DEFENDER_LOCK_OUT_BY_COMBINATION_USER_AND_IP = True
DEFENDER_STORE_FAILURES = True

1⃣ DEFENDER_REDIS_URL :
مشخص میکنه داده های تلاش نا موفق کجا ذخیره میشن "redis://127.0.0.1:6379/0" یعنی Redis روی لوکال با پورت 6379 و‌دیتابیس شماره 0 اجرا بشه.

2⃣ DEFENDER_LOGIN_FAILURE_LIMIT:
تعداد دفعاتی که یک کاربر یا ip میتونه رمز اشتباه وارد کنه قبل از اینکه بلاک شه.

مثال: مقدار ۵ → بعد از ۵ تلاش ناموفق، بلاک فعال میشه

3⃣ DEFENDER_COOLOFF_TIME :

مدت زمان بلاک به ثانیه.

به عنوان مثال اینجا ۳۰۰ ثانیه یعنی بعد از بلاک شدن‌؛کاربر یا ip برای ۵ دقیقه نمیتونه لاگین کنه

4⃣ DEFENDER_LOCK_OUT_BY_COMBINATION_USER_AND_IP :

تعیین میکنه که مکانیزم بلاک چگونه عمل کنه و معیار محدودسازی کاربران چی باشه. مثلا وقتی متغیر روی True تنظیم شه، بلاک بر اساس ترکیب یوزرنیم و ip اعمال میشه؛ یعنی حتی اگر کاربر از یک ip جدید وارد شه، اگر همان یوزرنیم را استفاده کنه همچنان محدود خواهد بود و اجازه ورود نداره. اگر این متغیر روی False باشه، بلاک فقط بر اساس ip اعمال می‌شود و یوزرنیم میتونه از ip دیگر بدون مشکل وارد شه. این تنظیم باعث افزایش دقت امنیتی و جلوگیری از دور زدن محدودیت‌ها توسط تغییر ip می‌شود.

5⃣ DEFENDER_STORE_FAILURES :

اگر True باشه، تلاش‌های ناموفق در دیتابیس ذخیره میشن و میتونیم اونارو را تو پنل ادمین ببینیم



این ویژگی کمک می‌کند تحلیل و بررسی حملات راحت‌ تر باشد

مایگریشن‌ ها رو اجرا کنید:
python manage.py migrate

🧪 تست عملکرد

5 بار با اطلاعات اشتباه سعی کنید داخل پروژه جنگویی خودتون لاگین کنید 🔑

پس از رسیدن به تعداد تلاش‌های مجاز، دسترسی موقت بلاک خواهد شد 🚫

لاگ‌ها در پنل مدیریت ذخیره می‌شوند 📊

با فعال بودن LOCK_OUT_BY_COMBINATION_USER_AND_IP، حتی با IP جدید همان یوزرنیم بلاک خواهد شد 🔒

🎯 نتیجه:
اعمال چند خط تنظیمات ساده در Django-Defender، امنیت فرم لاگین پروژه شما به شکل چشمگیری افزایش می‌یابد. این ابزار به طور مؤثر جلوی حملات brute-force را می‌گیرد، تلاش‌های ناموفق کاربران را ردیابی می‌کند و امکان مسدودسازی موقت ip یا یوزرنیم را فراهم می‌کند. با ذخیره لاگ‌ها در دیتابیس و بررسی آن‌ها در پنل مدیریت، می‌توانید فعالیت‌های مشکوک را شناسایی کرده و امنیت کلی سایت خود را ارتقا دهید. به این ترتیب کنترل کامل بر دسترسی کاربران و حفاظت از حساب‌ها برای شما ساده و قابل اطمینان خواهد بود
29👍7🔥3
Forwarded from جنگولرن
آیا می دانستید که وقتی ImageField یا FileField توی جنگو دارید، و اون رکورد حذف میشه، فایل هاش حذف نمیشن

درسته؟ قبول داری؟

تا جایی که من میدونم فایل ها حذف نمیشن
یا مثلا عکس رو تغییر بدیم، عکس قبلی ع توی سرور میمونه
در واقع media حذف نمیشه

راه حل چیه؟

چند تا راه هست (من اینارو بلدم):

-متد save و delete رو override کن و دستی حذف کن.
-از سیگنال های جنگو استفاده کن و رکورد حذف شد، سیگنال فایل هارو حذف کنه.
-استفاده از پکیج django-cleanup که دقیقا کارش همینه، و از سیگنال ها استفاده میکنه.
-استفاده از پکیج django-lifecycle که کارش حذف کردن فایل نیست، ولی با قابلیت hook ش میشه فایل های بی صاحب رو حذف کرد 😁

پکیج django-lifecycle برای من جالب بود
مدل مون باید از LifecycleModel ش ارث بری کنه
بعد یه سری Hook داره و میگه بعد از فلان اتفاق، فلان کار رو انجام بده
نمیاد سیگنال کال کنه، متد save و delete رو override کرده.

من باشم از هر دوشون همزمان استفاده میکنم.
با تشکر از Hossein Neysian
نظری اگه دارید بگید. مثلا ابزار یا پکیجی که برای این موارد استفاده میشه.
یا توی پروژه های Enterprise اینو چطور هندل میکنن، اصلا این مسئله هست توی پروژه های Enterprise ؟؟؟

اسپانسر این پست 👈 لینک
25👍7🔥3
جنگولرن
آیا می دانستید که وقتی ImageField یا FileField توی جنگو دارید، و اون رکورد حذف میشه، فایل هاش حذف نمیشن درسته؟ قبول داری؟ تا جایی که من میدونم فایل ها حذف نمیشن یا مثلا عکس رو تغییر بدیم، عکس قبلی ع توی سرور میمونه در واقع media حذف نمیشه راه حل چیه؟ …
پست خیلی خوبی بود گفتم اینجا هم اشتراک بزارم

من همیشه از django clean up استفاده میکردم و django lifecycle رو اولین بار بود می‌شنیدم اینکه از سیگنال استفاده نمیکنه خیلی جالب بود برام

داخل پروژه های بزرگ معمولا یه تسک دوره ای مثل celery beat میزارن که پوشه ی media رو اسکن کنه و فایل هایی که بی صاحاب شدن رو حذف کنه چون همیشه هم حذف رکورد از طریق orm انجام نمیشه که سیگنال یا lifecycle بتونه واکنش نشون بده
26👍7🔥4