این بسته در واقع فصل سوم از آموزش جنگو پروژه محور با ساخت شبکه اجتماعی شبیه اینستاگرام است. در این فصل به پایش رفتار کاربران و برقرای ارتباط میان اعضا (دنبال کردن) میپردازیم. به بهانه اجرای این پروژه موارد بسیاری را نیز در جنگو فرا خواهیم گرفت. ساخت دیتابیس با Redis در جنگو و کار با Signals در جنگو از آن جملهاند.
یادآوری میکنیم که دو فصل گذشته این پروژه پیش از این به شرح زیر منتشر شدند:
فصل اول – ثبت نام و ساخت پروفایل کاربران
فصل دوم – اشتراک گذاری عکس توسط کاربران
آموزههای اصلی
- مفهوم Redis و پیاده سازی آن در جنگو
- کار با Signals در جنگو
- کار با ContentTypes
- مفهوم و کاربرد GenericForeignKey
- استفاده از AJAX و JQuery در جنگو
- مفهوم دیتابیس نرمال و غیرنرمال سازی
برای یک دید سریع، پیش از خواندن این بخش توصیه میکنیم که حتما فیلم معرفی آموزش را در بالا این صفحه ببینید.
این آموزش در یک نگاه
بیایید نگاهی به مراحل این فصل از آموزش جنگو 3 بیندازیم. این فصل از آموزش پروژه محور جنگو با تعریف فیلد چند به چند در جنگو آغاز شد. یاد گرفتیم که چطور یک ارتباط ManyToMany در جنگو را با استفاده از مدل واسط (Intermediary Model) برقرار کنید.
با این روش یک فیلد تعداد دنبال کنندگان/دنبال شوندگان به مدل User اضافه کردیم. البته ما مدل User اپ Auth را تغییر ندادیم. ما از متد add_to_class استفاده کردیم که میتواند یک فیلد را فقط در زمان اجرا به یک کلاس در جنگو اضافه کند.
سپس به سراغ صفحه نمایش فهرست کاربران رفتیم و بعد هم باید صفحه اختصاصی هر کاربر نمایش داده میشد. به یک پیوند یکتا بنیاز داشتیم. مشابه بالا، برای جلوگیری از تغییر مدل User برای شخصی سازی پیوند یکتا از ABSOLUTE_URL_OVERRIDES در تنظیمات جنگو استفاده کردیم.
در ادامه آموزش امکان دنبال کردن کاربران را طراحی کردیم. دکمه Follow را به پروژه اضافه کردیم و عملکرد آن را به کمک AJAX و JQuery مشابه عملکرد پسند در فصل قبل نوشتیم.
سپس یک اپ به پروژه اضافه کردیم که مسئول پایش رخدادها (Actions) در پروژه باشد. رخدادها گوناگون هستند. مثلا یک کاربر یک کاربر دیگر را دنبال کند. یک کاربر یک عکس را پسند کند. به این دلیل در طراحی مدل Action از کلید خارجی عمومی در جنگو یا GenericForeinKey و فریمورک ContentTypes در جنگو استفاده کردیم.
در بخش پایانی این آموزش روی بهینه سازی دیتابیس در جنگو تمرکز کردیم. متدهای select_related و prefetch_related را شناختیم. این دو به نوعی JOIN در SQL را در ORM جنگو ممکن میکنند.
همچنین یاد گرفتیم که شاید نیاز باشد که یک دیتابیس نرمال را غیرنرمال کنیم سرعت بیشتر شود. در این راستا با مفهوم دیتابیس نرمال آشنا شدیم. فهمیدیم که اگر فیلدهای غیرنرمال به دیتابیس اضافه شوند باید به صورت خودکار روزآمد شوند.
برای خودکارسازی اجرای تابع ها میتوان از Signals در جنگو استفاده کرد. تابع های گیرنده یا Receiver میتوانند طوری تنظیم شوند که با رخ دادن یک اتفاق به صورت خودکار اجرا شوند.
در ادامه بهینه سازی های دیتابیس به سراغ Redis در جنگو رفتیم. در یک درس جداگانه به این پرداختیم که اصلا ردیس چیست و چه مزایایی دارد. به نصب ردیس و دستورات آن پرداختیم.
سرانجام با استفاده از redis-py یاد گرفتیم که چطور از ردیس در جنگو استفاده کنیم. ساخت دیتابیس با Redis در حافظه موقت و سرعت آن را تجربه کردیم. از ردیس برای ثبت تعداد بازدید عکس ها در پروژه خود بهره گرفتیم.
در درس پایانی این پروزه به طوفان فکری و یک شگفتانه پرداختیم. همچنین نکتهها و توصیههای پایانی برای ادامه راه را با شما در میان گذاشتیم.
این آموزش جنگو 3 بینظیر است زیرا
- نگاه حرفهای تری به بهینه سازی دیتابیس پیدا میکنید.
- یک آموزش پروژه محور جنگو 3 را پیش میبریم.
- ساخت دیتابیس با Redis در رم را میآموزید.
- با تعدادی ابزار مثل ContentType و Signal در جنگو آشنا میشوید.
- تمام کدها را با هم مینویسیم و درک میکنیم.
پیشنیاز
- آموزش پروژه محور جنگو __ ساخت شبکه اجتماعی شبیه اینستاگرام – فصل اول
- آموزش پروژه محور جنگو __ ساخت شبکه اجتماعی شبیه اینستاگرام – فصل دوم
کلیدواژگان
آموزش جنگو 3 – آموزش Django 3 – آموزش پروژه محور جنگو 3 – ساخت شبکه اجتماعی با جنگو – سایت شبیه اینستاگرام با جنگو – سایت شبیه pinterest با جنگو – ایجکس در جنگو – کار با Redis در جنگو – کار با سیگنال در جنگو – ساخت دیتابیس با ردیس – پایگاه داده نرمال چیست ؟ – غیرنرمال سازی دیتابیس در جنگو – بهینه سازی دیتابیس در جنگو
حمیدرضا مدنی –
با عرض سلام خدمت استاد اصفی عزیز
مرسی بابت اموزش های خوب و مفیدتون .
توی حوزه ی پایتون و جنگو فک میکنم جامع ترین سایت فارسی زبان باشید در حال حاضر.
لطفا تو حوزه ی جنگو همین روند رو ادامه بدین و آموزش های بیشتری بذارین من خودم به شخصه استقبال میکنم.
مصطفی آصفی –
سلام و ممنون از محبت شما آقای مدنی. امیدوارم که آموزش ها نقطه شروع کار عملی باشن.
پیرو درخواستتون در جریان باشین که آموزش ساخت فروشگاه با جنگو و ری اکت هم آغاز شده که فصل اول رو در این نشانی (+) می تونید بررسی کنید.
امین اجاقی (خریدار محصول) –
سلام و درود خدمت استاد بزرگ و گرامی مصطفی آصفی عزیز و دوست داشتنی استاد عزیز این دوره نیز به سلامتی به پایان رسید و با یکدیگر یک شبکه اجتماعی خوب ونیکو طراحی کردیم و به دانشمان در این زمینه اضافه گشته است تا کنون من با شما چهار دوره از آموزش هایتان را به اتمام رسانده ام و بسیار در زمینه طراحی وبسیات رشد کرده ام و در حال ادامه هستم تا رسیدن به یک full stack developer اکنون می خواهم دوره HB-DjangoAPI-05-IntroDjangoREST شروع کنم و پس از این به سراغ یک دوره خوب از جاوا اسکریپت بروم اگر شما دوره مناسبی میشناسید لطفا معرفی فرمایید تا از آن استفاده نمایم و همچنین منتظر آن دوره فروشگاه اینترنتی نیز می باشم و اینکه با آموزش های نیکوی خویش بیشتر و بیشتر ما را در زمینه یک برنامه نویس بکند بودن آگاه سازید به نحوی که چشمان ما خود بداند هر طرحی را چگونه شروع و به پایان برساند با تشکر از محبت های شما استاد عزیز و دوست داشتنی برکت خدا بر شما و خانواده محترمتان .
مصطفی آصفی –
سلام به شما. آقای اجاقی عزیز در حال حاضر در حال طراحی یک مجموعه آموزش های لازم برای فرانت اند در هم رویش هستیم. ولی برای این که وقت رو از دست ندین می تونید آموزش های html و css و javascript مجموعه فرادرس رو ببینید مثل هم رویش آموزش هاشون رو داوری می کنن و احتمالا موارد مناسبی رو اونجا می تونید پیدا کنید.
امین اجاقی (خریدار محصول) –
با سلام و درود خدمت استاد عزیز و دوست داشتنی مصطفی آصفی گرامی استاد بزرگوار یک سوال در باره تمپلت detail.html در اپ actions داشتم در باره ایت قسمت {% with user=action.user profile=action.user.profile %} در کلمه action.user یا action.user.profile کلمه action از کجا میاد زیرا ما در view دیکشنری را در زمان رندر شدن actions تعریف کردیم . با تشکر از محبت های بسیار شما استاد عزیز برکت خدا بر شما و خانواده محترمتان . و در مورد آن پیشنهاد هم حق با شماست هرگونه که آموزش ها پیش می رود در مسیر خود بهینه بودن اجرای پروژه با شماست من این موضوع در نظرم بود به شما انتقال دادم تصمیم های نیکوی شما همیشه ارزشمند می باشد .
مصطفی آصفی –
سلام به شما. من خدمتتون پایین توضیح میدم ولی توصیه می کنم درس های 44 و 45 رو با دقت بیشتری ببینید.
اول به views.py اپ account برید. اونجا ما تو ویوی dashboard داریم لیست اتفاقات رو با نام actions به تمپلت detail.html همین اپ می فرستیم.
حالا سراغ تمپلت detail.html همین اپ account برید. آخر این تمپلت ما داریم این لیست actions رو روش حلقه for می زنیم و می گیم اگه هر کدوم از اعضای این لیست اسمشون action باشه بیا برو به ازای این اکشن فایل زیر رو به این تمپلت فعلی بچسبون
actions/action/detail.html
اینجاست که به ازای هر action یه مرتبه فایل detail.html اپ actions صدا زده میشه.
امین اجاقی (خریدار محصول) –
با سلام و درود فراوان بر استاد بزرگ و گرامی مصطفی آصفی عزیز و دوست داشتنی استاد عزیز یک پیشنهاد داشتم برای آموزش هایتان استاد اگر ممکن است در آموزش هایتان کد ها را پشت سر هم بنویسید و کدی بعدا به قبل کدها اضافه نکنید زیرا من آموزش ها را می نویسم و بیار از لاک غلط گیر استفاده می نمایم اگر کدها را پشت سر هم بنویسید بسیار ممنون و متشکر می شوم با تشکر فراوان از محبت های شما استاد بزرگ و دوست داشتنی برکت خدا بر شما و خانواده محترمتان .
مصطفی آصفی –
سلام به شما. خواسته سختیه چون معمولا پروژه ها به صورت تدریجی تکامل پیدا می کنن. با این حال چشم باز سعی می کنم.
امین اجاقی (خریدار محصول) –
سلام و درود خدمت استاد بزرگ و دوست داشتنی مصطفی آصفی عزیز استاد گرامی در طی آموزش ها من دومین وبسایت را نیز برا مشتری طراحی کردم و در اختیار گذاشته ام و آپلود کرده ام .لینک را ببینید : jarsaghil-morovati.ir با تشکر از محبت های شما استاد بزرگ و گرامی برکت خدا بر شما و خانواده محترمتان .
مصطفی آصفی –
سلام به شما. خدا قوت انشالله. یه مقدار روی ظرافت فونت ها باید کار کنید. یه مقدار نامتعارف و بزرگ هستن. ولی در کل همین که تلاش می کنید دم شما گرم.
ابوالفضل حسن زاده (خریدار محصول) –
سلام استاد خسته نباشید. استاد من در سایت کورا درخواست کار برای بسیاری از اگهی های استخدام طراح فرانت اند یا برنامه نویس بک اند اما همه دیدن ولی قبول نکردن و اینکه بیشتر همه اهمیتی زیادی به پیشینه کاری میدهند. خب ما که پیشینه کاری نداریم حداقل ما رو به عنوان کارآموز هم قبول نمیکنم. به نظر شما چه کار کنیم که اعتماد طرف مقابل رو جذب کنیم ؟ و چی کار کنیم که به طرف مقابل رو از این مطلع کنیم که اره من میتونم این کار رو انجام بدم.
مصطفی آصفی –
سلام به شما. ببینید بهترین کار ایجاد نمونه هست. شما چندین نمونه برای خودتون کار طراحی کنید و موقع پیشنهاد کار یا کارآموزی اون لینک ها رو به عنوان سبک کار معرفی کنید.
وقتی کسی قراره در حوزه فرانت اند به ما کار بده باید ببینه سبک کار چطوره. وقتی کسی قراره ما رو کارآموزی بپذیره هم باید ببینه چقدر اهل کار هستیم و چند تا نمونه زدیم.
پینوشت: یک روش شناخته شدن در بازار کار هم تولید آموزش هست. در حال حاضر در هم رویش آموزش های پایه فرانت اند مثل html و css و bootstrap نداریم. چرا با تولید این ها شروع نمی کنید. درخواستتون رو می تونید از فرم همکاری با ما (بخش تدریس) ارسال کنید.
amir ayat (خریدار محصول) –
سلام و دورود خدمت استاد گرانقدر
مشکلی که در دیدگاه قبلی مطرح کردم خوشبختانه حل شد و ناشی از اشتباه در import ها بود و باگ در try خودشو نشون نمیداد
ابتدا لازم میدونم از تلاش شما برای تهیه این سری آموزش تشکر کنم من واقعا لذت بردم
در نهایت یه ایراد جزئی در قسمت 40 فایل detail.html هست
{{ total_views }} view {{ total_likes|pluralize }}
total_likes باید با total_views جایگزین بشه
ممنون بابت تلاش شما در آموزش مطالب
مصطفی آصفی –
سلام سلامت باشید. ممنونم که رفع مشکلتون رو اطلاع دادید.
در مورد خطایی که گزارش کردید، درس 40 که نباید باشه. احتمالا درس 49 منظورتون هست.
آفرین به دقت نظر شما. خطا رو رفع و مخزن رو با ذکر نام شما به روز کردم.
amir ayat (خریدار محصول) –
با سلام و عرض تقدیر بابت این آموزش ارزشمند
یه مشکل در پیاده سازی ایجکسی follow برای من پیش اومده به این شکل که در ویو user_follow پارامتر های id و action به درستی دریافت میشن و تابع وارد اولین شرط if میشه اما try نمیکنه و مستقیم except میده. اینو از این نظر میگم که به جای pass کردن except خروجی جیسونی زیر رو جایگزین کردم:
return JsonResponse({‘user_id’: user_id , ‘action’: action})
و دقیقا با id و action ورودی یکی بود. بنابرین کال بک فانکشن هم عمل نمیکنه و رکورد مربوطه در دیتابیس ثبت نمیشه
احتمال خطای سینتکسی کمه چون برای اطمینان کد رو از روی نسخه آموزشی کپی کردم و فرقی نکرد
لایک ایجکسی که دستور عمل مشابه داره به درستی عمل میکنه اما فالو نه 🙁
ممنون میشم راهنمایی بفرمایید
رضا (خریدار محصول) –
درود بر شما
اگر امکانش هست سورس کد نهایی پروژه رو برای دانلود قرار بدید
تا اونجایی که من بررسی کردم در فایل های دانلودی بنده موجود نبود
ممنونم.
راستی من بسته ی آموزشی جنگو رست رو چند وقت پیش تهیه کردم و واقعا عالی بودش
اگر امکانش هست یک بسته ی آموزشی پیشرفته برای این بسته تولید کنید و اگر ممکن بود برای درک بهتر ،تست در فضای تمام پایتونی اتفاق باشد.
پیشاپیش سال نو رو به شما تبریک میگم.
سلامت و پایدار باشید.
مصطفی آصفی –
سلام سلامت باشید. در مورد سورس کد لینک سورس کد پروژه نهایی به عنوان فایل DjangoPr02ScN-SRC.zip به فایلهای فصل اول پیوست شده. لطفا با دقت بیشتری بررسی کنید.
در مورد آموزش Django REST ممنون از ابراز لطف شما. خوشحالم که مفید بوده. پیشنهادتون پیشنهاد خوبیه. حتما در آینده روی این بحث برمیگردیم و یک پروژه اجرا می کنیم.
بنده هم پیشاپیش سال نو رو تبریک می گم و براتون تندرستی و آرامش آرزومندم.
ابوالفضل حسن زاده (خریدار محصول) –
سلام استاد خسته نباشید. بسیار عالی ما تا انتشار اموزش بعدی این مطالب ارزشمند رو تمرین میکنیم تا حق ما هم به عنوان هنرجو نسبت به شما ادا بشه. استاد به نظرم جای دنیای شبکه و هک در این سایت خالی هستش. این دست اموزش ها در اینده در سایت قرار میگیرند ؟
مثلا از شبکه اموزش های مثل network +, CCNA , CCNP و….
یا از دنیای هک دوره CEH و …..
در پایان کلام استاد یه دوره CEH هم بگذارید.
مصطفی آصفی –
سلام به شما آقای حسن زاده عزیز. سلامت باشید. کار خوبی می کنید. تمرین بعد از آموزش، میوه آموزشه و همت بلندی می خواد. انشالله که در مسیر تمرین موفق باشید.
در رابطه با پیشنهادهای خوبتون باید بگم بله به امید خدا در آینده برنامه جدی روی هک و امنیت و شبکه هم هست. حتما به این موارد می پردازیم.
مهدی –
سلام آقای آصفی
دست شما درد نکنه برای تولید این محتواهای ارزشمند
آموزش بعدی شما چی هست
مصطفی آصفی –
سلام به شما. سلامت باشید.
در حال حاضر روی آموزش ساخت فروشگاه با جنگو در مرحله پیش تولید و فکر برای محتوا هستم.