Syntax | سینتکس – Telegram
نحوه احراز هویت با OAuth

OAuth
یک پروتکل احراز هویت و مجوز است که به کاربران اجازه می‌دهد بدون نیاز به اشتراک‌گذاری اطلاعات ورود خود، به وب‌سایت‌ها و اپلیکیشن‌های مختلف دسترسی پیدا کنند. این پروتکل معمولاً در سه مرحله اصلی کار می‌کند:

1. درخواست مجوز: کاربر به اپلیکیشن شما اجازه می‌دهد به حساب کاربری‌اش در سرویس‌دهنده (مثل گوگل) دسترسی پیدا کند.
2. دریافت توکن دسترسی: پس از تأیید مجوز کاربر، اپلیکیشن شما یک توکن دسترسی (Access Token) دریافت می‌کند.
3. دسترسی به منابع: با استفاده از توکن دسترسی، اپلیکیشن شما می‌تواند به منابع کاربر دسترسی پیدا کند.

مراحل لاگین با اکانت گوگل


1. ثبت‌نام اپلیکیشن در کنسول گوگل

ابتدا باید اپلیکیشن خود را در https://console.cloud.google.com/. در اینجا ثبت کنید:

- یک پروژه جدید ایجاد کنید.
- OAuth 2.0 client ID ایجاد کنید.
- URL کال بک (Redirect URI) را مشخص کنید.

پس از این مراحل، یک Client ID و Client Secret دریافت خواهید کرد.

2. درخواست مجوز

هنگامی که کاربر روی دکمه "ورود با گوگل" کلیک می‌کند، شما باید او را به URL زیر هدایت کنید:

https://accounts.google.com/o/oauth2/v2/auth?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code&scope=email%20profile


در اینجا:

- YOUR_CLIENT_ID: شناسه کلاینت شما
- YOUR_REDIRECT_URI: URL کال بک شما
- scope: اطلاعاتی که می‌خواهید از کاربر بگیرید (مثل ایمیل و پروفایل)

3. دریافت کد تأیید

پس از اینکه کاربر مجوز را تأیید کرد، گوگل کاربر را به URL کال بک شما باز می‌گرداند و یک پارامتر code به همراه خواهد داشت.

4. تبادل کد برای توکن دسترسی

شما باید یک درخواست POST به URL زیر ارسال کنید تا کد را برای توکن دسترسی مبادله کنید:

POST https://oauth2.googleapis.com/token


بدنه درخواست باید شامل موارد زیر باشد:

{
"code": "CODE_RECEIVED_FROM_GOOGLE",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"redirect_uri": "YOUR_REDIRECT_URI",
"grant_type": "authorization_code"
}


5. دریافت توکن دسترسی


اگر درخواست موفق باشد، شما یک پاسخ JSON دریافت می‌کنید که شامل access_token و اطلاعات دیگر است.

6. احراز هویت و دسترسی به اطلاعات کاربر

با استفاده از `access_token`، می‌توانید اطلاعات کاربر را از API گوگل دریافت کنید. برای مثال:

GET https://www.googleapis.com/oauth2/v2/userinfo
Authorization: Bearer ACCESS_TOKEN


7. وریفای توکن

برای اطمینان از صحت توکن، می‌توانید توکن را به یکی از انتهای API گوگل ارسال کنید تا اطلاعات مربوط به توکن و اعتبار آن را دریافت کنید.

#oauth

@Syntax_fa
👍13🔥3💋3
برنامه‌نویس‌های ادایی: قهرمانان سلفی‌گیر! 🤓

برنامه‌نویس‌های ادایی، آن دسته از افراد در دنیای فناوری هستند که بیشتر از اینکه به کدنویسی بپردازند، به گرفتن سلفی‌های خفن با لپ‌تاپ و قهوه‌شان مشغول‌اند. بیایید نگاهی به دنیای رنگارنگ آن‌ها بندازیم!

سلفی‌های جذاب با لپ‌تاپ

اولین نشانه‌ی برنامه‌نویس ادایی، سلفی‌های بی‌نظیرش است. این افراد به‌طور مداوم در حال گرفتن عکس از خود در کنار لپ‌تاپ و کتاب‌های مهندسی نرم‌افزار هستند. شاید فکر کنید که آن‌ها در حال کدنویسی هستند، اما واقعیت این است که در حال تنظیم نور و زاویه دوربین برای گرفتن عکس بعدی‌شان هستند!

"نگاه کن من دارم کد میزنم"
در واقع، آن‌ها فقط در حال چک کردن فید اینستاگرامشان هستند!

بحث درباره clean architecture همه جا!
همیشه همراه خود کتاب های برنامه نویسی خفن را حمل میکنند حتی در کافه و مهمانی ها!
تا بحث درباره برنامه نویسی شود، کتاب های که درباره clean architecture و ddd و ... خوانده اند صحبت میکنند اما هنوز نمی‌توانند یک پروژه todo را با ساختار مناسب پیاده سازی کنند!

میز کار به سبک هنری 😀

میز کار این برنامه‌نویس‌ها مثل یک گالری هنری است؛ قهوه‌ساز، کتاب‌های مهندسی نرم‌افزار، و چندین ماگ با نوشته‌های خنده‌دار. آن‌ها با افتخار به شما نشان می‌دهند که "این کتاب رو تازه خریدم!" در حالی که هیچ‌وقت حتی یک صفحه از آن را نخوانده‌اند. گویی که داشتن کتاب‌های مهندسی نرم‌افزار به‌عنوان یک اکسسوری مهم است!

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

این افراد معمولاً تی‌شرت‌های با طرح‌های مرتبط با برنامه‌نویسی می‌پوشند، مثل "Code is my cardio" یا "I'm silently correcting your code". گویی لباسشان بهترین بیانیه‌ی حرفه‌ای آن‌هاست!

رویدادهای کافه‌ای ☕️

برنامه‌نویس‌های ادایی معمولاً در کافه‌ها جمع می‌شوند تا نمیدونم واقعا چیکار کنن ☹️

بحث‌های پرشور درباره buzzword ها

وقتی دو برنامه‌نویس ادایی با هم ملاقات می‌کنند، یک بحث پرشور درباره جدیدترین فریم‌ورک‌ها یا زبان‌های برنامه‌نویسی شروع می‌شود. در واقع، این بحث‌ها بیشتر شبیه به مسابقه‌ی خودستایی است تا تبادل دانش واقعی!
اوه از همه بدتر وقتی با یه برنامه نویس ادایی صحبت میکنید کلمات و اصطلاحاتی رو بکار میبره که خداهم تاحالا نشنیده!
بازورد چیه؟ #buzzword

مبادا مثل آدم کد بزنی!

کد های یک برنامه نویس ادایی رو فقط یک برنامه نویس ادایی دیگه میفهمه!
تا جای ممکن سعی میکنن کدی بنویسن که پیچیده و غیرقابل فهم باشه.
چیزی که فکر میکنن:
پشمام چه کدی زدی😱
ولی واقعیت موضوع:
این چه کدشریه دیگه😒

#fun

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣25👍5😁1💋1
یک مقاله درباره تفاوت بین stateless و stateful بودن

https://medium.com/@saeidlaalkaei/stateful-and-stateless-sets-across-different-technologies-5ad1d06caf98

اهمیت Stateless در برنامه‌های Cloud Native


یکی از استانداردهای اصلی در طراحی برنامه‌های کلاد نیتیو Stateless بودن آن‌ها است. دلایل این موضوع به شرح زیر است:

1. مقیاس‌پذیری آسان:
برنامه‌های Stateless به راحتی می‌توانند در محیط‌های ابری مقیاس‌پذیر شوند. به دلیل عدم وابستگی به وضعیت، می‌توان به سادگی تعداد نمونه‌های برنامه را افزایش یا کاهش داد.
مثلا فرض کنید ما اومدیم یدونه لیمیت بر اساس ip address کاربر درست کردیم که توی یک مپ داخل برناممون ذخیرش کردیم. خب در این شرایط وقتی instance برناممون رو بیشتر کنیم چه اتفاقی برای لیمیتی که نوشتیم میوفته؟ stateless بودن این دغدغه هارو حذف میکنه.

2. مدیریت بهتر منابع: در برنامه‌های Stateless، منابع به راحتی می‌توانند بین نمونه‌های مختلف توزیع شوند، زیرا هر نمونه هیچ‌گونه وابستگی به دیگر نمونه‌ها ندارد.

3. قابلیت تحمل خطا: اگر یک نمونه از برنامه به هر دلیلی دچار مشکل شود، می‌توان به سرعت آن را جایگزین کرد بدون اینکه تأثیری بر روی وضعیت کاربران دیگر داشته باشد.

4. استقرار سریع‌تر: در محیط‌های ابری، زمان استقرار بسیار مهم است. برنامه‌های Stateless به دلیل سادگی و عدم نیاز به ذخیره وضعیت، سریع‌تر می‌توانند مستقر شوند.

#stateless #stateful

@Syntax_fa
👍6🥰2🔥1👌1
Syntax | سینتکس
ساخت یک Dockerfile مناسب برای پروژه های پایتونی: خیلی خوب توضیح داده. https://luis-sena.medium.com/creating-the-perfect-python-dockerfile-51bdec41f1c8 #python #Dockerfile @Syntax_fa
و اما Docekrfile که من از توضیحات ایشون رسیدم بهش:
FROM python:3.11-slim as builder

# avoid stuck build due to user prompt
ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
apt-get install -y --no-install-recommends ...

# create and activate virtual environment
RUN python -m venv /home/myuser/venv
ENV PATH="/home/myuser/venv/bin:$PATH"

# install requirements
COPY ./requirements .
RUN pip3 install --upgrade --no-cache-dir pip
RUN pip3 install --no-cache-dir wheel
RUN pip3 install --no-cache-dir -r production.txt

FROM python:3.11-slim

RUN useradd --create-home myuser
COPY --from=builder /home/myuser/venv /home/myuser/venv

USER myuser
RUN mkdir /home/myuser/code
WORKDIR /home/myuser/code
COPY . /home/myuser/code

EXPOSE $DJANGO_PORT

# make sure all messages always reach console
ENV PYTHONUNBUFFERED=1

# activate virtual environment
ENV VIRTUAL_ENV=/home/myuser/venv
ENV PATH="/home/myuser/venv/bin:$PATH"

# /dev/shm is mapped to shared memory and should be used for gunicorn heartbeat
# this will improve performance and avoid random freezes
# CMD ["gunicorn","-b", "0.0.0.0:8000", "-w", "4", "-k", "gevent", "--worker-tmp-dir", "/dev/shm", "--chdir", "config config.wsgi:application"]


نظر بدید

#python #dockerfile

@Syntax_fa
🔥6👍1🤣1🤨1
ما تو فکر چی هستیم، بقیه تو فکر چی هستن 🙂
تا حالا به این فکر کردی که response time سیستم ت در حد میکروثانیه باشه؟ مثلا به میلی ثانیه و اینا نرسه اصلا؟

احتمالا تو نسل بعدی دیتاسنترها بیشتر میشنویم ازشون
https://x.com/petereliaskraft/status/1830294745563951329?t=LxJ9z3qlt7uREui7hUCAyg&s=35

Shenango: Achieving High CPU Efficiency for Latency-sensitive Datacenter Workloads
https://www.usenix.org/conference/nsdi19/presentation/ousterhout

Source

@Syntax_fa
👍8😱3👀2
Syntax | سینتکس
ما تو فکر چی هستیم، بقیه تو فکر چی هستن 🙂 تا حالا به این فکر کردی که response time سیستم ت در حد میکروثانیه باشه؟ مثلا به میلی ثانیه و اینا نرسه اصلا؟ احتمالا تو نسل بعدی دیتاسنترها بیشتر میشنویم ازشون https://x.com/petereliaskraft/status/183029474556395…
سرور های قدرتمند ایران:
۱. با latency زیر ده ثانیه
۲. پهنای باند باور نکردنیه پنجاه مگابایت
۴. دسترسی به اینترنت داخلی
۵. اینترنت نامحدود با طرح مصرف منصفانه
۶. قیمت ها کاملا اقتصادی
و کلی ویژگی دیگر
🤣21🔥1😁1
This media is not supported in your browser
VIEW IN TELEGRAM
یاد این افتادم😂
معرفیه اولین گوشی هوشمند ایرانی
🤣16😁1
آشنایی با GitHub Codespaces

تو دنیای مدرن توسعه نرم افزار امروزی، سهولت و سرعت تو راه‌اندازی محیط‌های توسعه اهمیت زیادی داره. GitHub Codespaces یکی از ابزارهای نوآورانه‌ای هستش که به برنامه‌نویسا اجازه میده تا بتونن همه جا به راحتی به پروژه هاشون دسترسی داشته باشن، اجراشون کنن و به راحتی تو یه محیط ابری کدهاشون رو تغییر بدن.
همچنین codespaces بطور کامل روی GitHub ادغام شده که همین یکی از مزیت های بزرگشه.

چند تا از ویژگی ها
ش:
۱. از ویرایشگرهای مختلف از جمله Visual Studio Code و فکر کنم Jetbarins پشتیبانی میکنه.
۲. مثل یک محیط توسعه که روی سیستم خودتون نصبه، میتونید سفارش سازی کنید
۳.  به تیم‌ها این امکانو میده که به راحتی با همدیگه همکاری کنن.
۴.از اونجا که codespaces یک محیط ابری در اختیار شما قرار میده، میتونید از هر نقطه بهش دسترسی داشته باشید.
فرض کنید به سیستمون دسترسی ندارید و حالا نیازه یه سری باگ هارو رفع کنید. کافیه وارد محیط codespaces بشید، تغییرات رو بدید بعد کدتون رو تو codespaces ران و تست کنید.

این قابلیت هاشو من خیلی دوست داشتم:

۱. بهتون پلن رایگان میده که برای استفاده شخصی فکر میکنم کافیه
2 بهتون چیزی شبیه به یه سرور مجازی میده که منابع کمی هم نداره تو پلن رایگانش میتونید تا 4 هسته و 16 گیگ رم استفاده کنید.
3. از داکر و یا چیز های مختلف دیگه ای که نیاز دارید هم میتونید استفاده کنید.
4. میتونید پروژتون رو روی یه پورتی اجرا کنید و دسترسی پرایوت یا پابلیک بدید تا از طریق اینترنت بهش دسترسی داشته باشید. برای ران کردن نمونه کارا خوبه.
و ...

هنوز زیاد ازش استفاده نکردم. نحوه اجرا کردنش خیلی سادس ولی اگه خواستید توضیح میدم

#github #codespaces

@Syntax_fa
👍8💋4🔥21
Syntax | سینتکس
آشنایی با GitHub Codespaces تو دنیای مدرن توسعه نرم افزار امروزی، سهولت و سرعت تو راه‌اندازی محیط‌های توسعه اهمیت زیادی داره. GitHub Codespaces یکی از ابزارهای نوآورانه‌ای هستش که به برنامه‌نویسا اجازه میده تا بتونن همه جا به راحتی به پروژه هاشون دسترسی داشته…
نحوه راه اندازی یه GitHub codespaces:

خب خیلی سادس:
۱. رو codespaces کلیک میکنید
۲. بعد روی new codespaces
۳. تو این بخش مشخص میکنید میخواید برای کدوم ریپوزیتوری codespace رو بسازید و ریجن سرورش چی باشه و منابع چقدر داشته باشه. یه نکته رو دقت کنید. بصورت ماهانه تو پلن رایگان فقط پونزده گیگ میتونید فایل و ... رو تو codespace هاتون استفاده کنید. همچنین 120 ساعت در ماه از cpu تو پلن رایگان میتونید استفاده کنید که این رو درست متوجه نشدم. فکر کنم منظورش اکتیو بودن codespace هستش.
۴. بعد اینکه روی create codespace کلیک کردید یکم طول میکشه ساخته شه. بهتره از شکنی چیزی استفاده کنید در غیر اینصورت ممکنه درست اجرا نشه.
۵. بعد اینکه وارد محیط codespace شدید میتونید به راحتی با داکر سرویس هاتونو بالا بیارید و پروژتون رو پشت یه پورتی اجرا کنید. Codespace به شما اجازه میده که یه tpc connection رو باز کنید و بهش از طریق اینترنت دسترسی داشته باشید.
همچنین اگه پروژه پرایوت هستش میتونید بصورت پرایوت دسترسی بدید تا هرکی به پروژه دسترسی دارن بتونن ببینن یا اینکه بصورت public اجازه بدید تا همه بتونن دسترسی داشته باشن.

#github #codespace

@Syntax_fa
7👍6🔥1
برنامه نویسا تو تایم بیکاریشون چیکار میکنن:

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

(از زبون دوست عزیزمون که اینو نوشته گفتم)

#fun

@Syntax_fa
🤣35👍3👏3❤‍🔥1👎1🔥1👀1
Consumer data platform

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

همه اینا با استفاده از Customer data platform(CDP) انجام میشه.

تو این وب سایت میتونید دربارش اطلاعات بیشتری بدست بیارید:
https://revium.com.au/blog/what-is-segment-cdp

#CDP

@Syntax_fa
👍11😱6🔥2
آخرین خواسته مرحوم قبل مرگش این بود که تاریخچه سرچ های مرورگرش پاک بشه.

نمونه ای از سرچاش:
- اگه من دوبار ویندوز ۳۲ بیت نصب کنم، ۶۴ بیت میشه؟
- چجوری میتونم اینترنتو توی یه درایو بریزم تا بتونم از محل کار ببرمش خونه؟
- چرا میگن از دکمه خاموش روشن کردن لپتاپ. فقط واسه روشن کردن لپتاپ استفاده کنیم؟
- چرا برنامه نویسا سینگل هستن؟
- چجوری میتونم اکانت فیبسوک دوست دختر سابقمو با html هک کنم؟
- این دکمه any key کدوم دکمه کیبورده؟

#Fun

@Syntax_fa
🤣31😁4👍2
3820272e-aba3-4ebb-b590-ceb4aee77c4c.xlsx
370.2 KB
لیست شهر های هر استان
ممکنه بکارتون بیاد یجا ذخیرش کنید.

source

@Syntax_fa
🔥7👍4👏1
ارور ثروتمند و یا RichError 😏

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

بر خلاف خطاهای استاندارد که معمولاً فقط شامل یک پیام یا کد خطا هستند، RichError میتونه شامل اطلاعات اضافی مثل متا دیتا، اپریشنی که توش خطا رخ داده، ارور های لایه پایین تر و هر اطلاعاتی که بدردتون میخوره رو داشته باشید.

چرا بهش Rich error میگیم؟

1. اطلاعات بیشتر:
- ریچ ارور میتونه شامل پیام خطا، کد خطا، نام عملی که باعث خطا شده و هر نوع اطلاعات دیگه باشه. این اطلاعات میتونن شامل متا دیتاهایی باشن که به درک بهتر مشکل کمک میکنن(خیلی کمک میکنن).

2. ساختار تو در تو:
- ریچ ارور می‌تونه به شما اجازه بده که خطاهای تو در تو رو مدیریت کنید. به این معنی که اگر یک خطا ناشی از یک خطای دیگه باشه میتونید به خطای اصلی برسید و درواقع خطایی از دست نمیره.

3. خیلی کارتونو راحت تر میکنه:
- تو مثال هایی که براتون زدم میفهمید که چقدر کارتون رو ساده تر میکنه همچنین باعث میشه کدتون منظم تر و یکپارچه بشه.

اگه هنوز درباره استفاده از Rich error دودلی اینم چند مزایای دیگه:

1. تشخیص بهتر مشکلات:
- با داشتن اطلاعات غنی درباره خطاها، تیم‌های توسعه میتونن سریع‌تر و دقیق‌تر مشکلات رو شناسایی و حل کنن.

2. تجربه کاربری بهبود یافته:
- وقتی که خطاها به صورت واضح و با اطلاعات کافی به کاربر نمایش داده بشه، تجربه کاربری خیلی بهتر میشه.

3. توسعه سریع‌تر:
- با استفاده از RichError، سرعت توسعتون بیشتر میشه(طبق تجربه خودم)

5. سازگاری با سیستم‌های دیگه:
- اطلاعات کافی و ساختارمند ریچ ارور میتونه به راحتی به سیستم‌های دیگر منتقل بشه مثلا میتونید توی لاگرتون هم از اطلاعات ریچ ارور استفاده کنید.

چطور یک ریچ ارور خوب بنویسیم؟

تو ریپازیتوری زیر من ریچ اروری که تقریبا خودم استفاده میکنم رو قرار دادم. همچنین بخوبی درباره rich error توضیح دادم که اگه دوست دارید خودتون بنویسید چه مواردی رو باید رعایت کنید.
https://github.com/alireza-fa/rich-error
برای نصب:
pip install rich-error

ستاره فراموش نشه❤️

#rich_error #python

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥5👌3
Syntax | سینتکس
ارور ثروتمند و یا RichError 😏 ریچ ارور یک الگوی مدیریت خطا در برنامه‌نویسی است که به شما این امکان رو می‌ده تا اطلاعات دقیق‌تری درباره خطاها ها و لایه های مختلفی که این خطا رخ داده تا در نهایت به دست شما رسیده ذخیره کنید و بر اساس این اطلاعات جمع آوری شده،…
برای آشنایی بیشتر یه مثال هم اضافه کنم:

اگر از rich error استفاده نکنیم، برای هندل کردن ارور های مختلف مجبور بودیم از یک سولوشن دیگه بجز exception استفاده کنیم و یا اینکه بیایم و برای هر ارور به این صورت exceptionبنویسیم:
class UserNotFoundErr(Exception):
    pass


class IpBlockedErr(Exception):
    pass


class TooManyRequestErr(Exception):
    pass


class UserConflictErr(Exception):
    pass

در handler هم باید این کار رو میکردیم:

from examples.without_rich_error.service import get_user_service
from examples.without_rich_error.exception import UserNotFoundErr, UserConflictErr, TooManyRequestErr, IpBlockedErr


def get_user_handler(user_id: int):
    try:
        print(service.get_user_by_id(user_id=user_id))
    except UserNotFoundErr as err:
        print("user not found code is 404", err)
    except UserConflictErr as err:
        print("user conflict code is 409", err)
    except TooManyRequestErr as err:
        print("too many request code is 429", err)
    except IpBlockedErr as err:
        print("ip blocked code is 403", err)

در این صورت هرچقدر تعداد exceptionها بیشتر شود مدیریت کردن آنها نیز سخت تر خواهد شد. همچنین قدرت مشاهده گری سیستم با استفاده از exception ها نیز پایین می آید در صورتی که ما در rich error تمامی ارور هایی که در لایه های مختلف رخ داده باشند رو داشتیم.

اگه کد رو با rich error جایگزین کنیم:

from examples.with_rich_error.api import base_response_with_error, base_response


def get_user_handler(user_id: int):
    try:
        ...
    except Exception as err:
        return base_response_with_error(error=err)

از آنجا که ما یک ارور غنی داریم و از کد ها استفاده کردیم به راحتی میدانیم که این ارور به چه معنی است و حتی به سادگی http error مناسب را برگردانیم.

#rich_error #python

@Syntax_fa
👍8🔥5👏1
زمانی که داشتم این کدارو میزدم فقط منو خدا میدونستیم چی به چیه
ولی الان فقط خدا میدونه🥹

پ.ن:
وقتی بعد چند وقت رو پروژه های قدیمت برمیگردی

#fun

@Syntax_fa
🤣331👍1👌1
📊 Raw Queries and Connection Proxy in Django

🔍 How to Get Raw Queries in ORM

در جنگو، اگر ویژگی .query یک QuerySet را چک کنیم، می‌توانیم پرس‌وجو SQL مربوطه را دریافت کنیم. به عنوان مثال:

from author import models
all_authors = models.Author.objects.filter(email__endswith='@gmail.com').values_list('name').query


خروجی:

SELECT "author_author"."name" FROM "author_author" WHERE "author_author"."email"::text LIKE '%@gmail.com'



⚠️ چالش!

در جستجوهای ORM جنگو، دستورهایی داریم که غیر از QuerySet هستند و استفاده از .query باعث ایجاد خطا می‌شود. به عنوان مثال:

from author import models
author_count = models.Author.objects.filter(email='a').count().queries


خطا:

Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'int' object has no attribute 'query'



🛠 راه‌حل با استفاده از Connection Proxy

برای حل این مشکل، از connection در django.db استفاده می‌کنیم:

from django.db import connection
from author import models

author_count = models.Author.objects.filter(email='a').count()
connection.queries[-1]


خروجی:

{'sql': 'SELECT COUNT(*) AS "__count" FROM "author_author" WHERE "author_author"."email" = \'a\'', 'time': '0.166'}



📌 توجه!

شی connection فقط زمانی نتیجه می‌دهد که سرور جنگو در حالت DEBUG=True در حال اجرا باشد!

📝 نوشتن Debug Queries برای درک Connection Proxy

from django.db import connection
from django.db import reset_queries

def database_debug(func):
def inner_func(*args, **kwargs):
reset_queries()
results = func(*args, **kwargs)
query_info = connection.queries
print(f'function_name: {func.__name__}')
print(f'query_count: {len(query_info)}')
queries = [f'{query["sql"]}\n' for query in query_info]
print(f'queries: \n{"".join(queries)}')
return results
return inner_func


📌 توجه! تابع reset_queries تمام پرس‌وجوهای ذخیره شده در connection را پاک می‌کند!

🔧 استفاده از کد:

@database_debug
def regular_query():
blogs = models.Blog.objects.all()
return [blog.author.name for blog in blogs]


خروجی:

function_name: regular_query
query_count: 4
queries:
SELECT "blog_blog"."id", "blog_blog"."noscript", "blog_blog"."content", "blog_blog"."author_id"



💡 توضیح کد:

با استفاده از دستور reset_queries تمام پرس‌وجوهای ذخیره شده در connection را حذف می‌کنیم تا فقط کوئری‌های خواسته شده دیباگ شوند. سپس کوئری‌های داخل inner_function که دکوراتور شده‌اند اجرا می‌شوند و شی connection حاوی لیست از پرس‌وجوها می‌شود. بعد از آن، تمام پرس‌وجوها را از connection.queries بازیابی می‌کنیم.


🔗 منبع : کتاب django in productions
👍7🔥4🥰1