جنگولرن
3.78K subscribers
287 photos
74 videos
31 files
553 links
آموزش Django و بستگان
Download Telegram
.

لینک ویدیوی جلسه 18:

https://youtu.be/OuyMAOgwZbc

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

جزوه ای که روش تدریس میکنم :
https://github.com/SEYEDBAX/course-notes/tree/main/lesson-18


🔔 حتما حتما یوتیوب رو فالو کنید و ویدیو رو لایک کنید و نوتیف رو روشن بزارید 🫶

https://t.me/QaDeveloper

تمرین : طبق مواردی که در انتهای ویدیو گفته شد به کمک شی گرایی ۴ امین ماشین حساب رو هم شما بسازید

@SEYED_BAX | @MakeDeveloper
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
Media is too big
VIEW IN TELEGRAM
دو تا تابع مهم در جنگو به نام های:
prefetch_related & select_related

از لینکدین Ebrahim Kiani

سلام خدمت دوستان عزیز لینکدین👋🏻
امیدوارم حالتون خوب باشه🙂
تو این کلیپ کوتاه آموزشی سعی کردم دو تا تابع مهم در جنگو به نام های:
prefetch_related & select_related
که در پرفورمنس برنامه هامون هم نقش بسزایی دارند رو آموزش بدم.
البته این مباحث را خودم از داخل یکی از مصاحبه هام یاد گرفتم و برای همین کلیپ آن را درست کردم.
پیشاپیش ممنونم از حمایت هاتون🤗
🔥7
Forwarded from Microfrontend.ir
از هفته بعد تمرکز کانال بر روی داکر و پستگرس خواهد بود و پلی لیست‌های جاوا اسکریپت رو هم با سرعت کمتری ادامه می‌دم. روی یک پلی لیست آموزش Go هم دارم کار می‌کنم که چون می‌خوام مثل پلی لیست‌های ناقص دیگه نشه تا کامل ضبط نکنم منتشر نمی‌کنم. برای حمایت از کانال به دوستان خود بگویید :)

https://youtube.com/microfrontend

〰️〰️〰️〰️〰️〰️
© | @microfrontend_ir
3👍3🔥1
بیایید به بهانه آپتومایز کردن کوئری‌های #جنگو چندتا چیز جدید درباره ORM جنگو یاد بگیریم

شما همیشه وقتی چیزی رو نیاز دارید داخل جنگو همچین کوئری میزنید:

Record.objects.filter(id__in=[1,2,3,4])


خب این قرار آبجکت‌هایی که ایدی ۱ تا ۴ دارن بهمون بده. حالا شما میخوایید با اینا یکسری پردازش انجام بدید مثلا بیایید اسم همه رکوردها رو نشون کار برید یا به عبارتی:


for r in records:
print(record.name)


و کار شما اینجا تموم میشه و خوشحال میشید. اماااااااا شما یک عالمه پردازش بی جا انجام دادید و یک عالمه منابع الکی خرج کرید. بیایید ببینیم کوئری بالا وقتی sql میشه چه شکلی میشه:



SELECT id,
name,
created_at,
is_deleted
FROM records
WHERE id IN (1, 2, 3, 4);


این چیزی که داخل دیتابیس اجرا میشه. متوجه اش شدید؟

اگه نشدید باید بگم شما فقط به فیلد name نیاز داشتید اما تمام فیلدهای اون اون رکوردها رو گرفتید! هیچ وقت هم ازشون استفاده نکردید.

برای حل این مشکل جنگو دوتا راه حل داره:
1. values
2. values_list

با استفاده از این دو میتونید فقط فیلدهایی که میخوایید رو بگیرید. برای مثال:



Record.objects.filter(id__in=[1,2,3,4]).values('name')



و حالا کوئری که میسازید همچین چیزی خواهد شد:


SELECT name
FROM records
WHERE id IN (1, 2, 3, 4);



و همینطور که میبینید حالا فقط اون فیلدی رو گرفتید که لازمش دارید.

تفاوت بین values و valuse_list تنها در دیتا استراکچر خروجی که به شما میده و داخل کوئری نهایی هردو مثل هم عمل میکنن. برای درک بیشتر:



>>> Record.objects.filter(is_deleted=False).values('id', 'name')
<QuerySet [{'id': 1, 'name': 'First record'}, {'id': 2, 'name': 'Second Record'}, {'id': 3, 'name': 'Third Record'}]>

>>> Record.objects.filter(is_deleted=False).values_list('id', 'name')
<QuerySet [(1, 'First record'), (2, 'Second Record'), (3, 'Third Record')]>


بله یکی دیکشنری و دومی تاپل :) همچنین اگه فقط فقط یک فیلد میخوایید مثلا name میتونید از flat=True هم استفاده کنید برای بهتر شدن دیتا خروجی:


>>> Record.objects.filter(is_deleted=False).values_list('name',flat=True)
<QuerySet ['First record', 'Second Record', 'Third Record']>


@TorhamDevCH
👍14🔥71
Media is too big
VIEW IN TELEGRAM
ساخت توکن لینک فعالسازی ایمیل در جنگو

بخشی از آپدیت جدید دوره فروشگاه اینترنتی با جنگو.
این قسمت در مورد اینا صحبت شد:
✔️مفهوم توکن
✔️کد بندی Base64
✔️متد get current site
✔️یکی از دلایل نگهداری امن از secret key جنگو
✔️و...

لینک آپارات:
https://www.aparat.com/v/uskbt0m
هر انتقاد یا پیشنهادی به این قسمت دارید به @miladhzz پیام بدید

لینک خرید این دوره 🫣🤫 :
https://www.daneshjooyar.com/project-django/

تشکر
👍3
چطور کوئری آپدیت بهتری داخل #جنگو بزنیم؟

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

مدل فرضی:

class Records(models.Model):
name = models.Charfield()
balance = models.InetegerField()
country =models.CharField()

برای مثال اگه کسی بخواد یک آبجکت از این مدل رو آپدیت کنه همچین کار میکنه:

r = Records.objects.get(pk=1)
r.name = "new name"
r.save()

که این اوکیه، بد نیست و آپدیت براتون انجام میده اما یک نکته رو بهش توجه نمیکنید!

زمانی که شما یک آبجکت این شکلی آپدیت میکنید در اصل دارید تمام فیلد‌ها رو آپدیت میکنید :) ولی خب مقدار فیلدهای قبلی همون قبلی ها آپدیت میشه، برای اینکه از این کار جلو گیری کنید باید explicit ( نمیدونم، فکر کنم دقیق تر معنی بده) باشید یعنی، دقیقا بگید کدوم فیلد/فیلدها میخوایید آپدیت کنید. این کار میکنید با استفاده از پارامتر update_fields انجام بدید.

r = Records.objects.get(pk=1)
r.name = "new name"
r.save(update_fields=["name"])


البته باید مراقب باشید که حتما فیلدهایی که میخوایید آپدیت کنید رو داخلش بزارید مگرنه آپدیت نمیشن.

پست بعدی آپدیت کردن چند آبجکت...


@TorhamDevCH
9👍6
این کد جنگو رو ببینید. کاربر با موبایل میتونه لاگین میکنه.
به هر دلیلی خواستیم بتونه فقط با فیلد موبایل لاگین کنه.

سوال:
وقتی به این راحتی میشه لاگین کرد چه نیازی به ساختن authentication backend داریم؟

اون django_login همون متد login جنگو هست. توی django.contrib.auth

آپدیت سوال:
ببیند مثلا من میخوام ادمین با user, pass توی پنل ادمینم لاگین بشه.
اما کاربرهای من با مثلا موبایل لاگین بشن.
برای لاگین شدن فقط میتونم با کال کردن متد لاگین و دادن user بهش اون user رو لاگین کنم.
پس چه نیازی به ساخت authentication backend کاستوم دارم؟
4🔥1
در مورد سوال قبلی

ببینید همونطوری که از اسمش پیداست authentication backend کارش authenticate هست.
اما کدی که من نوشتم لاگین کرده.

✔️بکند کارش لاگین کردن نیست. کارش احراز هویته (دقت کنید نه احراز دسترسی. با authorization فرق داره)
یعنی فقط میگه مثلا این موبایلی که دادی این اوکیه و اینم یوزرش هست.
بعد یوزری که میده رو لاگین می کنیم خودمون.

وقتی بکند کاستوم می سازیم. مثلا یه بکند داریم فقط موبایل میگیره. یکی هم پیشفرض سیستم هست با user, pass
وقتی متد authenticate رو (که توی django.contrib.auth هست) صدا می زنیم.

✔️خود جنگو تشخیص میده با کدوم بکند authenticate کنه. البته از لیست بکندهایی که توی تنظیمات هست استفاده میکنه.

✔️و البته signature ع بکند هم مهمه برای این تشخیص و اولین بکندی که باهاشون بخونه رو استفاده میکنه. البته اگه signature شون مثل هم باشه به ترتیبی که قرار دارند authenticate میکنه و اولی که اوکی بشه دیگه ادامه نمیده.

عکس کدهای جنگو هست. ببینید داره for میزنه توی بکندهایی که ما توی settings مشخص می کنیم. خط 68
👍41
آپدیت کردن چند آبجکت به صورت همزمان در #جنگو

فریم‌ورک #django قابلیت آپدیت کردن دیتاها رو به روش ها مختلف داره که خیلی ها یا ازش بی خبر ان یا استفاده نمیکنن. بیایید ببینیم هر کدوم رو کجا استفاده کنی بهتره :)

مدل فرضی:

class Records(models.Model):
name = models.Charfield()
balance = models.InetegerField()
country =models.CharField()

خب فرض کنید ما یک هدیه به مناسب عید نو روز میخواییم به کاربرا بدیم، مثلا میخاییم نفری ۲ هزار تومن هدیه بدیم D:

حالا چند روش وجود داره.

روش اول ( نوب):
users = Records.objects.all()

for user in users:
user.balanc = user.balance + 2
user.save()

خیلی ساده و البته درب و داغون در خیلی جهات. مشکل اول اینه که ما رو همه کاربرا حلقه میزنیم و هر بار آپدیت رو روی کاربرا صدا میزنیم یعنی برای هر یوزر یک درخواست اپدیت به دیتابیس میره که اگه ۱ میلیون یوزر داشته باشیم ۱ میلیون درخواست میره :).

( تو اینه پست به اینکه باید از F استفاده کنید یا کانکارنسی و اینا هندل کنید اشاره نمیکنم، پست‌ها قبلی بخونید)

حالا روش بهتر چیه؟

روش بهتر:

user = Records.objects.update(balance=F("balance") + 2 )

همینقدر ساده :)


سناریو دوم: با بک‌اند یک بازی خفن رو داریم توسعه میدیم، داخل این بازی هر هفته یک ایونت اتفاق میوفته که افرادی که اون رو تموم کنن در آخر هفته یک تایتل به کنار اسمشون اضافه میشه و همچنین اگه امتیاز بالاتر از ۱۰ کسب کرده باشن به بالانس پول داخل گیم‌شون هم ۱۰۰ تا گلد اضافه میشه.


حالا بیایید فقط کوئری آپدیت این بهش ببینیم، فرض کنید این کوئری آخر هفته اجرا میشه. ( این فیلدا تو مدل فرض نداریم دیگه خودتون فرض کنید هست 😂❤️)

users = Records objects.fileter(done_weekly=True)

for user in users:
user.name = "Grunt " + user.name
if user.weekly_score >= 10:
user.balance = user.balance + 100

user.save()


خب همینطور که خیلی معلومه مشکلات فراوان داخلش هست. بزرگ‌ترین مشکلش اینه که هر بار برای هر کاربر یک درخواست آپدیت میدیم که میشهه همون مشکل بالا، آما آیا این بار میشه از روش بالا استفاده کرد و اینو فیکسش کرد؟ نه
روش بالا زمانی کاربرد داره که فیلدها قراره یک مقداری ثابتی به همشون داده بشه، اینجا بعضی ها ۱۰۰ تا گلد میگیرن بعضی ها نه پس کار نمیکنه، اینجا ما میتونیم از فانکشن bulk_update جنگو استفاده کنیم.

همون حلقه بالا رو میزنید با این تفاوت که داخلش .save رو صدا نمیزنید و تمام آبجکت‌ها رو داخل مموری آپدیت میکنید و بعد همچین حرکتی میزنید:

Records.objects.bulk_update(updated_users_list)

و تموم همرو با هم آپدیت میکنید با یک درخواست اینجا حتی میتونید یک قدم جلوتر برید و با اضافه کردن updated_fields به ورودی فانشکن و مشخص کردن اینکه دقیقا دوتا فیلد بالانس و نام فقط قرار آپدیت بشه بهترش کنید!

از این به بعد بهتر آپدیت کنید :)

@TorhamDevCH
👍13
اگه هنوز سراغ این کتاب ۹۷ چیز که باید هر برنامه‌نویسی بدونه، نرفتید یه چند تا موردش که جالب بود برام رو می‌ذارم شاید علاقه‌مند شدین:

در مورد ۹ام، می‌گه که وقتی یه مشکلی وجود داره در نظر بگیرید که اون مشکل توی کد شماست نه سیستم‌عامل و کامپایلر. اگرچه کامپایلر و سیستم‌عامل و کتاب‌خونه هم ممکنه باگ داشته باشن ولی اونا رو هزاران نفر دیگه هم استفاده میکنن و خیلی بعیده باگ شناخته‌نشده‌ای داشته باشن در حالی که کد خودتون رو احتمالا تازه نوشتین و کاربرای کمتری هم داره.
https://97-things-every-x-should-know.gitbook.io/97-things-every-programmer-should-know/en/thing_09

مورد ۴۳ام می‌گه که استفاده از IDE بد نیست، اما یاد بگیرید در کنارش از ابزارهای cli برای کارهاتون مثل کامپایل کردن کد استفاده کنید.
https://97-things-every-x-should-know.gitbook.io/97-things-every-programmer-should-know/en/thing_43

مورد ۶۲ام می‌گه که تنها چیزی که می‌تونید بهش اعتماد کنید راست بگه خود کده، چون داکیومنت ممکنه قدیمی باشه یا دقیق نباشه و دقیقا اتفاقی که می‌افته رو توضیح نده.
https://97-things-every-x-should-know.gitbook.io/97-things-every-programmer-should-know/en/thing_62


توی مورد ۴۲ام هم کی‌گه که سعی کنید کامپایلر رو خوشحال کنید، یعنی به warningها در زودترین زمان ممکن رسیدگی کنید.
https://97-things-every-x-should-know.gitbook.io/97-things-every-programmer-should-know/en/thing_42
👍91
جلسه ۱۰ - شی گرایی در پایتون.pdf
880.2 KB
جزوه جلسه ۱۰ با تشکر از اقا مهدی

@SEYED_BAX | @MakeDeveloper
Please open Telegram to view this post
VIEW IN TELEGRAM
3
دوره غیر رایگان ساخت فروشگاه اینترنتی با جنگو آپدیت شد.

قسمت های زیر اضافه شدند:

فصل هفتم
✔️ریفکتور کدهای پرداخت

فصل هشتم
✔️فرم ورود با رمز عبور
✔️فرم ثبت نام کاربر
✔️آماده سازی ارسال ایمیل فعالسازی
✔️تولید توکن فعالسازی ایمیل
✔️فعالسازی حساب کاربر
✔️آماده سازی ورود با موبایل
✔️ورود موفق با کد یکبار مصرف

چند قسمت از این دوره رو اینجا ببینید:
https://t.me/djangolearn_ir/531
https://t.me/djangolearn_ir/533
https://t.me/djangolearn_ir/573
https://t.me/djangolearn_ir/676
https://t.me/djangolearn_ir/724
https://t.me/djangolearn_ir/808

لینک دوره در دانشجویار:
https://www.daneshjooyar.com/project-django/
1
Media is too big
VIEW IN TELEGRAM
نکاتی در مورد دلیل استفاده از authentication backends در جنگو

توی این ویدئو که بخشی از آپدیت جدید آموزش ساخت فروشگاه اینترنتی هست در مورد موضوعات زیر صحبت شد:
✔️مشکل لاگین نشدن کاربران جدید
✔️روش استفاده از get or create در جنگو
✔️بررسی مشکل منقضی نشدن کد یکبار مصرف بعد از ورود موفق
✔️بررسی مشکل مشخص نبودن تاریخ انقضای OTP
✔️درک نیاز به authentication backends در جنگو

لینک آپارات:
https://www.aparat.com/v/tizv220
2👍2
ماک اینترویو با بابی
از کانال @BenDevelop

مصاحبه فنی پوزیشن Senior Python/rust cloud engineer

مصاحبه پر از مفاهیمی برای یادگیری بود.

این بخش های ویدئو به نظرم جالب بود:

✔️مفاهیم تست
https://youtu.be/FmYbGSyY0XM?t=673
✔️سناریو چهارم (در مورد Down شدن سایت):
https://youtu.be/FmYbGSyY0XM?t=2892
✔️مساله پایتونی اول (در مورد priority queues):
https://youtu.be/FmYbGSyY0XM?t=3975
✔️مساله پایتونی دوم (اجرای اتوماتیک اسکریپت ها از یک فولدر خاص):
https://youtu.be/FmYbGSyY0XM?t=4714
یه نکته امنیتی در جنگو

این کد ModelBackend دیفالت جنگو هست (برای authenticate و در ادامه اش لاگین کردن). قبل از اینکه توضیحات پایین رو ببینید. به نظرتون دلیل نوشتن خط 50 چی بوده؟ البته کامنت هاش گفته چرا این کارو کرده و اون شماره 20760 شماره تیکت ش توی سایت جنگو هست.

اگه جنگو این کد رو نمی نوشت، Attacker می تونست متوجه بشه یوزری که وارد کرده توی دیتابیس هست یا نه. اما این کد پسورد وارد شده رو hash میکنه تا پاسخ به کلاینت هم اندازه وقتی بشه که یوزر وجود داره و پسوردش بررسی میشه.

لینک تیکت:
https://code.djangoproject.com/ticket/20760
👍18👏1
جنگولرن
بدبختی های ساخت اسرائیل و دیگران 😔
و بدبختی های ساخت روسیه و دیگران 😔
👍6👎6
چه پیشنهادهایی برای بهتر شدن این کد دارید؟
میتونید به @miladhzz بفرستید
👍5