Python BackendHub
7.36K subscribers
306 photos
46 videos
11 files
427 links
Learning python & Backend Engineering, with Mani!

Youtube: https://www.youtube.com/@GitOverHere
Github: https://github.com/ManiMozaffar
Linkedin: https://www.linkedin.com/in/manimozaffar

تبلیغات نداریم

Admin: @Mani_nikou
Download Telegram
سمت فرانت تنها کاری که باید انجام بدین که مربوط به JWT میشه:

فرش توکن اصلا نباید تو local storage ذخیره شه چون تو بک آپ browser هست و کلا دسترسی بهش غیر ممکن نیست. به جاش باید تو کوکی ذخیرش کنید تحت همچین ویژگی هایی:
prefixes (e.g. __HOST-)
attributes (Secure, HttpOnly, SameSite)
👍11
برای پایین آوردن تایم بیلدتون از poetry با داکر میتونید از همچین داکرفایلی استفاده کنید

FROM python:3.11.3

WORKDIR /src

COPY pyproject.toml poetry.lock* ./

RUN pip install poetry \
&& poetry config virtualenvs.create false \
&& poetry install --no-interaction --no-ansi

COPY . .

ENV PYTHONPATH=/app:$PYTHONPATH

EXPOSE YOUR_PORT

# handle deploy here
CMD ["make", "deploy"]

اینطوری وقتی بیلد بگیرین تا زمانی که پکیج جدیدی اضافه نکرده باشین پکیجا رو دوباره اینستال نمیکنه.
میتونید pip install poetry هم نزنید و از ایمیج خودش استفاده کنید. ولی فرقی نمیکنه از نظره تایم بیلد خیلی.

@ManiFoldsPython
2
توصیه میکنم حتما بخونید و یاد بگیرین اگه با Microservice یا SOA سروکله دارین

https://opentelemetry.io/docs/getting-started/dev/

What is OpenTelemetry?
A short explanation of what OpenTelemetry is, and is not.
Microservices architectures have enabled developers to build and release software faster and with greater independence, as they were no longer beholden to the elaborate release processes associated with monolithic architectures.

As these now-distributed systems scaled, it became increasingly difficult for developers to see how their own services depend on or affect other services, especially after a deployment or during an outage, where speed and accuracy are critical.

Observability has made it possible for both developers and operators to gain that visibility into their systems.

@ManiFoldsPython
👍2
میخوام این چند روز مطالبو اختصاص بدم به opentelemetry و نحوه استفادش با FastAPI و کانفیگش. چون وقتی یک چیزیو توضیح میدم خودمم خوب متوجه میشم 😅

پارت یک

اولا که opentelemetry چیه؟ یک پروژه Cloud Native Computing Foundation هست که شامل یک سری ابزار و API و استاندار میشه که کار رو برای دولوپر ها و SRE ها راحت تر میکنه تا از سرویس هاشون راحت instrument (معادل فارسیش رو نمیدونم) بکنند و بتونند با دیتایی که جمع میکنن سیستم هاشون رو بهتر درک کنند و راحت تر دیباگ کنند.

کل دیتا جمع آوردی شده از 3 روش بدست میاد:
1. متریک: شامل اعدادی میشن که تو یک سری بازه زمانی خونده میشن. مثلا سی پی یو یوسیج یا ارور ها یا تعداد درخواست. این برای ارزیابی پرفومنس سیستم تو یک نگاه سریع استفاده میشه.

2. لاگ: رکورد های اتفاقاتی هستند که تو سرویس رخ میدن. اینفورمنیشن خیلی کاملی نسبت به حوادث میدن به ما. میتونه یک query که به دیتابیس زده میشه باشه یا هرچیزی که لاگ میندازین خودتون یا لایبری که ازش استفاده میکنید لاگ میندازه.

3. تریس:تو تریس ما از یک activity یک درخواست که تو سیستم میره رکورد میگیریم. خب شاید بگین این که شد همون لاگ؟ نه, تو تریس ما بسیار استراکچر منظم تری داریم و کاربردش اصلا با کاربرد لاگ یکی نیست. مثلا شما به یک external service درخواست زدین. تمام درخواست هایی که به اون external service میزنید رو با یک context manager فقط تو تریس همون سرویس ذخیره میکنید. این باعث میشه مثلا متوجه شین یکی از سرویس هاتون خیلی داره ارور میده چون کلی تریس اون سرویس فیل شده از سرویس های مختلف بدون اینکه لاگ هارو نیاز باشه بخونید حتی!

with tracer.start_as_current_span("authentication"):
...


مثلا اینجا اومدم از سرویس authentication یک چیزی رو دریافت کنم. جای اینکه لاگ بندازم درخواست های به اون سرویس رو, موقع زدن کانکشن به اون سرویس یک context manager باز میکنم. این باعث میشه که تو دیتابیس هم هرچی fail بخوره زیر کانکتس منیجر تحت عنوان سرویس authentication رکورد شه نه سرویسی که داره درخواست میزنه. این کار باعث میشه همین که برم تو داشبورد جای اینکه ببینم مثلا 10 تا سرویسم همشون دارن ارور میدن, یک سرویس درواقع داره ارور میده رو 10 سرویس مختلف و داشبورد خودش traceback کرده چون tracer ای فیل شده که authentication بوده.

دو مورد دیگه هم تو trace هست که تو لاگ نیست,
یکیش اینه که timing information داره. یعنی دقیقا مشخص میکنه یک درخواست از چه سرویسی رفته به چه سرویس دیگه ای و چقدر تو هر سرویس بوده. پرفومنس همه سرویس هاتون رو اینطوری میتونید مشخص کنید. (خیلی خفنه نه ؟)
دوم اینکه trace ID و span ID داره که خب طبیعتا هر تریس ممکنه چندین span داشته باشه و با چند سرویس در کنش باشه. این باعث میشه مسیری که اون درخواست طی کرده هم ببینیم.

@ManiFoldsPython
👍7
این چقدر باحاله!
https://github.com/behave/behave

یک فریم ورک BDD برای تست نویسی.
تو عکس یک مثالشو گذاشتم

واسه UI تست بنظرم خیلی میتونه خفن باشه. 😁

@ManiFoldsPython
👍5
برای لود تست هم locust رو داریم
https://github.com/locustio/locust

که میتونید scalability اپلیکشنتون رو باهاش بسنیجید که تو لود بالا چقدر پرفومنس داره.
خودشم GUI داره.
@ManiFoldsPython
👍3
Python BackendHub
دیروز با یک pen tester راجب بست پرکتیس های JWT صحبت میکردم و اینکه کلا چطور میشه هم مزیت های JWT رو داشت و هم به نحوی امن پیاده سازیش کرد, JWT همونطور که میدونید stateless هست یعنی نیازی به هیت به دیتابیس نداره. برای microservice و SOA هم بهتره چون overhead…
دارم رو یک boilerplate کار میکنم که همه اینا رو رعایت کرده باشه.

https://github.com/ManiMozaffar/fast-auth

امکاناتی که داره:
Secure JWT implementation
Redis black list access token
Refresh/login endpoint
Register endpoint


امکاناتی که مونده و باید ادد شه:
Add email field
Mail client
Email and verify email address on registration endpoint
Alarm unauthorized logins with mailing
Change username/email/password functionality with 2FA step (as email/gauth)
Opentelemetry integration
OAuth2 proto integration
OAuth support for gmail and apple

ROADMAP


اگه دوست داشتین میتونید کانتربیوت کنید. کدش کاملا کلین و اصولیه 😅

@ManiFoldsPython
👍9
This media is not supported in your browser
VIEW IN TELEGRAM
مصاحبه رو صد در صد تضمینی با این روش با هر شرکتی پاس میشین 😂
@ManiFoldsPython
😁21🖕1
خبر مهم: کورسرا حق اشتراک ماهانه شو کرده ۱ دلار/یورو/پوند
همه دوره‌ها رو برای یک ماه میتونید با این قیمت داشته باشید و از ماه بعد قیمت کامل تقریبا ۶۰ دلاری رو باید بپردازید.

آخرین فرصت خرید تا ۲۲ جوئن هست.
https://www.coursera.org/courseraplus/special/june-promo-2023

@DevTwitter | <Abbas عطاردوار/>
👎4👍2
Perfect programming language! 😂😂

یکی از عجیب ترین زبون های برنامه نویسی رو تو ریپو زیر میتونید ببینید که البته بیشتر بنظرم شبیه میمه 😂

https://github.com/TodePond/DreamBerd

چند چیز عجیب این زبون که میشه به طور خلاصه بهش اشاره کنم:

میتونید یک integer رو دیلیت کنید.
delete 3!
print(2 + 1)! // Error: 3 has been deleted
😂😂😂

حتی میتونید دیلیت رو دیلیت کنید😂😂 ولی حواستون باشه که اگه دیلیت رو دیلیت کردین دیگه نمیتونید چیزیو دیلیت کنید! 😂
delete delete!


یک چیز باحال دیگه, استاد تو زبونش اتک هم زده به OOP کارا :))))))
You can make classes, but you can only ever make one instance of them. This shouldn't affect how most object-oriented programmers work

class Player {
const var health = 10!
}

const var player1 = new Player()!
const var player2 = new Player()! //Error

ولی میتونید همینم دور بزنید 😂😂
class PlayerMaker {
function makePlayer() => {
class Player {
const var health = 10!
}
const const player = new Player()!
return player!
}
}

const const playerMaker = new PlayerMaker()!
const var player1 = playerMaker.makePlayer()!
const var player2 = playerMaker.makePlayer()!

جدا از شوخی بعضی ایده هاش واقعا جالب بود که بهش نپرداختم. تو ریپو هست.

پ.ن: فیلم زیرو از دست ندین
https://www.youtube.com/watch?v=tDexugp8EmM

@ManiFoldsPython
🤣12👍1
Your wiki, docs, & projects. Together.
https://www.notion.so/

با اینترفیس notion خیلی حال کردم
همه چی داره! با UX و UI خیلی عالی. و کمپانی های خیلی بزرگیم ازش استفاده میکنن مثل آمازون و فیگما و uber و pixar.
نمونه داک فنیشو تو تصویر میتونید ببینید (پ.ن: درفته واقعی نیست :)) )
پلن پایه اش مجانیه میتونید تست کنید و اگه نیاز بود آپگرید کنید. 👍

@ManiFoldsPython
🤓4🍌1
Python BackendHub
سمت فرانت تنها کاری که باید انجام بدین که مربوط به JWT میشه: فرش توکن اصلا نباید تو local storage ذخیره شه چون تو بک آپ browser هست و کلا دسترسی بهش غیر ممکن نیست. به جاش باید تو کوکی ذخیرش کنید تحت همچین ویژگی هایی: prefixes (e.g. __HOST-) attributes (Secure…
خب ما رفرش توکن رو تو لوکال استوریج ذخیره میکردیم درسته؟ اتکر هم بهش دسترسی داره. پس باید چیکار کنیم؟ میبریم تو کوکی.

یک نکته خیلی جالب داشت که کسی بهش اشاره نکرد و امروز یکم بهش فکر کردم اصلا باعث میشه رفتار اندپوینت refresh توکن باید کاملا تغییر کنه تا pen test ای که انجام میشه نتونه ریپورت یا مشکل امنیتی بگیره. دلیلش چیه؟
اگه تو کوکی با اون مشخصاتی که پست قبل تر اشاره کردم هم بذاریم اینقدر امن میشه که دیگه خود کلاینت فرانت هم نمیتونه بهش دسترسی داشته باشه. 😂

پس همینجا مشکل میشه. باید تو روتر refresh token, تو کوکی رفرش توکن رو بگیریم نه تو بادی!
و تو سرور هم رفرش توکن رو تو کوکی چک کنیم. اما تمام ماجرا اینجا نیست. حالا برای اینکه CSRF اتک هم رخ نده باید از CSRF Token تو اون روتر استفاده کنیم. اکسز توکن هم که تو مموری نگه میداریم.

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

@ManiFoldsPython
👍3
اینم بگم که اصلا تو اپ موبایل نیاز به این کارا نیست. تو اپ موبایل Key Chain داریم که یک استوریج امن بهمون میده.
https://developer.android.com/reference/android/security/KeyChain

https://medium.com/ios-os-x-development/securing-user-data-with-keychain-for-ios-e720e0f9a8e2

پس میتونید اگه تست هاتون رو مثلا با همون حالت نوشتین همونو نگه دارین و برای اپ موبایل هم همونو نگه دارین. به جاش تو وب اپ روش cookie رو فورس کنید.
اینطوری backward compatibility هم دارین و نیازی به ریفکتور کردن تستون و اپ گوشیتون ندارین.
البته مدل اهراز هویتتون هم پیچیده تر میشه :) چون حالا به جای یک مدل اهراز حویت دو مدل دارین.

@ManiFoldsPython
طبق Auth0 بهتره رفرش توکن فقط یک بار استفاده شه
منبع

برای پیاده سازیش پس عملا رفرش توکن سمت سرور باید ذخیره شه, و بعد از رفرش شدن توکن قدیمی ممبرشیپش باطل شه.

بهتره جای اینکه هر رفرش توکنی باطل میشه یک لیست گنده درست کنید و اونجا بلک لیست کنید, هر رفرش توکنی که زندست رو بتونید وایت لیست کنید. (از نظر ریسورس منطقی تره)

یکم عجیب نیست؟
ولی خب استاندارده 😅

@ManiFoldsPython
👍3
امروز با اختلاف بسییااااار فاحش یکی از سخت ترین مصاحبه های تکنیکالمو دادم. با شرکتی که 2 ماه پیش رزومه فرستاده بودم مصاحبه فنی گرفتم شرکت نسبتا بزرگ و پیشرفته ای هست. (اسم شرکت رو به دلایل شخصی نمیتونم بگم). 2 ساعت و 45 دقیقه مصاحبه طول کشید تماما فنی. اما بزرگ ترین درس فنی رو یاد گرفتم که اخر متن میگم.

یک تکنیکال question داشت که پیچیده بود به جای خود. هر خط کدی که مینوشتم درجا میگفت why و قبلش هم باید سره architect کدم باهاش به توافق میرسیدم!

اما برسیم سره سوالات, من اینطوری بودم که الان قراره چند تا سوال پایتونی آسون بپرسه و ببنده کارو. استاد ازم پرسید NS چیه توضیح دادم.گفت وقتی مرورگر رو میزنم میرم یک یو ار ال چه اتفاقی میفته توضح دادم که اره JSP میاد اون ip که کش کرده خودش رو مپ میکنه به دامین. بعد پرسید ISP چطوری اینکارو انجام میده؟ همینطوری لایه لایه ازم میپرسید میرفت بالا. اخرش به یک لایه ای رسید که گفتم من بخدا از اینجا به بعدشو بلد نیستم 😂😂

سوال بعدی این بود که کش چطوری هندل میشه؟ با GC. اوکی gc چطور کار میکنه؟ جواب دادم. اوکی حالا میتونیم به پایتون کش رو خودمون هندل کنیم؟ جواب دادم. اوکی حالا چه بلایی سره مجیک متودای مربوط به کش میاد وقتی کاستومایز میکنیم؟ جواب دادم. دیگه ادامه نداد و لبخند زد.

رفت سوال بعدی, گفت تو پایتون وقتی یک تابعو با 2 تا variable که ساختی صدا میزنی چه اتفاقی میفته؟ جواب دادم گفت by value و by reference چطور تو پایتون هندل میشه؟ جواب دادم. بعد ایراد گرفت و رفت سوال بعدی

خلاصه کلام, هر سوالی که میپرسید اینقدر کشش میداد میگفت why و how تا به عمق پایینتری برسه. از همه چیز پرسید, profiling benchmarking CI CD و سافتور آرچیتکت . همه هم با همین روند پیش رفت. اینقدر جلو میرفت تا بگم غلط کردم یا اینکه به ته عمقش میرسیدم و میرفت سوال بعدی!

تهش به من گفت تو کل مصاحبه فقط 2 تا why و how رو تا انتهاش رفتی یکی مموری بود یکیم software architect و بقیه چیزایی که پرسیدم همون عمق دوم یا سوم گیر کردی توش و همین سنیورت نمیکنه و من تو رو تو category مید لول میذارم تو شرکتمون.


و در انتها گفت سنیور کسیه که میدونه why, how و where برای تمام چیزایی که باهاش سرو کله داره چه مستقیم چه غیر مستقیم روزانه.

تعریف جالبی بود و تجربه جالبی بود گفتم باهاتون به اشتراک بذارم.
@ManiFoldsPython
51👍24👏3👎1😁1
یکی از سوالاتی که پرسیدن ازم Pass by Reference in Python و Pass By Value بود که این مکانیزم چطور تو پایتون کار میکنه. این مثال به طور خیلی مشخص و خوشگلی توضیح میده.

خروجی کدوم یکی از حالات میشه؟
پی نوشت: عدد memory address رو یک رقمی کردم که قدرت خوانایی سوال بالا بره.

@ManiFoldsPython
3
کدوم گزینه میتونه خروجی باشه تو سوال بالا؟
Final Results
21%
گزینه ۱
23%
گزینه ۲
18%
گزینه ۳
38%
گزینه ۴
اینم quiz دوم. در واقع سوال دومش رو میشه از همین کوییز نتیجه گیری کرد.

شب هم اینکه چطور اینطوری شد و هم اینکه چرا اینطوری شد توضیح میدم 😁

پ.ن: چراشو دیشب فهمیدم :)) بقیشو تونستم جواب بدم ولی تاحالا واقعا فکر نکرده بودم چرا تو پایتون اینطوری هندل میشه این موضوع.

@ManiFoldsPython
کدوم گزینه میتون خروجی باشه تو سوال بالا؟
Final Results
11%
گزینه ۱
10%
گزینه ۲
56%
گزینه ۳
23%
گزینه ۴