جنگولرن
✅ Django Testing - Model Testing Introduction https://www.youtube.com/watch?v=GBgRMdjAx_c
✔️ در این ویدیو که مقدمه تست نویسی در جنگو هست، موارد زیر توضیح داده شده (کلا 36 دقیقه اس):
- فولدر بندی تست ها برحسب مدل
- نصب پکیج coverage که این پکیج نشون میده کدهای ما چقدر توسط تست کاور شدن
- ارث بری از کلاس TestCase و ساخت و اجرای یک تست ساده
- پیاده سازی متد setUp در کلاس تست - این متد به ازای هر متد در کلاس تست یکبار اجرا میشه
- پیاده سازی کلاس متد ع setUpTestData این متد یک بار به ازای هر کلاس تست اجرا میشه
- نصب پکیج model-bakery برای ساخت fixture برای ایجاد رکورد اتوماتیکه فیک جهت تست
- فولدر بندی تست ها برحسب مدل
- نصب پکیج coverage که این پکیج نشون میده کدهای ما چقدر توسط تست کاور شدن
- ارث بری از کلاس TestCase و ساخت و اجرای یک تست ساده
- پیاده سازی متد setUp در کلاس تست - این متد به ازای هر متد در کلاس تست یکبار اجرا میشه
- پیاده سازی کلاس متد ع setUpTestData این متد یک بار به ازای هر کلاس تست اجرا میشه
- نصب پکیج model-bakery برای ساخت fixture برای ایجاد رکورد اتوماتیکه فیک جهت تست
👍2
✅ شاید همگی با این جمله ی خفن و معروف آشنا باشیم .
"premature optimization is the root of All evil"
بنظر شما رانندگی با ماشین فرمول یک تو خیابون های شهر کار عاقلانه ایه؟
خب مشخصه ، نه .
پس یادمون باشه قبل هر تصمیمی برای ارتقای یک پروژه یه شاخص مهم رو در نظر بگیریم ، این شاخص چیزی نیست جز نیاز مشتری ، باید این نیاز رو پیدا کنیم .
یه سوال
از کجا بفهمیم که نیاز به improvement هست یا نه و یا ساده تر بگم چطور تشخیص بدیم که نیاز داریم ارتقا بدیم یا نه ؟ اینحاست که performance testing مطرح میشه.
بنظر من performance testing ارزش یک برنامه نویس رو نشون میده ، تنها راه مقابله با کمالگرایی بیهوده ، سدیه به نام performance testing.
ما به عنوان یک برنامه نویس قراره ارزشمون رو با پاسخ به یک نیاز نشون بدیم ، نه آب در هاون کوبیدن .
سوال بعدی، خب چطور performance testing انجام بدیم ؟
یکی از روش ها تو پروژه های جنگویی استفاده از locust هست با اینکار میتونین بفهمین که پروژتون چند مرده حلاجه و به بیانی دیگر نیاز به improvement رو تشخیص بدین .
پس یادمون نره کنار هر مهارت خفنی که یاد میگیریم در نظر بگیریم که مدیریت زمانی میکنیم و ارزش اون کار دیده میشه یا نه.
کمالگرایی آفتیه که تو باغ هر برنامه نویسی میوفته ، با locuat آفتکشی کنید .
بازم از لینکدین Erfan Aliaghdam
لینک:
https://www.linkedin.com/posts/erfan-aliaghdam-20a439204_performanceabrtesting-testing-django-activity-6955392499020349440-ktMP?utm_source=linkedin_share&utm_medium=member_desktop_web
"premature optimization is the root of All evil"
بنظر شما رانندگی با ماشین فرمول یک تو خیابون های شهر کار عاقلانه ایه؟
خب مشخصه ، نه .
پس یادمون باشه قبل هر تصمیمی برای ارتقای یک پروژه یه شاخص مهم رو در نظر بگیریم ، این شاخص چیزی نیست جز نیاز مشتری ، باید این نیاز رو پیدا کنیم .
یه سوال
از کجا بفهمیم که نیاز به improvement هست یا نه و یا ساده تر بگم چطور تشخیص بدیم که نیاز داریم ارتقا بدیم یا نه ؟ اینحاست که performance testing مطرح میشه.
بنظر من performance testing ارزش یک برنامه نویس رو نشون میده ، تنها راه مقابله با کمالگرایی بیهوده ، سدیه به نام performance testing.
ما به عنوان یک برنامه نویس قراره ارزشمون رو با پاسخ به یک نیاز نشون بدیم ، نه آب در هاون کوبیدن .
سوال بعدی، خب چطور performance testing انجام بدیم ؟
یکی از روش ها تو پروژه های جنگویی استفاده از locust هست با اینکار میتونین بفهمین که پروژتون چند مرده حلاجه و به بیانی دیگر نیاز به improvement رو تشخیص بدین .
پس یادمون نره کنار هر مهارت خفنی که یاد میگیریم در نظر بگیریم که مدیریت زمانی میکنیم و ارزش اون کار دیده میشه یا نه.
کمالگرایی آفتیه که تو باغ هر برنامه نویسی میوفته ، با locuat آفتکشی کنید .
بازم از لینکدین Erfan Aliaghdam
لینک:
https://www.linkedin.com/posts/erfan-aliaghdam-20a439204_performanceabrtesting-testing-django-activity-6955392499020349440-ktMP?utm_source=linkedin_share&utm_medium=member_desktop_web
👍3
✅ «تا حالا شنیدید که میگن پایتون برای فلان پروژه خوب نیست چون نمیتونه به اندازه کافی سریع باشه؟ من شنیدم. و این جمله کمی ناامید کنندهس چون که بانکهای بزرگ، یوتوب، اینستاگرام، و خییلی جاهای دیگه که نسبت به performance حساس هستن هنوز هم میان پایتون رو انتخاب میکنن و از این قضیه راضی هم هستن.»
چرایی این استفاده گسترده از پایتون و چرا پایتون حتی برای جاهایی که performance بالا خیلی ضروری عه مثل بانکهای بزرگ یوتوب و اینستاگرام، انتخاب خیلی خوبیه رو اینجا بخونید:
https://b2n.ir/k38624
تشکر از @pyeafp
چرایی این استفاده گسترده از پایتون و چرا پایتون حتی برای جاهایی که performance بالا خیلی ضروری عه مثل بانکهای بزرگ یوتوب و اینستاگرام، انتخاب خیلی خوبیه رو اینجا بخونید:
https://b2n.ir/k38624
تشکر از @pyeafp
👍8👎1
🧨 شناخت و پیشگیری از یکی از رخنه (Exploit) های متداول وب اپها: XSS
📃 به عنوان توسعهدهنده وب بهتره سعی کنیم تا کدی که توسعه میدیم تا حدامکان #Secure (امن) باشه و در مقابل رخنهها و حملات ساده و متداول آسیب پذیر (#vulnerable) نباشه (و شانس رخنه رو کم کنیم).
استفاده موفق از آسیب پذیری Cross-site-scripting یا XSS باعث میشه اپ شما کد های مخرب یا ناخواسته #Javascript رو برای دیگر کاربران نمایش بده و اجرا کنه.
🎃 کد جاوا اسکریپ مخرب میتونه:
❕اطلاعات کاربران رو بدزده (یا زمینهساز حملات پیچیدهتری بشه)
❕فعالیت هایی رو انجام بده که ناخواسته اند و مورد تایید یا نیاز کاربر نیستند.
یکی از مفروضات این مشکل امنیتی اینه که محتوایی که وب سایت یا اپ ما تولید میکنه "قابل اعتماد” است. پس برای پیشگیری اش منطقیه که هرچیزی که ممکنه این "اعتماد" رو خراب کنه مدنظر بگیریم.
⬅️ به صورت خیلی خلاصه، اگر کد شما هر محتوا یا ورودی که از سمت کاربر بیاد رو بدون "تمیز کردن” و بررسی صحت (#Validation) ذخیره کنه یا نمایش بده، این رخنه میتونه براش اتفاق بیفته.
⚔️ به عنوان اولین لایه پیشگیری، در وب فریمورک #Django ، فرض براینه که هرچه که در context برای رندر شدن در اختیارش میگذارید، "ناامن” است و با کمک متد html.escape() همه کاراکتر های html را به معادلشون تبدیل میکنه.
مثلا:
<img src="https://lnkd.in/eE-enrjb"/>
به
<img src="https://lnkd.in/eUCsnhnx;
تبدیل میشه.
🌪 اما متاسفانه این کافی نیست:
1- این پیشفرض فقط شامل Django template engine میشود، مثلا اگر Angular یا React یا Vue استفاده میکنید، احتمالا شامل این موضوع نیستید.
2- افزونه یا اپ های شخص ثالثی که استفاده میکنیم ممکنه شامل این آسیب پذیری باشند.
3- اگر از ()mark_safe یا همون "Safe string" ها در متدها و #template ها استفاده میکنید، دیگه خروجی شما شامل این تبدیل نمیشه. (پیشنهاد میکنم تاجایی که میتونید از این متدها استفاده نکنید.)
4- بعضی از attr ها یا روش استفاده ما از متغیرها در template، ممکنه شامل این پیشفرض نشوند یا دورش بزنند،
مثلا:
<img src={{ profile_photo_url }}>
میتونه با سواستفاده تبدیل شه به
<”img src=”/img/home-bg.jpg onload=alert(1)>
5- کاراکتر backtick و همینطور دیتایی که با base64 انکود بشه escape نمیشود، در واقع محتوایی که کاراکترهای quote یا html نداشته باشه چیزی برای escape شدن نداره، مثلا:
<script>spinner.minimum = {{ minimum_price }} ;</script>
میتونه تبدیل شه به:
<script>spinner.minimum = 0; alert(1) ;</script>
سعی میکنم در پست دیگه ای، با جزئیات بیشتری روشها و راههایی که میتونیم تا حد ممکن از XSS در اپ Django مان پیشگیری (#mitigate ) کنیم رو جمع آوری کنم و بنویسم.
لینک مقاله اصلی که ازش الهام گرفتم:
https://lnkd.in/erpqQREc
از لینکدین Alireza Amouzadeh
تشکر از @alireza_amouzadeh
لینک:
https://www.linkedin.com/posts/alireza-amouzadeh_xss-exploitation-in-django-applications-activity-6948679390654291968-6_IX?utm_source=linkedin_share&utm_medium=member_desktop_web
📃 به عنوان توسعهدهنده وب بهتره سعی کنیم تا کدی که توسعه میدیم تا حدامکان #Secure (امن) باشه و در مقابل رخنهها و حملات ساده و متداول آسیب پذیر (#vulnerable) نباشه (و شانس رخنه رو کم کنیم).
استفاده موفق از آسیب پذیری Cross-site-scripting یا XSS باعث میشه اپ شما کد های مخرب یا ناخواسته #Javascript رو برای دیگر کاربران نمایش بده و اجرا کنه.
🎃 کد جاوا اسکریپ مخرب میتونه:
❕اطلاعات کاربران رو بدزده (یا زمینهساز حملات پیچیدهتری بشه)
❕فعالیت هایی رو انجام بده که ناخواسته اند و مورد تایید یا نیاز کاربر نیستند.
یکی از مفروضات این مشکل امنیتی اینه که محتوایی که وب سایت یا اپ ما تولید میکنه "قابل اعتماد” است. پس برای پیشگیری اش منطقیه که هرچیزی که ممکنه این "اعتماد" رو خراب کنه مدنظر بگیریم.
⬅️ به صورت خیلی خلاصه، اگر کد شما هر محتوا یا ورودی که از سمت کاربر بیاد رو بدون "تمیز کردن” و بررسی صحت (#Validation) ذخیره کنه یا نمایش بده، این رخنه میتونه براش اتفاق بیفته.
⚔️ به عنوان اولین لایه پیشگیری، در وب فریمورک #Django ، فرض براینه که هرچه که در context برای رندر شدن در اختیارش میگذارید، "ناامن” است و با کمک متد html.escape() همه کاراکتر های html را به معادلشون تبدیل میکنه.
مثلا:
<img src="https://lnkd.in/eE-enrjb"/>
به
<img src="https://lnkd.in/eUCsnhnx;
تبدیل میشه.
🌪 اما متاسفانه این کافی نیست:
1- این پیشفرض فقط شامل Django template engine میشود، مثلا اگر Angular یا React یا Vue استفاده میکنید، احتمالا شامل این موضوع نیستید.
2- افزونه یا اپ های شخص ثالثی که استفاده میکنیم ممکنه شامل این آسیب پذیری باشند.
3- اگر از ()mark_safe یا همون "Safe string" ها در متدها و #template ها استفاده میکنید، دیگه خروجی شما شامل این تبدیل نمیشه. (پیشنهاد میکنم تاجایی که میتونید از این متدها استفاده نکنید.)
4- بعضی از attr ها یا روش استفاده ما از متغیرها در template، ممکنه شامل این پیشفرض نشوند یا دورش بزنند،
مثلا:
<img src={{ profile_photo_url }}>
میتونه با سواستفاده تبدیل شه به
<”img src=”/img/home-bg.jpg onload=alert(1)>
5- کاراکتر backtick و همینطور دیتایی که با base64 انکود بشه escape نمیشود، در واقع محتوایی که کاراکترهای quote یا html نداشته باشه چیزی برای escape شدن نداره، مثلا:
<script>spinner.minimum = {{ minimum_price }} ;</script>
میتونه تبدیل شه به:
<script>spinner.minimum = 0; alert(1) ;</script>
سعی میکنم در پست دیگه ای، با جزئیات بیشتری روشها و راههایی که میتونیم تا حد ممکن از XSS در اپ Django مان پیشگیری (#mitigate ) کنیم رو جمع آوری کنم و بنویسم.
لینک مقاله اصلی که ازش الهام گرفتم:
https://lnkd.in/erpqQREc
از لینکدین Alireza Amouzadeh
تشکر از @alireza_amouzadeh
لینک:
https://www.linkedin.com/posts/alireza-amouzadeh_xss-exploitation-in-django-applications-activity-6948679390654291968-6_IX?utm_source=linkedin_share&utm_medium=member_desktop_web
👍8👎1
Forwarded from بنیاد پایتون کاران فارسی (M4hdi)
✔️ «همهچیز در پایتون آبجکت است»
همه این رو یبار هم که شده شنیدیم!
➰ ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئگرایی و ارثبری به اون صورت نداره، چطور پیادهسازی شده؟
➰ اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟
➰ در پایهای ترین حالت آبجکتهای پایتون، چه چیزهای مشترکی دارن؟
➰ تایپ float و تایپ dict چجوری نوشته شدن با C؟
➰ چه تایپهایی در CPython نشانی از داشتن len دارند؟
➿ تابع len چگونه کار میکنه؟
➿ تابع len چرا چنین، کار میکنه؟
➿ پیچیدگی زمانی تابع len چگونه است؟
➰ تایپ list در CPython چطور نوشته شده است؟
روز یکشبه
ساعت ۷ عصر
اینجا 👈 @SEYED_BAX
همه این رو یبار هم که شده شنیدیم!
➰ ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئگرایی و ارثبری به اون صورت نداره، چطور پیادهسازی شده؟
➰ اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟
➰ در پایهای ترین حالت آبجکتهای پایتون، چه چیزهای مشترکی دارن؟
➰ تایپ float و تایپ dict چجوری نوشته شدن با C؟
➰ چه تایپهایی در CPython نشانی از داشتن len دارند؟
➿ تابع len چگونه کار میکنه؟
➿ تابع len چرا چنین، کار میکنه؟
➿ پیچیدگی زمانی تابع len چگونه است؟
➰ تایپ list در CPython چطور نوشته شده است؟
روز یکشبه
ساعت ۷ عصر
اینجا 👈 @SEYED_BAX
🔥4👍2👎1🤯1
سلام به همه
✅ دوستانی که تازه شروع کردید به برنامه نویسی و میخواهید برای استخدام شدن به شرکت ها رزومه بدید.
من میتونم رزومه دات نتی پارسالم رو براتون بفرستم که ازش ایده بگیرید.
این رزومه رو هر جا فرستادم دعوت به مصاحبه شدم 😂
رزومه پایتونی ندارم. چون هنوز در حال یادگیری اش هستم و به کسی که در حال یادگیری هست پول خوب نمیدن
لطفا خصوصی به @miladhzz پیام بدید
✅ دوستانی که تازه شروع کردید به برنامه نویسی و میخواهید برای استخدام شدن به شرکت ها رزومه بدید.
من میتونم رزومه دات نتی پارسالم رو براتون بفرستم که ازش ایده بگیرید.
این رزومه رو هر جا فرستادم دعوت به مصاحبه شدم 😂
رزومه پایتونی ندارم. چون هنوز در حال یادگیری اش هستم و به کسی که در حال یادگیری هست پول خوب نمیدن
لطفا خصوصی به @miladhzz پیام بدید
👍2👎1
✅ چرا از شی گرایی استفاده کنیم؟
بعد از خوندن این چند خط اگه ایده ای دارید برام کامنت کنید لطفا ❤️
دارم یه دوره برنامه نویسی از پایه می سازم برای مبتدی ها. به فانکشن رسیدم و توی قسمت ۲۲ قراره شی گرایی (مقدماتی) رو شروع کنم.
یادمه سال 85 اولین بار داشتم شی گرایی رو توی سی++ میخوندم. اما حداقل 10 سال طول کشید یکم متوجه بشم داستان چیه 🥸
چرا؟
چون همه آموزش ها شروع میکنن که کلاس تایپ جدید است مثل String که خودمان میسازیم. متد دارد . اشیا را در نظر بگیرید. چند ریختی و وراثت این است کپسوله سازی و... اون سالها واقعا نمیتونستم دلیلش رو متوجه بشم. شاید هنوز هم متوجه نشدم!!!
✔️ حالا اگه بخواهیم به یه نفر توضیح بدیم که چرا از شی گرایی استفاده کنیم باید چطور شروع کنیم؟
توی اینترنت تقریبا همه برنامه نویسی ساخت یافته رو با شی گرا مقایسه کردن. اما این جواب نیست.
خب اولین سوالش قاعدتا اینه که با ساخت یافته که خیلی راحت ترم. چرا شی گرایی؟
این فعلا بهترین جوابی هست که تونستم پیدا کنم:
https://qr.ae/pv57pO
بعد از خوندن این چند خط اگه ایده ای دارید برام کامنت کنید لطفا ❤️
دارم یه دوره برنامه نویسی از پایه می سازم برای مبتدی ها. به فانکشن رسیدم و توی قسمت ۲۲ قراره شی گرایی (مقدماتی) رو شروع کنم.
یادمه سال 85 اولین بار داشتم شی گرایی رو توی سی++ میخوندم. اما حداقل 10 سال طول کشید یکم متوجه بشم داستان چیه 🥸
چرا؟
چون همه آموزش ها شروع میکنن که کلاس تایپ جدید است مثل String که خودمان میسازیم. متد دارد . اشیا را در نظر بگیرید. چند ریختی و وراثت این است کپسوله سازی و... اون سالها واقعا نمیتونستم دلیلش رو متوجه بشم. شاید هنوز هم متوجه نشدم!!!
✔️ حالا اگه بخواهیم به یه نفر توضیح بدیم که چرا از شی گرایی استفاده کنیم باید چطور شروع کنیم؟
توی اینترنت تقریبا همه برنامه نویسی ساخت یافته رو با شی گرا مقایسه کردن. اما این جواب نیست.
خب اولین سوالش قاعدتا اینه که با ساخت یافته که خیلی راحت ترم. چرا شی گرایی؟
این فعلا بهترین جوابی هست که تونستم پیدا کنم:
https://qr.ae/pv57pO
👍1👎1
جنگولرن
✅ چرا از شی گرایی استفاده کنیم؟ بعد از خوندن این چند خط اگه ایده ای دارید برام کامنت کنید لطفا ❤️ دارم یه دوره برنامه نویسی از پایه می سازم برای مبتدی ها. به فانکشن رسیدم و توی قسمت ۲۲ قراره شی گرایی (مقدماتی) رو شروع کنم. یادمه سال 85 اولین بار داشتم شی گرایی…
✅ جواب هایی که دوستان باتجربه به این سوال من دادن (تشکر از همه):
▪️ اگر قرار باشه پروسیجرال همه چیرو بریم جلو مثل این میشه که یه نفر باشه داخل سازمان املاک یا هر سازمانی تمامی وظایف رو از صفر تا صد انجام بده، وقتی وظایف یکی دوتا باشه خیلی عالی انجام میشه ولی وقتی داخل اون سازمان بیش از صد وظیفه باشه اون شخص قادر نخواهد بود انجام بده و اشتباه خواهد کرد و کارهام عقب خواهد ماند بخاطر این افراد متفاوت رو میاریم و برای هرکدام وظیفه مخصوص خودش رو میدیم و میگیم تو فقط کار اینه و اینجوری وقتی سازمان بزرگ میشه مشکل سرعت و اشتباهات از بین میره به شرطی که چارت سازمانی رو درست تحلیل کنیم
▪️کاری که زبان پروسیجرال میکنه از اول برنامه تا اون آخرش یه نفر کارو به دست میگیره و معمولا هم با یک هسته ی CPU کار میکنه و بیش از اون رو ساپورت نمیکنه مثل زبان C قدیم.
یعنی وقتی یک هسته cpu فقط بخواد کار رو انجام بده خوب نمیتونه به همه ی کار ها برسه.
البته این جواب توی زبان های برنامه نویسی جدید یکم نقص داره
من با گو کار کردم و به نظرم زبان های برنامه نویسی که مفموم های شی گرایی نداشته باشند واقعا در پروژه های بزرگ بشدت غیر قابل خواندن میشوند و توسعه ی اون ها خیلی خیلی سخت میشه.
برای همین مثلا از همین زبان گو برای درست کردن کار های تک وظیفه ای استفاده میشه. مثلاً در ساختن ماکرو سرویس های یک پروژه بزرگ.
▪️به نظرم جوابش فقط و فقط یه چیز است. سرعت در توسعه و تغییر کد است. مخصوصا توی کد های بسیار زیاد
برای همین این تنها جواب درستی که میشه داد.
شعی گرایی رو ما انسان ها راحت تر میتونیم درک کنیم.
وقتی کد بسیار بزرگ میشه ، تحلیل کد بسیار کار مشکلی میشه. شیی گرایی به کمک ما میان تا کد رو راحت تر درک کنیم و توسعه اون برامون راحت تر بشه
خود کدش سریع تر نیست اصلا ولی توسعه اش بسیار سریع تر میشه.
بخوام خارجی جواب بدم اینه:
برای داشتنscalbility و Readability در برنامه نویسی از شی گرایی استفاده میکنیم
▪️اگه میخوای به یه نو آموز این رو بفهمونی یه مثل مثل این بزن
ما یه شرکت داریم که کارش تولید صندلی ها م مبل هستش. این شرکت اگه بخواد سریع تر چندتا محصول رو بسازه باید سعی کنه کاری کنه که یه سری دسته بندی ها توی تولیدش تکراری باشه. مثلاً همه از یه جور پایه استفاده کنند و فقط با یه تغییر خیلی کوچک در پایه مبل بتونه یه طرح دیگه بزنه. یا طرح های رو جوری بسازه که بتونه هم مبل دو نفره بسازه و هم مبل چهار نفره و هم مبل و نفره.
این کار فقط و فقط ازکاری شبیه به برنامه نویسی شی گرایی بر میاد.
و اگه بخواد اون رو با کاری شبیه به پروسیجرال انجام بده هر دفعه برای هر مبل باید زمان زیادی صرف کنه تا اون مبل ساخته بشه.
برنامه نویسی پروسیجرال مثل یه نجار میمونه که هر دفعه میخواد مقل بسازه باید چکش و آره به دست بگیره و خودش تک و تنها از یه چوب خالی یه مبل زیبا رو بسازه و هر دفعه زمان زیادی رو باید بزارن برای هر مبل
برنامه نویسی شی گرایی به ما امکان میده که در زمان توسعه صرفه جویی کنیم و با یه سری تغییر کوچیک یه کار کاملا متفاوت بسازیم
▪️خب قبل از برنامه نویسی ساخت یافته همین goto ها بودن. و چیزی به اسم حلقه و متد و پروسیجر نبود. هرچند بعد از کامپایل بازم کامپیوتر به همون روش goto کار رو انجام میده.
ولی استفاده از goto در بسیاری موارد برنامه نویس رو به اشتباه میندازه. اون کامپیوتر هست که با اصول اسمبلی و زبان ماشین میتونه به راحتی ازش استفاده کنه.
مثل این میمونه که تو یه کتب داری میخونی، نویسنده تورو همیشه به چند صفحه جلوتر و یا چند صفحه عقب تر پرت میکنه. این باعث گیج شدن برنامه نویس موقع توسعه کد میشه و بعضی اوقات از goto استفاده میکنه که نباید بکنه و باعث خطا میشه و دیباگ کردن این کد شبیه به فاجعه است
خب به خاطر همین مشکلات بود که برنامه نویسی ساخت یافته ایجاد شد. قبل از برنامه نویسی ساخت یافته کدها scope نداشتن و متغیرها هم درهم بود.
که بعدها فهمیدن که اونم برای توسعه کد خوب نیست و رسیدن به همین شی گرایی
▪️من فکر میکنم که بایستی اینجوری بگیم که شی گرایی در ادامه روند تکامل مدل فکری برنامه نویسی ما مطرح شد. ساختار یافته برای نوشتن برنامه های قدیمی مناسب بود. برای اون فرم برنامه های مثلا ۴۰ سال پیش نقص نداشت ولی به فراخور رشد کامپیوتر و مدیومش نیازهایی مطرح شد که قبلا نبود. مثلا ماژولاریتی و تعامل. در مدل ساختاریافته همه چی حول دیتاست. در شی گرایی دیتا کپسوله میشه و همه چی دیگه حول رفتاره
▪️ اگر قرار باشه پروسیجرال همه چیرو بریم جلو مثل این میشه که یه نفر باشه داخل سازمان املاک یا هر سازمانی تمامی وظایف رو از صفر تا صد انجام بده، وقتی وظایف یکی دوتا باشه خیلی عالی انجام میشه ولی وقتی داخل اون سازمان بیش از صد وظیفه باشه اون شخص قادر نخواهد بود انجام بده و اشتباه خواهد کرد و کارهام عقب خواهد ماند بخاطر این افراد متفاوت رو میاریم و برای هرکدام وظیفه مخصوص خودش رو میدیم و میگیم تو فقط کار اینه و اینجوری وقتی سازمان بزرگ میشه مشکل سرعت و اشتباهات از بین میره به شرطی که چارت سازمانی رو درست تحلیل کنیم
▪️کاری که زبان پروسیجرال میکنه از اول برنامه تا اون آخرش یه نفر کارو به دست میگیره و معمولا هم با یک هسته ی CPU کار میکنه و بیش از اون رو ساپورت نمیکنه مثل زبان C قدیم.
یعنی وقتی یک هسته cpu فقط بخواد کار رو انجام بده خوب نمیتونه به همه ی کار ها برسه.
البته این جواب توی زبان های برنامه نویسی جدید یکم نقص داره
من با گو کار کردم و به نظرم زبان های برنامه نویسی که مفموم های شی گرایی نداشته باشند واقعا در پروژه های بزرگ بشدت غیر قابل خواندن میشوند و توسعه ی اون ها خیلی خیلی سخت میشه.
برای همین مثلا از همین زبان گو برای درست کردن کار های تک وظیفه ای استفاده میشه. مثلاً در ساختن ماکرو سرویس های یک پروژه بزرگ.
▪️به نظرم جوابش فقط و فقط یه چیز است. سرعت در توسعه و تغییر کد است. مخصوصا توی کد های بسیار زیاد
برای همین این تنها جواب درستی که میشه داد.
شعی گرایی رو ما انسان ها راحت تر میتونیم درک کنیم.
وقتی کد بسیار بزرگ میشه ، تحلیل کد بسیار کار مشکلی میشه. شیی گرایی به کمک ما میان تا کد رو راحت تر درک کنیم و توسعه اون برامون راحت تر بشه
خود کدش سریع تر نیست اصلا ولی توسعه اش بسیار سریع تر میشه.
بخوام خارجی جواب بدم اینه:
برای داشتنscalbility و Readability در برنامه نویسی از شی گرایی استفاده میکنیم
▪️اگه میخوای به یه نو آموز این رو بفهمونی یه مثل مثل این بزن
ما یه شرکت داریم که کارش تولید صندلی ها م مبل هستش. این شرکت اگه بخواد سریع تر چندتا محصول رو بسازه باید سعی کنه کاری کنه که یه سری دسته بندی ها توی تولیدش تکراری باشه. مثلاً همه از یه جور پایه استفاده کنند و فقط با یه تغییر خیلی کوچک در پایه مبل بتونه یه طرح دیگه بزنه. یا طرح های رو جوری بسازه که بتونه هم مبل دو نفره بسازه و هم مبل چهار نفره و هم مبل و نفره.
این کار فقط و فقط ازکاری شبیه به برنامه نویسی شی گرایی بر میاد.
و اگه بخواد اون رو با کاری شبیه به پروسیجرال انجام بده هر دفعه برای هر مبل باید زمان زیادی صرف کنه تا اون مبل ساخته بشه.
برنامه نویسی پروسیجرال مثل یه نجار میمونه که هر دفعه میخواد مقل بسازه باید چکش و آره به دست بگیره و خودش تک و تنها از یه چوب خالی یه مبل زیبا رو بسازه و هر دفعه زمان زیادی رو باید بزارن برای هر مبل
برنامه نویسی شی گرایی به ما امکان میده که در زمان توسعه صرفه جویی کنیم و با یه سری تغییر کوچیک یه کار کاملا متفاوت بسازیم
▪️خب قبل از برنامه نویسی ساخت یافته همین goto ها بودن. و چیزی به اسم حلقه و متد و پروسیجر نبود. هرچند بعد از کامپایل بازم کامپیوتر به همون روش goto کار رو انجام میده.
ولی استفاده از goto در بسیاری موارد برنامه نویس رو به اشتباه میندازه. اون کامپیوتر هست که با اصول اسمبلی و زبان ماشین میتونه به راحتی ازش استفاده کنه.
مثل این میمونه که تو یه کتب داری میخونی، نویسنده تورو همیشه به چند صفحه جلوتر و یا چند صفحه عقب تر پرت میکنه. این باعث گیج شدن برنامه نویس موقع توسعه کد میشه و بعضی اوقات از goto استفاده میکنه که نباید بکنه و باعث خطا میشه و دیباگ کردن این کد شبیه به فاجعه است
خب به خاطر همین مشکلات بود که برنامه نویسی ساخت یافته ایجاد شد. قبل از برنامه نویسی ساخت یافته کدها scope نداشتن و متغیرها هم درهم بود.
که بعدها فهمیدن که اونم برای توسعه کد خوب نیست و رسیدن به همین شی گرایی
▪️من فکر میکنم که بایستی اینجوری بگیم که شی گرایی در ادامه روند تکامل مدل فکری برنامه نویسی ما مطرح شد. ساختار یافته برای نوشتن برنامه های قدیمی مناسب بود. برای اون فرم برنامه های مثلا ۴۰ سال پیش نقص نداشت ولی به فراخور رشد کامپیوتر و مدیومش نیازهایی مطرح شد که قبلا نبود. مثلا ماژولاریتی و تعامل. در مدل ساختاریافته همه چی حول دیتاست. در شی گرایی دیتا کپسوله میشه و همه چی دیگه حول رفتاره
👎2
جزوه دستنویس پایتون.pdf
10.4 MB
✅ جزوه دستنویس پایتون (مبتدی)
سلام به همه. این جزوه زیبا رو خانم ریحانه محمدی نوشتند و خلاصه ای از کلاس پایتونی هستش که با بنده داشتند. (البته کل مطالب کلاس توی جزوه نوشته نشده و بخش های مهمش آورده شده)
از لینکدین ali nazarizadeh
سلام به همه. این جزوه زیبا رو خانم ریحانه محمدی نوشتند و خلاصه ای از کلاس پایتونی هستش که با بنده داشتند. (البته کل مطالب کلاس توی جزوه نوشته نشده و بخش های مهمش آورده شده)
از لینکدین ali nazarizadeh
👍9
جنگولرن
مطلبی در مورد لیست ها در پایتون و میزان فضایی که اشغال میکنن از لینکدین Ramin Ferdos محتوا در پست بعدی
قبل از استفاده از لیستها در پایتون، حتما این پست رو بخون! 👨💻🐍
💨 در راستای افزایش عملکرد کد پایتون، امروز میخوام یه نکته خیلی مهم رو تو #پایتون در خصوص لیستها بررسی کنیم که شاید کمتر کسی بدونه یا بهش دقت کنه. اگه تو کدتون از لیستها در پایتون استفاده میکنید، این نکته میتونه تاثیر زیادی تو عملکرد برنامهتون داشته باشه.
🔺 اما قبلش باید کمی در خصوص لیستها در پایتون صحبت کنیم، #لیست یا #list در پایتون یه ساختار دادهای به صورت builtin هست که در واقع یک #آرایه پویا هست. آرایه پویا یعنی قابل تغییر هست (Mutable) و امکان تغییر سایز رو هم داره.
🚨 نکته تو همین بحث تغییر سایز هست، فرض کنید که ما یه لیست داریم با ۵ آیتم و میخوایم یه آیتم دیگه بهش اضافه کنیم یا اصطلاحا append کنیم. این کار رو به راحتی با متد .append میتونیم انجام بدیم. 🚨
🌐 اتفاقی که در این حالت میوفته اینه که پایتون برای این که بتونه اون آیتم رو به لیست اولیه اضافه کنه، باید بیاد یه لیست جدید درست کنه که به اندازه ۶ آیتم جا داشته باشه و لیست قبلی رو نابود کنه. در ابتدا شاید فکر کنید که خب پایتون میاد یه لیست جدید به طول تعداد آیتمهای جدید درست میکنه، یعنی در این مثال ۶.
⚠️ اما نکته اینجاس که اینطور نیست!
🕯 فلسفه پایتون در این زمینه به این صورت هست که وقتی یکبار عملیات append داریم، به احتمال زیاد appendهای بیشتری در آینده برای اون لیست خواهیم داشت، پس برای حفظ سرعت O(1) در زمان اضافه کردن آیتم جدید به لیست، فضای بیشتری برای لیست جدید در نظر میگیره، اصطلاحا Overallocate میکنه.
🚨 اگه n تعداد آیتمهای لیست قبل از append و m میزان فضای اختصاص داده شده به واحد آیتم در لیست جدید باشه، فرمول تخصیص فضای اضافه در پایتون به این صورت هست:
m = (n >> 3) + (3 if n < 9 else 6)♾
🔹 توجه داشته باشید که << عملگر شیفت به راست هست تو پایتون.
🌐 تو این مثال n ما در ابتدا ۵ بود و لیستی که ساخته بودیم تو حافظه به میزان ۵ واحد فضا اشغال کرده بود، حالا اگه بهش یک آیتم append کنیم لیست جدید ما در حافظه در اصل ۸ واحد فضا اشغال میکنه. تا جایی برسه که لیست ما ۸ آیتم داشته باشه و بخوایم آیتم ۹ام رو append کنیم، در این حالت لیست جدید جای ۹ آیتم، ۱۶ واحد فضا اشغال میکنه و همینطوری تا انتها.
🔸 برای لیستها با ابعاد کوچک شاید این موضوع زیاد مهم نباشه، اما کم کم تبدیل به یک اصطلاحا Bloat در حافظه میشه، برای مثال اگه لیستی با ۱۰۰،۰۰۰ آیتم داشته باشیم، Append کردن بهش باعث میشه که ۲.۷ برابر فضای بیشتری نسبت به حالت ساخت لیست جدید با List Comprehension استفاده کنه.
✔️ در نهایت اگه میزان حافظه براتون مهم هست، جای append کردن به لیست، استفاده از List Comprehension و ساخت لیست جدید، باعث کاهش حافظه مصرفی برنامهتون به شکل چشمگیری خواهد شد!
👆🏻 توی تصویر مثالی از یک لیست تو پایتون که با استفاده از append چندین بار mutated میشه قابل مشاهده است. 👆🏻
لینک مطلب:
https://www.linkedin.com/posts/raminferdos_afyaepahyaesaewaeu-aesahyaebaes-list-activity-6964146839273017344-7oqc?utm_source=linkedin_share&utm_medium=member_desktop_web
💨 در راستای افزایش عملکرد کد پایتون، امروز میخوام یه نکته خیلی مهم رو تو #پایتون در خصوص لیستها بررسی کنیم که شاید کمتر کسی بدونه یا بهش دقت کنه. اگه تو کدتون از لیستها در پایتون استفاده میکنید، این نکته میتونه تاثیر زیادی تو عملکرد برنامهتون داشته باشه.
🔺 اما قبلش باید کمی در خصوص لیستها در پایتون صحبت کنیم، #لیست یا #list در پایتون یه ساختار دادهای به صورت builtin هست که در واقع یک #آرایه پویا هست. آرایه پویا یعنی قابل تغییر هست (Mutable) و امکان تغییر سایز رو هم داره.
🚨 نکته تو همین بحث تغییر سایز هست، فرض کنید که ما یه لیست داریم با ۵ آیتم و میخوایم یه آیتم دیگه بهش اضافه کنیم یا اصطلاحا append کنیم. این کار رو به راحتی با متد .append میتونیم انجام بدیم. 🚨
🌐 اتفاقی که در این حالت میوفته اینه که پایتون برای این که بتونه اون آیتم رو به لیست اولیه اضافه کنه، باید بیاد یه لیست جدید درست کنه که به اندازه ۶ آیتم جا داشته باشه و لیست قبلی رو نابود کنه. در ابتدا شاید فکر کنید که خب پایتون میاد یه لیست جدید به طول تعداد آیتمهای جدید درست میکنه، یعنی در این مثال ۶.
⚠️ اما نکته اینجاس که اینطور نیست!
🕯 فلسفه پایتون در این زمینه به این صورت هست که وقتی یکبار عملیات append داریم، به احتمال زیاد appendهای بیشتری در آینده برای اون لیست خواهیم داشت، پس برای حفظ سرعت O(1) در زمان اضافه کردن آیتم جدید به لیست، فضای بیشتری برای لیست جدید در نظر میگیره، اصطلاحا Overallocate میکنه.
🚨 اگه n تعداد آیتمهای لیست قبل از append و m میزان فضای اختصاص داده شده به واحد آیتم در لیست جدید باشه، فرمول تخصیص فضای اضافه در پایتون به این صورت هست:
m = (n >> 3) + (3 if n < 9 else 6)♾
🔹 توجه داشته باشید که << عملگر شیفت به راست هست تو پایتون.
🌐 تو این مثال n ما در ابتدا ۵ بود و لیستی که ساخته بودیم تو حافظه به میزان ۵ واحد فضا اشغال کرده بود، حالا اگه بهش یک آیتم append کنیم لیست جدید ما در حافظه در اصل ۸ واحد فضا اشغال میکنه. تا جایی برسه که لیست ما ۸ آیتم داشته باشه و بخوایم آیتم ۹ام رو append کنیم، در این حالت لیست جدید جای ۹ آیتم، ۱۶ واحد فضا اشغال میکنه و همینطوری تا انتها.
🔸 برای لیستها با ابعاد کوچک شاید این موضوع زیاد مهم نباشه، اما کم کم تبدیل به یک اصطلاحا Bloat در حافظه میشه، برای مثال اگه لیستی با ۱۰۰،۰۰۰ آیتم داشته باشیم، Append کردن بهش باعث میشه که ۲.۷ برابر فضای بیشتری نسبت به حالت ساخت لیست جدید با List Comprehension استفاده کنه.
✔️ در نهایت اگه میزان حافظه براتون مهم هست، جای append کردن به لیست، استفاده از List Comprehension و ساخت لیست جدید، باعث کاهش حافظه مصرفی برنامهتون به شکل چشمگیری خواهد شد!
👆🏻 توی تصویر مثالی از یک لیست تو پایتون که با استفاده از append چندین بار mutated میشه قابل مشاهده است. 👆🏻
لینک مطلب:
https://www.linkedin.com/posts/raminferdos_afyaepahyaesaewaeu-aesahyaebaes-list-activity-6964146839273017344-7oqc?utm_source=linkedin_share&utm_medium=member_desktop_web
👍5👏1🙏1
This media is not supported in your browser
VIEW IN TELEGRAM
✅ تفاوت سرعت الگوریتم های مرتب سازی مختلف در حالت های متفاوت
قدیمی هست، اما هنوز جالبه و میتونه در تصمیم گیری کمک کن
قدیمی هست، اما هنوز جالبه و میتونه در تصمیم گیری کمک کن
👍9🔥1
سلام به همه
من رزومه های مختلفی رو دیدم که شخص کمتر از یکسال هست که با پایتون و جنگو کار میکنه. و برام جالبه که همه سطح شی گرایی رو نوشتن خوب یا ستاره زیادی بهش دادن.
لطفا این لینک هارو یه نگاه بندازید (فارسی هستن):
https://python.coderz.ir/lessons/l17.html
https://python.coderz.ir/lessons/l18.html
https://python.coderz.ir/lessons/l19.html
https://python.coderz.ir/lessons/l20.html
https://python.coderz.ir/lessons/l21.html
https://python.coderz.ir/lessons/l22.html
✔️ بعد از دیدن اینها ببینید چقدر شی گرایی توی پایتون رو می دونستید. من سالهاست شی گرایی رو دارم میخونم اما هنوز واقعا خوب درکش نکردم.
شاید من یه چیزیم هست 🤷🏻♂️
مثلا مفهوم الماس رو من هنوز خوب نمی فهمم. موفق باشید
من رزومه های مختلفی رو دیدم که شخص کمتر از یکسال هست که با پایتون و جنگو کار میکنه. و برام جالبه که همه سطح شی گرایی رو نوشتن خوب یا ستاره زیادی بهش دادن.
لطفا این لینک هارو یه نگاه بندازید (فارسی هستن):
https://python.coderz.ir/lessons/l17.html
https://python.coderz.ir/lessons/l18.html
https://python.coderz.ir/lessons/l19.html
https://python.coderz.ir/lessons/l20.html
https://python.coderz.ir/lessons/l21.html
https://python.coderz.ir/lessons/l22.html
✔️ بعد از دیدن اینها ببینید چقدر شی گرایی توی پایتون رو می دونستید. من سالهاست شی گرایی رو دارم میخونم اما هنوز واقعا خوب درکش نکردم.
شاید من یه چیزیم هست 🤷🏻♂️
مثلا مفهوم الماس رو من هنوز خوب نمی فهمم. موفق باشید
👍12❤2👎1🔥1
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (Seyed Mohammad Khoshnava)
📌 مراحل ارسال کد otp و احراز هویت آن
ارسال کد :
شماره تلفن رو چک میکنم که آیا در دیتابیس چنین اکانتی بن/حذف شده یا نه
یک داکیومنت برای otp به شکل زیر در نظر میگیرم
class OTPDocument(Document):
code = fields.StringField()
contact = fields.StringField()
expire_at = fields.LongField()
retry = fields.IntField()
created_at = fields.DateTimeField(default=datetime.datetime.utcnow)
فیلد کد : حاوی کدی که قراره ارسال کنم
فیلد کانتکت : حاوی ایمیل یا شماره تلفنی که قراره بهش کد ارسال کنم
فیلد تاریخ انقضا : زمان منقضی شدن کد
فیلد تعداد تلاش : تعداد دفعاتی که کد برای ورود چک میشه و اشتباه زده شده
فیلد تاریخ ساخت : جهت حذف خودکار توسط مونگو (بعد از یک ساعت توسط ایندکس expireAfterSeconds دلیتش میکنم)
چرا بعد یکساعت منقضی میکنم ؟ که اگر تعداد تلاش رفته باشه بالا بازم بعد یکساعت بتونه درخواست بده(صفر بشه یعنی)
اگر هنگام درخواست داکیومنت موجود باشه و هنوز منقضی نشده باشه کد قبلی نمیتونه درخواست کد جدید بده
کد رو برای کاربر ارسال میکنم (پیامک یا ایمیل) و بهش ایدی دیتابیس (مونگو یک ایدی ۳۲ کاراکتری داره)
اگر دیتابیس مونگو نیست یا نیاز به امنیت بیشتر هست یک فیلد بزارید و یک کد ۳۲ کاراکتری جنریت کنید و بدید دست کاربر
تو مرحله بعدی کاربر اون کد جنریت شده مرحله قبل یا ایدی دیتابیس مونگو رو ازش میگیریم و کد هم دریافت میکنیم (با شماره سرچ نمیزنیم توی دیتابیس . با اون کد چک میکنیم)
احراز هویت کد :
اگر کد جنریت شده (۳۲ کاراکتری ) اشتباه باشه درخواستش رو رد میکنم
اگر کد جنریت شده درست باشه ولی با کد otp اشتباه داده بشه توی دیتابیس تعداد retry رو میبرم بالا
اگر تعداد تلاش بیشتر از لیمیت کانفیگم باشه و همچنین به زمان اکسپایر نرسیده باشیم. درخواستش رد میکنم
اگر زمان اکسپایر گذشته باشه درخواستش رد میکنم
باقی مراحل مربوط به ساخت توکن یا سشن جهت ورود …
⚠️ تعداد درخواست در هر ساعت روی این متد ها لیمیت میشه بر اساس ای پی و ایدی دیوایس
🚫 از نظر من امنه. خوشحال میشم اگر باگی بگید
🖥 @SEYED_BAX
ارسال کد :
شماره تلفن رو چک میکنم که آیا در دیتابیس چنین اکانتی بن/حذف شده یا نه
یک داکیومنت برای otp به شکل زیر در نظر میگیرم
class OTPDocument(Document):
code = fields.StringField()
contact = fields.StringField()
expire_at = fields.LongField()
retry = fields.IntField()
created_at = fields.DateTimeField(default=datetime.datetime.utcnow)
فیلد کد : حاوی کدی که قراره ارسال کنم
فیلد کانتکت : حاوی ایمیل یا شماره تلفنی که قراره بهش کد ارسال کنم
فیلد تاریخ انقضا : زمان منقضی شدن کد
فیلد تعداد تلاش : تعداد دفعاتی که کد برای ورود چک میشه و اشتباه زده شده
فیلد تاریخ ساخت : جهت حذف خودکار توسط مونگو (بعد از یک ساعت توسط ایندکس expireAfterSeconds دلیتش میکنم)
چرا بعد یکساعت منقضی میکنم ؟ که اگر تعداد تلاش رفته باشه بالا بازم بعد یکساعت بتونه درخواست بده(صفر بشه یعنی)
اگر هنگام درخواست داکیومنت موجود باشه و هنوز منقضی نشده باشه کد قبلی نمیتونه درخواست کد جدید بده
کد رو برای کاربر ارسال میکنم (پیامک یا ایمیل) و بهش ایدی دیتابیس (مونگو یک ایدی ۳۲ کاراکتری داره)
اگر دیتابیس مونگو نیست یا نیاز به امنیت بیشتر هست یک فیلد بزارید و یک کد ۳۲ کاراکتری جنریت کنید و بدید دست کاربر
تو مرحله بعدی کاربر اون کد جنریت شده مرحله قبل یا ایدی دیتابیس مونگو رو ازش میگیریم و کد هم دریافت میکنیم (با شماره سرچ نمیزنیم توی دیتابیس . با اون کد چک میکنیم)
احراز هویت کد :
اگر کد جنریت شده (۳۲ کاراکتری ) اشتباه باشه درخواستش رو رد میکنم
اگر کد جنریت شده درست باشه ولی با کد otp اشتباه داده بشه توی دیتابیس تعداد retry رو میبرم بالا
اگر تعداد تلاش بیشتر از لیمیت کانفیگم باشه و همچنین به زمان اکسپایر نرسیده باشیم. درخواستش رد میکنم
اگر زمان اکسپایر گذشته باشه درخواستش رد میکنم
باقی مراحل مربوط به ساخت توکن یا سشن جهت ورود …
⚠️ تعداد درخواست در هر ساعت روی این متد ها لیمیت میشه بر اساس ای پی و ایدی دیوایس
🚫 از نظر من امنه. خوشحال میشم اگر باگی بگید
🖥 @SEYED_BAX
👍2
🧐 10 Must-have Tips of Django REST framework to Increase your Coding Efficiency
1.Set current user field inserializer.py
2. Composite Index and Composite Unique key in model.py
3. Pass extra context variables to the serializer.py from view.py
4. Validate JSON input data in serializer.py
5. Obtain querySet of all rows, with specific fields
6. Use Signal to decouple business logics
7. Use request.user in Middleware
8. Pagination settings
9. Custom view level permission and object-level permission
10. The best Django REST reference resource: https://www.cdrf.co/
لینک توضیحات کامل ده تا نکته بالا (من DRF بلد نیستم. اگه نکته اشتباهی گفته لطفا بگید):
https://medium.com/analytics-vidhya/10-must-have-tips-of-django-rest-framework-to-increase-your-coding-efficiency-87ebea0e0099
1.Set current user field inserializer.py
2. Composite Index and Composite Unique key in model.py
3. Pass extra context variables to the serializer.py from view.py
4. Validate JSON input data in serializer.py
5. Obtain querySet of all rows, with specific fields
6. Use Signal to decouple business logics
7. Use request.user in Middleware
8. Pagination settings
9. Custom view level permission and object-level permission
10. The best Django REST reference resource: https://www.cdrf.co/
لینک توضیحات کامل ده تا نکته بالا (من DRF بلد نیستم. اگه نکته اشتباهی گفته لطفا بگید):
https://medium.com/analytics-vidhya/10-must-have-tips-of-django-rest-framework-to-increase-your-coding-efficiency-87ebea0e0099
👍3