Forwarded from TorhamDev | تورهام 😳
کوئری raw زدن در #جنگو
درسته #django یک ORM خوب داره و تقریبا تمام چیزهایی که لازم دارید رو ساپورت میکنه اما شما میتونید داخل جنگو مستقیم کوئری SQL ران کنید!
ران کردن این کوئریها به صورت raw میتونه تو دو لایه در جنگو انجام بشه. یک در لایه مدل خودتون و دومی تو لایه پایین تر مستقیم با کانکشن دیتابیس.
تو حال اول جنگو سعی میکنه که خروجی SQL را براتون Map کنه و خروجی دوباره مدل براتون برگردونه حتی وقتی دارید raw میزنید مثال:
مدل فرضی:
کوئری مثال:
این کوئری دقیقا معادل objects.all() و جنگو خروجی رو بر اساس اسم فیلدها مپ میکنه به مدل. این مهمه ها! بر اساس اسم فیلد! یعنی شما میتونید کوئری رو حتی رو یک تیبل دیگه بزنید و تا زمانی که اسم فیلدا خروجیتون با مدل یکی باشه جنگو اونهارو مپ میکنه. مثال:
بله میتونیم از AS استفاده کنیم و اسم فیلدا مشابه مدلمون بزاریم. خود جنگو هم یک فیچر داره که براتون همین AS رو میزنه!
میتونید از پارامتر translations استفاده کنید برای اینکار.
میتونید برخی از فیلدها رو انتخاب نکنید!
برای مثال:
برای مثال داخل این raw کوئری ما فیلد last_name رو انتخاب نکردیم. حالا چه اتفاقی افتاده؟ همچنان اگه شما فیلد last_name صدا بزنید مشکلی پیش نمیاد و دریافتش میکنید ولیییییی جنگو از اونجایی که اون فیلد داخل کوئری وارد نکرده بودید و خروجیش رو نداشته خودش میاد همون لحضه دوباره یک درخواست به دیتابیس میزنه و اون دریافت میکنه!
لایه خود کانکشن
اگه این مپینگ رو نمیخایید و کلا میخوایید یک کوئری مستقیم بزنید مثل زمانی که از یک کتابخونه معمولی تو پایتون برای دیتابیس استفاده میکنید میتونید از connection در جنگو استفاده کنید! مثال:
خروجی یک لیست از نتایج خواهد بود. البته میتونید با یک حرکت ساده این لیست مپ کنید خودتون و در نهایت یک دیکشنری داشته باشید.
و آخرین نکته اینکه وقتی دارید از raw استفاده میکنید دیگه اسلایس کردن رو لول کوئری لیمیت نمیزاره و بهتره از LIMIT استفاده کنید داخل خود کوئری SQL
@TorhamDevCH
درسته #django یک ORM خوب داره و تقریبا تمام چیزهایی که لازم دارید رو ساپورت میکنه اما شما میتونید داخل جنگو مستقیم کوئری SQL ران کنید!
ران کردن این کوئریها به صورت raw میتونه تو دو لایه در جنگو انجام بشه. یک در لایه مدل خودتون و دومی تو لایه پایین تر مستقیم با کانکشن دیتابیس.
تو حال اول جنگو سعی میکنه که خروجی SQL را براتون Map کنه و خروجی دوباره مدل براتون برگردونه حتی وقتی دارید raw میزنید مثال:
مدل فرضی:
class Person(models.Model):
first_name = models.CharField(...)
last_name = models.CharField(...)
birth_date = models.DateField(...)
کوئری مثال:
Person.objects.raw("SELECT * FROM myapp_person")
این کوئری دقیقا معادل objects.all() و جنگو خروجی رو بر اساس اسم فیلدها مپ میکنه به مدل. این مهمه ها! بر اساس اسم فیلد! یعنی شما میتونید کوئری رو حتی رو یک تیبل دیگه بزنید و تا زمانی که اسم فیلدا خروجیتون با مدل یکی باشه جنگو اونهارو مپ میکنه. مثال:
>>> Person.objects.raw(
... """
... SELECT first AS first_name,
... last AS last_name,
... bd AS birth_date,
... pk AS id,
... FROM some_other_table
... """
... )
بله میتونیم از AS استفاده کنیم و اسم فیلدا مشابه مدلمون بزاریم. خود جنگو هم یک فیچر داره که براتون همین AS رو میزنه!
>>> name_map = {"first": "first_name", "last": "last_name", "bd": "birth_date", "pk": "id"}
>>> Person.objects.raw("SELECT * FROM some_other_table", translations=name_map)
میتونید از پارامتر translations استفاده کنید برای اینکار.
میتونید برخی از فیلدها رو انتخاب نکنید!
برای مثال:
>>> for p in Person.objects.raw("SELECT id, first_name FROM myapp_person"):
... print(
... p.first_name, # This will be retrieved by the original query
... p.last_name, # This will be retrieved on demand
... )
...
برای مثال داخل این raw کوئری ما فیلد last_name رو انتخاب نکردیم. حالا چه اتفاقی افتاده؟ همچنان اگه شما فیلد last_name صدا بزنید مشکلی پیش نمیاد و دریافتش میکنید ولیییییی جنگو از اونجایی که اون فیلد داخل کوئری وارد نکرده بودید و خروجیش رو نداشته خودش میاد همون لحضه دوباره یک درخواست به دیتابیس میزنه و اون دریافت میکنه!
لایه خود کانکشن
اگه این مپینگ رو نمیخایید و کلا میخوایید یک کوئری مستقیم بزنید مثل زمانی که از یک کتابخونه معمولی تو پایتون برای دیتابیس استفاده میکنید میتونید از connection در جنگو استفاده کنید! مثال:
from django.db import connection
def my_custom_sql(self):
with connection.cursor() as cursor:
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
return row
خروجی یک لیست از نتایج خواهد بود. البته میتونید با یک حرکت ساده این لیست مپ کنید خودتون و در نهایت یک دیکشنری داشته باشید.
def dictfetchall(cursor):
"""
Return all rows from a cursor as a dict.
Assume the column names are unique.
"""
columns = [col[0] for col in cursor.description]
return [dict(zip(columns, row)) for row in cursor.fetchall()]
و آخرین نکته اینکه وقتی دارید از raw استفاده میکنید دیگه اسلایس کردن رو لول کوئری لیمیت نمیزاره و بهتره از LIMIT استفاده کنید داخل خود کوئری SQL
@TorhamDevCH
👍5
✅نسخه قبلی دوره ساخت فروشگاه اینترنتی با جنگو رایگان شد.
سرفصل های دوره قبل:
✔️ ساخت پروژه فروشگاه
✔️پیاده سازی قالب
✔️ ساخت مدل ها و ایجاد ارتباط منطقی بین جداول پایگاه داده
✔️ آشنایی با PostgreSQL
✔️ آماده سازی سبد خرید با Django Session –
✔️ ساخت Context Processor اختصاصی
✔️ ثبت سفارش مشتری و ارائه شماره سفارش
✔️ راه اندازی درگاه پرداخت اینترنتی
✔️ کانفیگ پکیج django-allauth
✔️ عضویت با django-allauth و Authentication
✔️ گانفیک email جهت ارسال تاییدیه عضویت به کاربر
✔️ ساخت API در Google Developer Console
✔️ ثبت نام در سایت با Google Account
ان شالله به مرور ویدئوهای دوره قبلی رو توی آپارات - یوتیوب و تلگرام به صورت کامل آپلود میکنم.
و لینک نسخه جدید آموزش ساخت فروشگاه اینترنتی با جنگو با 64 درصد تخفیف:
https://www.daneshjooyar.com/project-django/
سرفصل های دوره قبل:
✔️ ساخت پروژه فروشگاه
✔️پیاده سازی قالب
✔️ ساخت مدل ها و ایجاد ارتباط منطقی بین جداول پایگاه داده
✔️ آشنایی با PostgreSQL
✔️ آماده سازی سبد خرید با Django Session –
✔️ ساخت Context Processor اختصاصی
✔️ ثبت سفارش مشتری و ارائه شماره سفارش
✔️ راه اندازی درگاه پرداخت اینترنتی
✔️ کانفیگ پکیج django-allauth
✔️ عضویت با django-allauth و Authentication
✔️ گانفیک email جهت ارسال تاییدیه عضویت به کاربر
✔️ ساخت API در Google Developer Console
✔️ ثبت نام در سایت با Google Account
ان شالله به مرور ویدئوهای دوره قبلی رو توی آپارات - یوتیوب و تلگرام به صورت کامل آپلود میکنم.
و لینک نسخه جدید آموزش ساخت فروشگاه اینترنتی با جنگو با 64 درصد تخفیف:
https://www.daneshjooyar.com/project-django/
❤7👍4🔥4👎2
Forwarded from TorhamDev | تورهام 😳
Transaction per-request in #django
#جنگو قابلیت انجام ترنزکشن با دیتابیس به شما میده در چندید حالت مختلف یکی از حالتها ترنزاکشن بر هر ریکوئستِ، یعنی چی؟ یعنی جنگو برای هر ریکوئستی که شما میگیرید یک ترنزاکشن باز میکنه یا به عباری برای هر ویو فانکشن شما یک atomic() ران میکنه! این قابلیت به شکل پیشفرض غیر فعاله ولی میتونید با اضافه ATOMIC_REQUESTS داخل کانفیگ دیتابیسی که میخوایید این حرکت باهاش بزنید این قابلیت فعال کنید.
این کار هر ریکوئست شمارو داخل یک ترنزاکشن warp میکنه و اگر ویو شما هر اروری بده ( ارور raise کنه ) ترنزاکشن rollback میخوره و تغییرات اعمال نمیشه.
@TorhamDevCH
#جنگو قابلیت انجام ترنزکشن با دیتابیس به شما میده در چندید حالت مختلف یکی از حالتها ترنزاکشن بر هر ریکوئستِ، یعنی چی؟ یعنی جنگو برای هر ریکوئستی که شما میگیرید یک ترنزاکشن باز میکنه یا به عباری برای هر ویو فانکشن شما یک atomic() ران میکنه! این قابلیت به شکل پیشفرض غیر فعاله ولی میتونید با اضافه ATOMIC_REQUESTS داخل کانفیگ دیتابیسی که میخوایید این حرکت باهاش بزنید این قابلیت فعال کنید.
این کار هر ریکوئست شمارو داخل یک ترنزاکشن warp میکنه و اگر ویو شما هر اروری بده ( ارور raise کنه ) ترنزاکشن rollback میخوره و تغییرات اعمال نمیشه.
@TorhamDevCH
Django Project
Settings | Django documentation
The web framework for perfectionists with deadlines.
👍3
📣تبلیغ رایگان
قالب فروشگاهی HTML بلسر , Blesser
با طراحی مدرن و جذاب است که با استفاده از فریمورک UnoCss توسعه داده شده است.
مشاهده پیش نمایش
لینک خرید قالب:
https://www.rtl-theme.com/blesser-html-template/
قالب فروشگاهی HTML بلسر , Blesser
با طراحی مدرن و جذاب است که با استفاده از فریمورک UnoCss توسعه داده شده است.
مشاهده پیش نمایش
لینک خرید قالب:
https://www.rtl-theme.com/blesser-html-template/
🤮4❤2👍1
وبینار بررسی بازار فعالیت برای توسعه دهنده بک اند پایتون
در این وبینار قرار است از تجربیات مهندس فرزین شمس (Farzin Shams) در زمینه توسعه دهنده پایتون و همچنین مراتب مختلف در گرفتن پروژه،ارائه و تجربیات ایشون در این زمینه بپردازیم.
از جمله مواردی که بررسی خواهد شد:
- پیش نیازها و مواردی که به عنوان یک نیرویی که میخواد تازی به این حوزه وارد بشه
- اشتباهات فردی خودم زمان شروع به کار
- به چالش کشیدن خود
- اهمیت انگیزه داشتن جهت یادگیری پی در پی
- آیا دورهها به تنهایی برای بازار کار کافیست؟
- جلوگیری از پراکندگی در یادگیری
- نقشه راه در صورت نیاز
- مباحث مهم جهت یادگیری به عنوان یک بک اند دولوپر
- پرزنت درست برای دریافت پروژه
- آیا ارزون کار کردن درسته در شروع
- پلتفرم های دریافت پروژه
زمان برگزاری :
پنجشنبه ۲۴ خرداد - ساعت 18:00
ظرفیت: 100نفر
هزینه: رایگان
لینک ثبت نام:
https://thealibigdeli.ir/event/
در این وبینار قرار است از تجربیات مهندس فرزین شمس (Farzin Shams) در زمینه توسعه دهنده پایتون و همچنین مراتب مختلف در گرفتن پروژه،ارائه و تجربیات ایشون در این زمینه بپردازیم.
از جمله مواردی که بررسی خواهد شد:
- پیش نیازها و مواردی که به عنوان یک نیرویی که میخواد تازی به این حوزه وارد بشه
- اشتباهات فردی خودم زمان شروع به کار
- به چالش کشیدن خود
- اهمیت انگیزه داشتن جهت یادگیری پی در پی
- آیا دورهها به تنهایی برای بازار کار کافیست؟
- جلوگیری از پراکندگی در یادگیری
- نقشه راه در صورت نیاز
- مباحث مهم جهت یادگیری به عنوان یک بک اند دولوپر
- پرزنت درست برای دریافت پروژه
- آیا ارزون کار کردن درسته در شروع
- پلتفرم های دریافت پروژه
زمان برگزاری :
پنجشنبه ۲۴ خرداد - ساعت 18:00
ظرفیت: 100نفر
هزینه: رایگان
لینک ثبت نام:
https://thealibigdeli.ir/event/
👍8
درخواست همکاری پارت تایم
دات نت/پایتون
سلام به همه
من از سال 2008 شروع به یادگیری سی شارپ کردم
با ویندوز فرم شروع کردم
هیچوقت نتونستم با وب فرم و ام وی سی مایکروسافت ارتباط برقرار کنم
توی گاج و سان و چارگون با دات نت بیشتر آشنا شدم
از سال 2018 به صورت خودآموز شروع به یادگیری پایتون کردم
و بعد از اینکه یکم پایتون یاد گرفتم سراغ جنگو رفتم
یه مقطعی انگولار هم مجبور شدم کد بزنم.
توی یه پروژه هم ری اکت رو زیارت کردم.
دیگه بقیه کارهای ناشایستی که باعث شده اقیانوسی به عمق ده سانتی متر بشم رو نمیگم که حداقل یه درخواست همکاری برام بیاد.
با توضیحات فوق، خوشحال میشم اگه موقعیت شغلی پارت تایمی می شناسید به من معرفی کنید. آیدی من @miladhzz
سال هارو میلادی نوشتم چون اسمم میلاده 😁 😕
دات نت/پایتون
سلام به همه
من از سال 2008 شروع به یادگیری سی شارپ کردم
با ویندوز فرم شروع کردم
هیچوقت نتونستم با وب فرم و ام وی سی مایکروسافت ارتباط برقرار کنم
توی گاج و سان و چارگون با دات نت بیشتر آشنا شدم
از سال 2018 به صورت خودآموز شروع به یادگیری پایتون کردم
و بعد از اینکه یکم پایتون یاد گرفتم سراغ جنگو رفتم
یه مقطعی انگولار هم مجبور شدم کد بزنم.
توی یه پروژه هم ری اکت رو زیارت کردم.
دیگه بقیه کارهای ناشایستی که باعث شده اقیانوسی به عمق ده سانتی متر بشم رو نمیگم که حداقل یه درخواست همکاری برام بیاد.
با توضیحات فوق، خوشحال میشم اگه موقعیت شغلی پارت تایمی می شناسید به من معرفی کنید. آیدی من @miladhzz
سال هارو میلادی نوشتم چون اسمم میلاده 😁 😕
🔥11👍6❤4😁4👎1
جنگولرن
db_ali.pdf
orm_ali.pdf
691.6 KB
✅پیاده سازی انواع Relation ها با استفاده از Django ORM
از لینکدین علی بیگدلی
تو پست قبلی با توضیحات کلی مدل های ارتباطی آشنا شدیم و در این پست می خوایم این ارتباطات رو در قالب کلاس های مدل تشریح کنیم. باید در نظر داشته باشید که سناریو ها برای پیاده سازی در هر پروژه ممکنه متفاوت باشن و منتهی مراتب از لحاظ عملکرد یکی هستن. نکته ای که اهمیت داره دیدگاه و جوانب اون هستش که چطور به یک مسئله نگاه میشه در طراحی، گاهی اوقات مدل های طراحی تقریبا یکی به نظر میان ولی اسم گذاری هاشون فرق دارن و برای همین که منطق متفاوتی رو علاوه بر تشابه میرسونن.
در کل باید سعی کنیم تا بیشتری میزان اطلاعات رو توی بخش طراحی کسب کنیم تا در پروژه های بزرگتر قدرت تصمیم گیری بیشتری پیدا کنیم.
از جمله مواردی که به نظر من می تونه خیلی بهتون درک عمیق بده و شاید خیلی درگیرش نباشید Generic Relation و استفاده از Through هستش که خودم در زمانی که باهاشون آشنا نبودم دنبال راه حل های مشابهی میگشم که در نهایت همین ساختار رو پیاده سازی می کردم ولی اصلا نمی دونستم جنگو خودش داره، پس سعی کنین بیشترین میزان دید رو پیدا کنین تا دچار این مشکل نشید.
از لینکدین علی بیگدلی
تو پست قبلی با توضیحات کلی مدل های ارتباطی آشنا شدیم و در این پست می خوایم این ارتباطات رو در قالب کلاس های مدل تشریح کنیم. باید در نظر داشته باشید که سناریو ها برای پیاده سازی در هر پروژه ممکنه متفاوت باشن و منتهی مراتب از لحاظ عملکرد یکی هستن. نکته ای که اهمیت داره دیدگاه و جوانب اون هستش که چطور به یک مسئله نگاه میشه در طراحی، گاهی اوقات مدل های طراحی تقریبا یکی به نظر میان ولی اسم گذاری هاشون فرق دارن و برای همین که منطق متفاوتی رو علاوه بر تشابه میرسونن.
در کل باید سعی کنیم تا بیشتری میزان اطلاعات رو توی بخش طراحی کسب کنیم تا در پروژه های بزرگتر قدرت تصمیم گیری بیشتری پیدا کنیم.
از جمله مواردی که به نظر من می تونه خیلی بهتون درک عمیق بده و شاید خیلی درگیرش نباشید Generic Relation و استفاده از Through هستش که خودم در زمانی که باهاشون آشنا نبودم دنبال راه حل های مشابهی میگشم که در نهایت همین ساختار رو پیاده سازی می کردم ولی اصلا نمی دونستم جنگو خودش داره، پس سعی کنین بیشترین میزان دید رو پیدا کنین تا دچار این مشکل نشید.
👍5❤1
جنگولرن
✅نسخه قبلی دوره ساخت فروشگاه اینترنتی با جنگو رایگان شد. سرفصل های دوره قبل: ✔️ ساخت پروژه فروشگاه ✔️پیاده سازی قالب ✔️ ساخت مدل ها و ایجاد ارتباط منطقی بین جداول پایگاه داده ✔️ آشنایی با PostgreSQL ✔️ آماده سازی سبد خرید با Django Session – ✔️ ساخت Context…
✅دوره مقدماتی آموزش جنگو رایگان شد.
✔️نصب جنگو
✔️ساخت اولین پروژه django
✔️طراحی مدل ها
✔️آماده سازی پنل ادمین django
✔️آشنایی با Query Set و Shell
✔️ساخت List view و Detail view
✔️ایجاد Template متناسب با View ها
✔️اضافه کردن صفحه بندی (Pagination)
✔️طراحی مدل های ثبت نظرات وبلاگ
✔️ثبت نظر با استفاده از Form ها
✔️افزودن تگ به مطالب با استفاده از پکیج Taggit
✔️ساخت Custom Template Tag ها
ان شالله به مرور ویدئوهاش رو توی آپارات - یوتیوب و تلگرام به صورت کامل آپلود میکنم.
✔️نصب جنگو
✔️ساخت اولین پروژه django
✔️طراحی مدل ها
✔️آماده سازی پنل ادمین django
✔️آشنایی با Query Set و Shell
✔️ساخت List view و Detail view
✔️ایجاد Template متناسب با View ها
✔️اضافه کردن صفحه بندی (Pagination)
✔️طراحی مدل های ثبت نظرات وبلاگ
✔️ثبت نظر با استفاده از Form ها
✔️افزودن تگ به مطالب با استفاده از پکیج Taggit
✔️ساخت Custom Template Tag ها
ان شالله به مرور ویدئوهاش رو توی آپارات - یوتیوب و تلگرام به صورت کامل آپلود میکنم.
👍12❤3
Forwarded from محمد لرنینگ (آموزش برنامه نویسی)
.
لینک ویدیوی جلسه ۱۷:
https://youtu.be/gJWKPcCsRbg
در این ویدیو، به توضیح جامع و کاملی در مورد لاگینگ (Logging) در برنامهنویسی پایتون پرداختهام. موارد زیر را بررسی کردهایم:
1. اهمیت لاگها: توضیح میدهیم که چرا لاگها برای اشکالزدایی، نظارت، حسابرسی و بهینهسازی عملکرد برنامهها اهمیت دارند.
2. مفاهیم پایهای لاگینگ در پایتون: نحوه استفاده از ماژول داخلی logging در پایتون و نحوه ایجاد پیامهای لاگ در سطوح مختلف (DEBUG، INFO، WARNING، ERROR، CRITICAL).
3. لاگهای رنگی: استفاده از کتابخانههایی مثل coloredlogs برای ایجاد لاگهای رنگی که خوانایی و شناسایی سریعتر پیامها را فراهم میکند.
4. ذخیره لاگها در فایل: نحوه پیکربندی لاگینگ برای ذخیره لاگها در فایل به جای نمایش در کنسول، و استفاده از FileHandler.
5. سفارشیسازی لاگها: نحوه سفارشیسازی فرمت لاگها و افزودن هندلرهای مختلف برای ارسال خروجی به مکانهای مختلف.
6. اجرای برنامه با سطوح مختلف لاگ: تنظیم سطح لاگینگ به صورت پویا با استفاده از متغیرهای محیطی یا آرگومانهای خط فرمان.
7. افزونهها و کتابخانههای مختلف برای لاگینگ در پایتون: معرفی کتابخانههایی مانند loguru و structlog برای بهبود و تسهیل فرآیند لاگینگ.
8. معرفی و تمجید از سنتری: توضیح مزایای استفاده از Sentry برای نظارت بر خطاها و استثناها در برنامهها، و چگونه Sentry میتواند به بهبود اشکالزدایی و ارائه گزارشهای دقیق کمک کند.
جزوه ای که روش تدریس میکنم :
https://github.com/SEYEDBAX/course-notes/tree/main/lesson-17
🔔 حتما حتما یوتیوب رو فالو کنید و ویدیو رو لایک کنید و نوتیف رو روشن بزارید 🫶
https://t.me/QaDeveloper
✅ @SEYED_BAX | @MakeDeveloper
لینک ویدیوی جلسه ۱۷:
https://youtu.be/gJWKPcCsRbg
در این ویدیو، به توضیح جامع و کاملی در مورد لاگینگ (Logging) در برنامهنویسی پایتون پرداختهام. موارد زیر را بررسی کردهایم:
1. اهمیت لاگها: توضیح میدهیم که چرا لاگها برای اشکالزدایی، نظارت، حسابرسی و بهینهسازی عملکرد برنامهها اهمیت دارند.
2. مفاهیم پایهای لاگینگ در پایتون: نحوه استفاده از ماژول داخلی logging در پایتون و نحوه ایجاد پیامهای لاگ در سطوح مختلف (DEBUG، INFO، WARNING، ERROR، CRITICAL).
3. لاگهای رنگی: استفاده از کتابخانههایی مثل coloredlogs برای ایجاد لاگهای رنگی که خوانایی و شناسایی سریعتر پیامها را فراهم میکند.
4. ذخیره لاگها در فایل: نحوه پیکربندی لاگینگ برای ذخیره لاگها در فایل به جای نمایش در کنسول، و استفاده از FileHandler.
5. سفارشیسازی لاگها: نحوه سفارشیسازی فرمت لاگها و افزودن هندلرهای مختلف برای ارسال خروجی به مکانهای مختلف.
6. اجرای برنامه با سطوح مختلف لاگ: تنظیم سطح لاگینگ به صورت پویا با استفاده از متغیرهای محیطی یا آرگومانهای خط فرمان.
7. افزونهها و کتابخانههای مختلف برای لاگینگ در پایتون: معرفی کتابخانههایی مانند loguru و structlog برای بهبود و تسهیل فرآیند لاگینگ.
8. معرفی و تمجید از سنتری: توضیح مزایای استفاده از Sentry برای نظارت بر خطاها و استثناها در برنامهها، و چگونه Sentry میتواند به بهبود اشکالزدایی و ارائه گزارشهای دقیق کمک کند.
جزوه ای که روش تدریس میکنم :
https://github.com/SEYEDBAX/course-notes/tree/main/lesson-17
https://t.me/QaDeveloper
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Forwarded from TorhamDev | تورهام 😳
Transaction in #django
اگه نمیدونید به طور کلی ترنزاکشن چیه میتونید به این لینک سر بزنید. ولی خیلی خلاصه بخوام بگم به انجام چندتا کوئری مختلف ولی در یک unit ترنزاکشن میگن، یعنی شما ۳ تا کوئری انجام میدی، اگه حتی یکدونه از اون ۳ تا ارور بخوره بقیه ۲ تا هم هر تغییری داده باشن اون برمیگردونن یا به اصطلاح Rollback میکنه.
حالا #جنگو این قابلیت به شما میده که از این فیچر دیتابیسها داخل کدتون استفاده کنید برای این کار میتونید از transaction.atomic استفاده کنید، این فانکشن هم قابلیت استفاده به عنوان دکوریتور رو داره هم کانتکس منیجر
به عنوان دکوریتور:
یا به عنوان کانتکس منیجر:
تو هر دو کد اگر اتفاقی داخل یکی از فانکشن ها بیوفته یعنی اگر ارور raise بشه کوئریها و تغییراتی که رو دیتابیس اعمال شده همه rollback میشه و برمیگرده، شما میتونید چندتا ترنزاکشن به صورت nested هم انجام بدید برای مثال:
تو اینجا باید یک نکته رو در نظر داشته باشید که جنگو هربار که یک nested میزنید از بیرون به داخل میره و هربار که وارد یک مرحله عمیق تر میشه یک savepoint میسازه از نستد بالایی یعنی اول ترنزاکشن آپدیت انجام میده بعد savepoint میسازه که بفهمه چیکار کرده بعد میره دومی، میتونید ساخت savepoint رو غیر فعال کنید با پاس دادن savepoint=false به فانکشن اتومیک که توصیه جنگو اینه که اینکار نکنید مگر اینکه واقعا مشکل پرفورمنس بخورید.
در پست بعدی درباره Transaction.on_commit صحبت میکنم :)
@TorhamDevCH
اگه نمیدونید به طور کلی ترنزاکشن چیه میتونید به این لینک سر بزنید. ولی خیلی خلاصه بخوام بگم به انجام چندتا کوئری مختلف ولی در یک unit ترنزاکشن میگن، یعنی شما ۳ تا کوئری انجام میدی، اگه حتی یکدونه از اون ۳ تا ارور بخوره بقیه ۲ تا هم هر تغییری داده باشن اون برمیگردونن یا به اصطلاح Rollback میکنه.
حالا #جنگو این قابلیت به شما میده که از این فیچر دیتابیسها داخل کدتون استفاده کنید برای این کار میتونید از transaction.atomic استفاده کنید، این فانکشن هم قابلیت استفاده به عنوان دکوریتور رو داره هم کانتکس منیجر
به عنوان دکوریتور:
@transaction.atomic()
def something():
do_database_update()
do_database_delete()
یا به عنوان کانتکس منیجر:
def something():
with transaction.atomic():
do_database_update()
do_database_delete()
تو هر دو کد اگر اتفاقی داخل یکی از فانکشن ها بیوفته یعنی اگر ارور raise بشه کوئریها و تغییراتی که رو دیتابیس اعمال شده همه rollback میشه و برمیگرده، شما میتونید چندتا ترنزاکشن به صورت nested هم انجام بدید برای مثال:
with transaction.atomic():
do_update():
with transaction.atomic():
do_delete()
تو اینجا باید یک نکته رو در نظر داشته باشید که جنگو هربار که یک nested میزنید از بیرون به داخل میره و هربار که وارد یک مرحله عمیق تر میشه یک savepoint میسازه از نستد بالایی یعنی اول ترنزاکشن آپدیت انجام میده بعد savepoint میسازه که بفهمه چیکار کرده بعد میره دومی، میتونید ساخت savepoint رو غیر فعال کنید با پاس دادن savepoint=false به فانکشن اتومیک که توصیه جنگو اینه که اینکار نکنید مگر اینکه واقعا مشکل پرفورمنس بخورید.
در پست بعدی درباره Transaction.on_commit صحبت میکنم :)
@TorhamDevCH
👍3
Forwarded from TorhamDev | تورهام 😳
مشکل concurrency چیه و چطوری میتونیم داخل #جنگو حلش کنیم؟
بیایید اول بفهمیم مشکل چی هست اصلا که میخواییم حلش کنیم. از زمانی که انسانها موفق شدم چند پروسس رو همزمان اجرا کنن این مشکل به وجود اومد برای مثال این روزها دیگه شما فقط یک ترد پروژه جنگوتون اجرا نمیکنید بلکه با ابزارهای مثل گونیکورن و یونیکورن و ... چندتا ترد و پروسس ازش اجرا میکنید تا همچی سریعتر اتفاق بیوفته. اما این مشکل که اتفاق میوفته چیه؟
فرض کنید شما یک سیستم بانکی دارید و داخل این بانک یک حساب مشترک دارید بین user1 و user2. هردو این یوزرها به این حساب دسترسی دارن یوزر اول پرداخت کننده است و یوزر دوم برداشت کننده حالا فکر کنید بالانس(موجودی) حساب ۱۰۰۰ دلاره.
در همین لحظه که ما هستیم user1 میخواد ۱۰۰ دلار به حساب واریز کنه و دقیقا همزمان باهاش user2 میخواد ۱۰۰ دلار برداشت کنه. سوال اینه که در آخر این برداشت و واریز موجود یا همون بالانس حساب چقدر خواهد بود؟ جواب منطقی ما اینه که بالانس همون هزار دلار خواهد بود چون ۱۰۰ دلار اومد و ۱۰۰ دلار هم رفت و آره! اگه برنامه ما فقط و فقط یک پروسس باشه این ۲ درخواست به ترتیب اجرا خواهد شد و بالانس همون هزار دلار میشه اما اگه برنامه بیشتر از یک پروسس باشه چه اتفاقی میوفته؟
خوب بیایید فرض کنیم این بار درخواست اول به پروسس شماره ۱ و درخواست دوم به پروسس شماره ۲ میره و این دو همزمان از دیتابیس بالانس حساب میخونن تا درنهایت بهش جمع و منها بزنن دیگه. مراحل این خواهد شد.
۱. یوزر اول درخواست میزنه و موجودی ۱۰۰۰ دلار رو دریافت میکنه
۲. یورر اول موجودی آپدیت میکنه به ۱۱۰۰ دلار .
۳. یوزر دوم دقیقا تو همون لحظه درخواست میزنه و قبل اپدیت شدن موجودی اون میگیره و نتیجه موجودی برای ۱۰۰۰ دلاره
۴. ازش ۱۰۰ تا کم میکنه و ۹۰۰ رو به عنوان بالانس ذخیره میکنه.
و درنهایت موجودی شد ۹۰۰ دلار! این ماجرا میتونست برعکس هم اتفاق بیوفته و موجودی بشه ۱۱۰۰ دلار که همش نتیجه یک چند صدم ثانیه اختلاف بین ریکوئست یک و دو بود. نکته اصلی این بود که اینا قبل اینکه اون یکی موجودی آپدیت موجودی رو میخوندن و داخل مموری ذخیره میکردند در نتیجه تو اپدیت هم اشتباه اپدیت میکردند.
حالا که فهمیدید ماجرا از چه قرار شما میتونید داخل #django با استفاده از select_for_update و ترنزاکشن که پستها قبل توضیح دادم این ماجرا حل کنید. ( در حقیقت جنگو ماجرا رو حل نمیکنه بلکه با استفاده از متدها شما به جنگو میگید کوئری بسازه که نتیجه اش این بشه که دیتابیس براتون یک لاک رو row که میخوایید آپدیت کنید بگیره)
حالا روش استفاده و توضیحات بیشتر میتونید تو مقاله پایین بخونید. این پست خلاصهای کوتاه از مقاله زیر بود ( خود مقاله هم کوتاه)
https://www.sankalpjonna.com/learn-django/managing-concurrency-in-django-using-select-for-update
@TorhamDevCH
بیایید اول بفهمیم مشکل چی هست اصلا که میخواییم حلش کنیم. از زمانی که انسانها موفق شدم چند پروسس رو همزمان اجرا کنن این مشکل به وجود اومد برای مثال این روزها دیگه شما فقط یک ترد پروژه جنگوتون اجرا نمیکنید بلکه با ابزارهای مثل گونیکورن و یونیکورن و ... چندتا ترد و پروسس ازش اجرا میکنید تا همچی سریعتر اتفاق بیوفته. اما این مشکل که اتفاق میوفته چیه؟
فرض کنید شما یک سیستم بانکی دارید و داخل این بانک یک حساب مشترک دارید بین user1 و user2. هردو این یوزرها به این حساب دسترسی دارن یوزر اول پرداخت کننده است و یوزر دوم برداشت کننده حالا فکر کنید بالانس(موجودی) حساب ۱۰۰۰ دلاره.
در همین لحظه که ما هستیم user1 میخواد ۱۰۰ دلار به حساب واریز کنه و دقیقا همزمان باهاش user2 میخواد ۱۰۰ دلار برداشت کنه. سوال اینه که در آخر این برداشت و واریز موجود یا همون بالانس حساب چقدر خواهد بود؟ جواب منطقی ما اینه که بالانس همون هزار دلار خواهد بود چون ۱۰۰ دلار اومد و ۱۰۰ دلار هم رفت و آره! اگه برنامه ما فقط و فقط یک پروسس باشه این ۲ درخواست به ترتیب اجرا خواهد شد و بالانس همون هزار دلار میشه اما اگه برنامه بیشتر از یک پروسس باشه چه اتفاقی میوفته؟
خوب بیایید فرض کنیم این بار درخواست اول به پروسس شماره ۱ و درخواست دوم به پروسس شماره ۲ میره و این دو همزمان از دیتابیس بالانس حساب میخونن تا درنهایت بهش جمع و منها بزنن دیگه. مراحل این خواهد شد.
۱. یوزر اول درخواست میزنه و موجودی ۱۰۰۰ دلار رو دریافت میکنه
۲. یورر اول موجودی آپدیت میکنه به ۱۱۰۰ دلار .
۳. یوزر دوم دقیقا تو همون لحظه درخواست میزنه و قبل اپدیت شدن موجودی اون میگیره و نتیجه موجودی برای ۱۰۰۰ دلاره
۴. ازش ۱۰۰ تا کم میکنه و ۹۰۰ رو به عنوان بالانس ذخیره میکنه.
و درنهایت موجودی شد ۹۰۰ دلار! این ماجرا میتونست برعکس هم اتفاق بیوفته و موجودی بشه ۱۱۰۰ دلار که همش نتیجه یک چند صدم ثانیه اختلاف بین ریکوئست یک و دو بود. نکته اصلی این بود که اینا قبل اینکه اون یکی موجودی آپدیت موجودی رو میخوندن و داخل مموری ذخیره میکردند در نتیجه تو اپدیت هم اشتباه اپدیت میکردند.
حالا که فهمیدید ماجرا از چه قرار شما میتونید داخل #django با استفاده از select_for_update و ترنزاکشن که پستها قبل توضیح دادم این ماجرا حل کنید. ( در حقیقت جنگو ماجرا رو حل نمیکنه بلکه با استفاده از متدها شما به جنگو میگید کوئری بسازه که نتیجه اش این بشه که دیتابیس براتون یک لاک رو row که میخوایید آپدیت کنید بگیره)
حالا روش استفاده و توضیحات بیشتر میتونید تو مقاله پایین بخونید. این پست خلاصهای کوتاه از مقاله زیر بود ( خود مقاله هم کوتاه)
https://www.sankalpjonna.com/learn-django/managing-concurrency-in-django-using-select-for-update
@TorhamDevCH
Sankalpjonna
Managing concurrency in Django using select_for_update
A tutorial on how one can use select_for_update to lock a Django queryset until the transaction it is in is committed in order to handle concurrency.
👍7❤1
جنگولرن
✅دوره مقدماتی آموزش جنگو رایگان شد. ✔️نصب جنگو ✔️ساخت اولین پروژه django ✔️طراحی مدل ها ✔️آماده سازی پنل ادمین django ✔️آشنایی با Query Set و Shell ✔️ساخت List view و Detail view ✔️ایجاد Template متناسب با View ها ✔️اضافه کردن صفحه بندی (Pagination) ✔️طراحی…
✅به صورت کامل آپلود شد
دوره رایگان مقدماتی آموزش جنگو
✔️نصب جنگو
✔️ساخت اولین پروژه django
✔️طراحی مدل ها
✔️آماده سازی پنل ادمین django
✔️آشنایی با Query Set و Shell
✔️ساخت List view و Detail view
✔️ایجاد Template متناسب با View ها
✔️اضافه کردن صفحه بندی (Pagination)
✔️طراحی مدل های ثبت نظرات وبلاگ
✔️ثبت نظر با استفاده از Form ها
✔️افزودن تگ به مطالب با استفاده از پکیج Taggit
✔️ساخت Custom Template Tag ها
لینک لیست پخش آپارات:
https://www.aparat.com/playlist/10321397
دوره رایگان مقدماتی آموزش جنگو
✔️نصب جنگو
✔️ساخت اولین پروژه django
✔️طراحی مدل ها
✔️آماده سازی پنل ادمین django
✔️آشنایی با Query Set و Shell
✔️ساخت List view و Detail view
✔️ایجاد Template متناسب با View ها
✔️اضافه کردن صفحه بندی (Pagination)
✔️طراحی مدل های ثبت نظرات وبلاگ
✔️ثبت نظر با استفاده از Form ها
✔️افزودن تگ به مطالب با استفاده از پکیج Taggit
✔️ساخت Custom Template Tag ها
لینک لیست پخش آپارات:
https://www.aparat.com/playlist/10321397
❤3👍3
📣تبلیغ رایگان
Python tips and tricks
The Good, Bad and the Ugly
📚توی این کانال فقط قرار هست در مورد core python صحبت کنیم.
👨💻این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی این چند سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازهکار)👨💻
@Mtio975
https://t.me/pythonwithmedev
Python tips and tricks
The Good, Bad and the Ugly
📚توی این کانال فقط قرار هست در مورد core python صحبت کنیم.
👨💻این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی این چند سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازهکار)👨💻
@Mtio975
https://t.me/pythonwithmedev
👍2
وبینار بررسی پلتفرم های فریلنسر داخلی و نحوه گرفتن کار در این پلتفرم ها
در این وبینار قرار است از تجربیات مهندس محمد شکاری بادی در زمینه نحوه فعالیت به عنوان فریلنسر و استفاده از پلتفرم هایی همچون پونیشا و ... استفاده کنیم.
از جمله مواردی که بررسی خواهد شد:
- پیش نیاز ها و نیاز مندی های ورود به این بازار
- میزان تجربه چقدر تاثیر گذار خواهد بود
- از کجا شروع کنیم و چطور
- رزومه نویسی در این پلتفرم ها
- نکاتی در بهتر دیده شدن
- نحوه تعامل با کارفرما
- قیمت گذاری
و...
زمان برگزاری :
پنجشنبه ۳۱ خرداد - ساعت 18:00
ظرفیت: 100نفر
هزینه: رایگان 😁
لینک ثبت نام:
https://thealibigdeli.ir/event/
در این وبینار قرار است از تجربیات مهندس محمد شکاری بادی در زمینه نحوه فعالیت به عنوان فریلنسر و استفاده از پلتفرم هایی همچون پونیشا و ... استفاده کنیم.
از جمله مواردی که بررسی خواهد شد:
- پیش نیاز ها و نیاز مندی های ورود به این بازار
- میزان تجربه چقدر تاثیر گذار خواهد بود
- از کجا شروع کنیم و چطور
- رزومه نویسی در این پلتفرم ها
- نکاتی در بهتر دیده شدن
- نحوه تعامل با کارفرما
- قیمت گذاری
و...
زمان برگزاری :
پنجشنبه ۳۱ خرداد - ساعت 18:00
ظرفیت: 100نفر
هزینه: رایگان 😁
لینک ثبت نام:
https://thealibigdeli.ir/event/
👍3
Forwarded from TorhamDev | تورهام 😳
تا حالا براتون سوال شده جنگو چطوری وقتی یک رابطه one2many یا همون فارنکی میزنید چطوری وقتی فیلد صدا میکنید ابجکت فارنکی بهتون میده؟ یا چطوری کوئری look up هایی که میزنید برای مثال داخل filter رو هندل میکنه؟
مثلا رابطه بین مدل a و b دارید بعد همچنین چیزی مینویسید
a.fk.name
و جنگو مقدار name رو میده یا وقتی فیلتر میزنید
a.objects.filter(fk__name="test")
جنگو اینها رو با استفاده از descriptor در پایتون انجام میده که قابلیتهای خفنی به کلاستون میده، برای مثال وقتی یک attribute از یک کلاس صدا بزنید درجا یک کد ران کنید و خیلی چیزا دیگه که الان طولانی میشه توضیح بدم، در نتیجه پاشید برید داکیومنتشو بخونید :)
https://docs.python.org/3/howto/descriptor.html
@TorhamDevCH
مثلا رابطه بین مدل a و b دارید بعد همچنین چیزی مینویسید
a.fk.name
و جنگو مقدار name رو میده یا وقتی فیلتر میزنید
a.objects.filter(fk__name="test")
جنگو اینها رو با استفاده از descriptor در پایتون انجام میده که قابلیتهای خفنی به کلاستون میده، برای مثال وقتی یک attribute از یک کلاس صدا بزنید درجا یک کد ران کنید و خیلی چیزا دیگه که الان طولانی میشه توضیح بدم، در نتیجه پاشید برید داکیومنتشو بخونید :)
https://docs.python.org/3/howto/descriptor.html
@TorhamDevCH
Python documentation
Descriptor Guide
Author, Raymond Hettinger,, Contact,<python at rcn dot com>,. Contents: Descriptor Guide- Primer- Simple example: A descriptor that returns a constant, Dynamic lookups, Managed attributes, Customiz...
👍6🥱2
جنگولرن
✅نسخه قبلی دوره ساخت فروشگاه اینترنتی با جنگو رایگان شد. سرفصل های دوره قبل: ✔️ ساخت پروژه فروشگاه ✔️پیاده سازی قالب ✔️ ساخت مدل ها و ایجاد ارتباط منطقی بین جداول پایگاه داده ✔️ آشنایی با PostgreSQL ✔️ آماده سازی سبد خرید با Django Session – ✔️ ساخت Context…
✅به صورت کامل آپلود شد
دوره رایگان ساخت فروشگاه اینترنتی با جنگو
✔️ ساخت پروژه فروشگاه
✔️پیاده سازی قالب
✔️ ساخت مدل ها و ایجاد ارتباط منطقی بین جداول پایگاه داده
✔️ آشنایی با PostgreSQL
✔️ آماده سازی سبد خرید با Django Session –
✔️ ساخت Context Processor اختصاصی
✔️ ثبت سفارش مشتری و ارائه شماره سفارش
✔️ راه اندازی درگاه پرداخت اینترنتی
✔️ کانفیگ پکیج django-allauth
✔️ عضویت با django-allauth و Authentication
✔️ گانفیک email جهت ارسال تاییدیه عضویت به کاربر
✔️ ساخت API در Google Developer Console
✔️ ثبت نام در سایت با Google Account
لینک لیست پخش آپارات:
https://www.aparat.com/playlist/10357582
دوره رایگان ساخت فروشگاه اینترنتی با جنگو
✔️ ساخت پروژه فروشگاه
✔️پیاده سازی قالب
✔️ ساخت مدل ها و ایجاد ارتباط منطقی بین جداول پایگاه داده
✔️ آشنایی با PostgreSQL
✔️ آماده سازی سبد خرید با Django Session –
✔️ ساخت Context Processor اختصاصی
✔️ ثبت سفارش مشتری و ارائه شماره سفارش
✔️ راه اندازی درگاه پرداخت اینترنتی
✔️ کانفیگ پکیج django-allauth
✔️ عضویت با django-allauth و Authentication
✔️ گانفیک email جهت ارسال تاییدیه عضویت به کاربر
✔️ ساخت API در Google Developer Console
✔️ ثبت نام در سایت با Google Account
لینک لیست پخش آپارات:
https://www.aparat.com/playlist/10357582
👏9
Forwarded from محمد لرنینگ (آموزش برنامه نویسی)
.
لینک ویدیوی جلسه 18:
https://youtu.be/OuyMAOgwZbc
تو این ویدیو، به سه روش مختلف یک ماشین حساب پایتونی ساختیم و سعی کردیم در هر مرحله پیشرفته ترش کنیم.
جزوه ای که روش تدریس میکنم :
https://github.com/SEYEDBAX/course-notes/tree/main/lesson-18
🔔 حتما حتما یوتیوب رو فالو کنید و ویدیو رو لایک کنید و نوتیف رو روشن بزارید 🫶
https://t.me/QaDeveloper
تمرین : طبق مواردی که در انتهای ویدیو گفته شد به کمک شی گرایی ۴ امین ماشین حساب رو هم شما بسازید
✅ @SEYED_BAX | @MakeDeveloper
لینک ویدیوی جلسه 18:
https://youtu.be/OuyMAOgwZbc
تو این ویدیو، به سه روش مختلف یک ماشین حساب پایتونی ساختیم و سعی کردیم در هر مرحله پیشرفته ترش کنیم.
جزوه ای که روش تدریس میکنم :
https://github.com/SEYEDBAX/course-notes/tree/main/lesson-18
https://t.me/QaDeveloper
تمرین : طبق مواردی که در انتهای ویدیو گفته شد به کمک شی گرایی ۴ امین ماشین حساب رو هم شما بسازید
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
course-notes/lesson-18 at main · SEYEDBAX/course-notes
Contribute to SEYEDBAX/course-notes development by creating an account on GitHub.
👍1👎1
Media is too big
VIEW IN TELEGRAM
✅دو تا تابع مهم در جنگو به نام های:
prefetch_related & select_related
از لینکدین Ebrahim Kiani
سلام خدمت دوستان عزیز لینکدین👋🏻
امیدوارم حالتون خوب باشه🙂
تو این کلیپ کوتاه آموزشی سعی کردم دو تا تابع مهم در جنگو به نام های:
prefetch_related & select_related
که در پرفورمنس برنامه هامون هم نقش بسزایی دارند رو آموزش بدم.
البته این مباحث را خودم از داخل یکی از مصاحبه هام یاد گرفتم و برای همین کلیپ آن را درست کردم.
پیشاپیش ممنونم از حمایت هاتون🤗
prefetch_related & select_related
از لینکدین Ebrahim Kiani
سلام خدمت دوستان عزیز لینکدین👋🏻
امیدوارم حالتون خوب باشه🙂
تو این کلیپ کوتاه آموزشی سعی کردم دو تا تابع مهم در جنگو به نام های:
prefetch_related & select_related
که در پرفورمنس برنامه هامون هم نقش بسزایی دارند رو آموزش بدم.
البته این مباحث را خودم از داخل یکی از مصاحبه هام یاد گرفتم و برای همین کلیپ آن را درست کردم.
پیشاپیش ممنونم از حمایت هاتون🤗
🔥7
Forwarded from Microfrontend.ir
از هفته بعد تمرکز کانال بر روی داکر و پستگرس خواهد بود و پلی لیستهای جاوا اسکریپت رو هم با سرعت کمتری ادامه میدم. روی یک پلی لیست آموزش Go هم دارم کار میکنم که چون میخوام مثل پلی لیستهای ناقص دیگه نشه تا کامل ضبط نکنم منتشر نمیکنم. برای حمایت از کانال به دوستان خود بگویید :)
https://youtube.com/microfrontend
〰️〰️〰️〰️〰️〰️
© | @microfrontend_ir
https://youtube.com/microfrontend
〰️〰️〰️〰️〰️〰️
© | @microfrontend_ir
❤3👍3🔥1