Forwarded from Ninja Learn | نینجا لرن (Denver)
سیستم مدیریت وابستگی در FastAPI
یکی از بهترین ویژگی های FastAPI، سیستم مدیریت وابستگی(Dependnecy Injection) اون هست، این سیستم باعث میشه کد ما تمیز تر، تست پذیر تر و قابل توسعه تر بشه.
بهتره برای درک بهتر این پست درمورد Dependency Injectionرو مطالعه کنید تا با پایه و اساس این مبحث آشنا بشین.
Depends چیه؟
این کلاس توی FastAPI، برای مدیریت وابستگی ها استفاده میشه. به زبان ساده Depends یه راهه که بتونیم بک تابع یا آبجکت رو به صورت خودکار به فانکشن های دیگه تزریق کنیم بدون اینکه دستی اونارو صدا بزنیم یا بخونیم.
با یه مثال ساده شروع میکنیم:
اینجا
FastAPI به صورت خودکار
چرا این سیستم خوبه؟
وابستگی ها مدیریت شده و قابل کنترل میشن
کد تست پذیر تر میشه
ساختار پروژه ماژولار میشه
لاجیک لایه های مختلف جدا میشه و تغییرات ساده تر میشن
اگه ازش استفاده نکنیم چی؟
خب با استفاده نکردن از این ویژگی یه کمک بزرگ رو از دست میدین. به طور مثال اگه وابستگی ها تو در تو باشن شما میتونید فقط با همین ویژگی کلی به تمیزی کدتون کمک کنید.
توی مثال بالا میتونید چندین لایه از وابستگی رو ببینید که به خوبی با Depends مدیریت شدن. حالا اگه این سیستم وجود نداشت چی؟
اگه اون سیستم وجود نداشت باید قبل از هرکاری دونه دونه سرویس ها و لایه های پایین تر رو صدا میزدین و نتیجه اونهارو به همدیگه پاس میدادین. درواقع Depends میاد هر وابستگی ای که تعیین کرده باشین رو قبل از ورود به بدنه ی فانکشن اجرا میکنه و نتیجه ی وابستگی رو به آرگومان فانکشن پاس میده. در نتیجه شما در اولین خط بدنه ی فانکشن همه ی نتایجی که میخواین رو از طریق آرگومان ها در اختیار دارین.
پشت صحنه چه اتفاقی میوفته؟
FastAPI از بالا شروع کرد به نگاه کردن:
دید require_admin به get_current_user نیاز داره، بعد دید get_current_user هم به get_token نیاز داره، پس اول get_token اجرا شد، بعد get_current_user بعد هم require_admin. هربار خروجی یه فانکشن، ورودی فانکشن بعدی شد. درنهایت اگه مشکلی نباشه میرسیم به endpoint.
از کجا فهمید چی رو به کجا بفرسته؟
خب باید بگم که FastAPI به شدت به تایپ هینت ها وابسته است و خیلی ازشون استفاده میکنه. همین Depends هم با استفاده از تایپ هینت ها جای مقادیر رو درک میکنه. یه فانکشن توی پایین ترین لایه یه آرگومان با تایپ Header داره؟ خب Depends اون آرگومان رو توی درخواست دریافت میکنه به اون فانکشن میرسونه.
کجا ازش استفاده کنیم؟
هر وابستگی ای که نیاز داره یه پارامتری رو مستقیما از درخواست بگیره و روش پردازش انجام بده، و به نحوی قبل از فانکشن endpoint اجرا بشه و نتیجه ی آماده داشته باشه(درست همونطور که گفتم، قبل از بدنه ی اصلی فانکشن) باید با Depends استفاده بشه. مثلا گرفتن توکن از هدر یا چک کردن دسترسی ها، اتصال به دیتابیس
اما اگه فانکشنی که میخواید استفاده کنید ارتباط مستقیم با بدنه و اطلاعات ورودی از درخواست نداره و فقط برای انجام کاری یا پردازش داخلی باشه نیازی به Depends نداره. مثل ثبت نام کاربر که ممکنه دیتای خام و پردازش نشده ای از درخواست نیاز نداشته باشه و صرفا اطلاعات رو توی دیتابیس ذخیره میکنه
سعی کردم هر سوالی که برای خودم توی فرآیند این سیستم پیش اومد رو به بهترین شکل پوشش بدم. اگه مشکلی توی درک داشتین یا سوالی براتون مونده بود توی کامنت ها بپرسین.
➖➖➖➖➖➖➖➖➖➖
یکی از بهترین ویژگی های FastAPI، سیستم مدیریت وابستگی(Dependnecy Injection) اون هست، این سیستم باعث میشه کد ما تمیز تر، تست پذیر تر و قابل توسعه تر بشه.
بهتره برای درک بهتر این پست درمورد Dependency Injectionرو مطالعه کنید تا با پایه و اساس این مبحث آشنا بشین.
Depends چیه؟
این کلاس توی FastAPI، برای مدیریت وابستگی ها استفاده میشه. به زبان ساده Depends یه راهه که بتونیم بک تابع یا آبجکت رو به صورت خودکار به فانکشن های دیگه تزریق کنیم بدون اینکه دستی اونارو صدا بزنیم یا بخونیم.
با یه مثال ساده شروع میکنیم:
from fastapi import FastAPI, Depends
app = FastAPI()
def get_db():
db = "Database Connection"
try:
yield db
finally:
print("Closing DB connection")
@app.get("/items/")
def read_items(db = Depends(get_db)):
return {"db_connection": db}
اینجا
read_items خودش مستقیم سشن دیتابیس رو نمیسازه، فقط میگه: من به یه سشن دیتابیس نیاز دارم.FastAPI به صورت خودکار
get_db رو صدا میزنه و نتیجه رو به db میده.چرا این سیستم خوبه؟
وابستگی ها مدیریت شده و قابل کنترل میشن
کد تست پذیر تر میشه
ساختار پروژه ماژولار میشه
لاجیک لایه های مختلف جدا میشه و تغییرات ساده تر میشن
اگه ازش استفاده نکنیم چی؟
خب با استفاده نکردن از این ویژگی یه کمک بزرگ رو از دست میدین. به طور مثال اگه وابستگی ها تو در تو باشن شما میتونید فقط با همین ویژگی کلی به تمیزی کدتون کمک کنید.
from fastapi import Header, HTTPException, APIRouter, Depends
router = APIRouter()
def get_token(token: str = Header(...)):
return token
def get_current_user(token: str = Depends(get_token)):
user = {"username": "abolfazl", "role": "admin"}
return user
def require_admin(user: dict = Depends(get_current_user)):
if user["role"] != "admin":
raise HTTPException(status_code=403, detail="Not authorized")
return user
def list_users_service():
return [{"username": "a"}, {"username": "b"}]
@router.get("/users")
def list_users(admin_user: dict = Depends(require_admin)):
users = list_users_service()
return users
توی مثال بالا میتونید چندین لایه از وابستگی رو ببینید که به خوبی با Depends مدیریت شدن. حالا اگه این سیستم وجود نداشت چی؟
def list_users():
token = get_token()
user = get_current_user(token)
admin_user = require_admin(user)
...
اگه اون سیستم وجود نداشت باید قبل از هرکاری دونه دونه سرویس ها و لایه های پایین تر رو صدا میزدین و نتیجه اونهارو به همدیگه پاس میدادین. درواقع Depends میاد هر وابستگی ای که تعیین کرده باشین رو قبل از ورود به بدنه ی فانکشن اجرا میکنه و نتیجه ی وابستگی رو به آرگومان فانکشن پاس میده. در نتیجه شما در اولین خط بدنه ی فانکشن همه ی نتایجی که میخواین رو از طریق آرگومان ها در اختیار دارین.
پشت صحنه چه اتفاقی میوفته؟
FastAPI از بالا شروع کرد به نگاه کردن:
دید require_admin به get_current_user نیاز داره، بعد دید get_current_user هم به get_token نیاز داره، پس اول get_token اجرا شد، بعد get_current_user بعد هم require_admin. هربار خروجی یه فانکشن، ورودی فانکشن بعدی شد. درنهایت اگه مشکلی نباشه میرسیم به endpoint.
از کجا فهمید چی رو به کجا بفرسته؟
خب باید بگم که FastAPI به شدت به تایپ هینت ها وابسته است و خیلی ازشون استفاده میکنه. همین Depends هم با استفاده از تایپ هینت ها جای مقادیر رو درک میکنه. یه فانکشن توی پایین ترین لایه یه آرگومان با تایپ Header داره؟ خب Depends اون آرگومان رو توی درخواست دریافت میکنه به اون فانکشن میرسونه.
کجا ازش استفاده کنیم؟
هر وابستگی ای که نیاز داره یه پارامتری رو مستقیما از درخواست بگیره و روش پردازش انجام بده، و به نحوی قبل از فانکشن endpoint اجرا بشه و نتیجه ی آماده داشته باشه(درست همونطور که گفتم، قبل از بدنه ی اصلی فانکشن) باید با Depends استفاده بشه. مثلا گرفتن توکن از هدر یا چک کردن دسترسی ها، اتصال به دیتابیس
اما اگه فانکشنی که میخواید استفاده کنید ارتباط مستقیم با بدنه و اطلاعات ورودی از درخواست نداره و فقط برای انجام کاری یا پردازش داخلی باشه نیازی به Depends نداره. مثل ثبت نام کاربر که ممکنه دیتای خام و پردازش نشده ای از درخواست نیاز نداشته باشه و صرفا اطلاعات رو توی دیتابیس ذخیره میکنه
سعی کردم هر سوالی که برای خودم توی فرآیند این سیستم پیش اومد رو به بهترین شکل پوشش بدم. اگه مشکلی توی درک داشتین یا سوالی براتون مونده بود توی کامنت ها بپرسین.
#️⃣ #fastapi #python #backend
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
Forwarded from PhiloLearn | فیلولرن
✔️ داینامیک بودن پایتون - قسمت 3.1.0 دوره پایتون
🔗 https://youtu.be/glA1YTCdAA0 🔗
توی این قسمت بشدت کوتاه سعی کردم که خیلی خلاصه داینامیک بودن پایتون رو توضیح بدم💙
🔗 https://youtu.be/glA1YTCdAA0 🔗
پ.ن: این شوخی با اسم قسمت ها داره به جاهای باریکی کشیده میشه 😂🤦🏻♂️
#آموزش_پایتون #Python
#ویدیو
#یوتیوب
💙💙 @PhiloLearn💙💙
🔗 https://youtu.be/glA1YTCdAA0 🔗
توی این قسمت بشدت کوتاه سعی کردم که خیلی خلاصه داینامیک بودن پایتون رو توضیح بدم💙
🔗 https://youtu.be/glA1YTCdAA0 🔗
پ.ن: این شوخی با اسم قسمت ها داره به جاهای باریکی کشیده میشه 😂🤦🏻♂️
#آموزش_پایتون #Python
#ویدیو
#یوتیوب
💙💙 @PhiloLearn💙💙
Forwarded from Ninja Learn | نینجا لرن (Denver)
🟡 خب خب خب، PEP8: قوانین طلایی برای کدنویسی پایتون
وقتی به برنامهنویسی پایتون علاقهمند میشید، یکی از اولین چیزهایی که باید یاد بگیرید PEP8 هست. این یه استاندارد رسمی برای کدنویسی به زبان پایتونه که توسط Python Software Foundation منتشر شده و هدفش اینه که کدهای پایتون هماهنگ، خوانا و استاندارد باشن. با این استاندارد کد های همه برنامه های پایتون توی مسائل پایه ای استایل کد مثل هم میشه و خوندن و درک کد های مختلف هم ساده تر میشه. توی این پست میخوایم توضیح بدیم که PEP8 چیه، چرا مهمه و چندتا از مهمترین قواعدش رو بررسی کنیم.
PEP8 چی هست؟
PEP8 یه استاندارد شامل یه سری دستورالعمل ها و قوانین برای نوشتن کد منظم و تمیز پایتونه. این استاندارد برای کمک به برنامه نویس ها تنظیم شده تا کدی بنویسن که هم برای خودشون هم برای دیگران قابل فهم باشه. دستورااعمل های این استاندارد شامل اصولی درمورد قواعد نام گذاری، استایل کد، تو رفتگی ها و ... میشه.
چرا باید از PEP8 استفاده کنیم؟
خوانایی بیشتر: کد هایی که طبق استاندارد های خاصی نوشته میشن، برای دیگران راحت تر قابل فهم هستن.
نگهداری ساده تر: کد استادارد به راحتی قابل تغییر و گسترشه.
هماهنگی بین تیم ها: وقتی همه از یک استاندارد پیروی کنن، حتی اگه جند نفر هم روی یک پروژه کار کنن کار کردن با کد ها خیلی راحت تر میشه
اصول کلیدی PEP8
1️⃣ قواعد نام گذاری(Naming Conventions)
نام گذاری درست متغیر ها، توابع، کلاس ها و ماژول ها باعث میشه کد شما خوانا و قابل فهم باشه.
نام متغیر ها و توابع: از snake_case استفاده کنید.
نام کلاس ها: باید از CapCase استفاده کنید
نام ماژول ها: میشه از lowercase استفاده کنید و برای جدا کردن کلمات از خط تیره (-) نکنید
2️⃣ چیدمان کد(Code Layout)
چیدمان منظم کد برای راحتی خوندن و نگهداری کد ها ضروریه
طول خط ها: طول خط ها توی پایتون نباید بیشتر از ۷۹ کاراکتر باشه. این باعث میشه که کد های توی ابزارهای مختلف(مثل کامند git diff) و ترمینال راحت تر دیده بشن.
فاصله های خالی: بعد از کاما و آرگومان ها یک فاصله بگذارین:
3️⃣ تو رفتگی(Indentation)
تو رفتگی ها برای نمایش ساختار کد و مشخص کردن بلوک های کد استفاده میشن.
از ۴ فضای خالی برای هر سطح تو رفتگی استفاده کنید.
5️⃣ فضای خالی در عبارات و دستورات (Whitespaces in Expressions and Statements)
فضای خالی در عبارات و دستورات به خوانایی کد کمک میکنه:
قبل و بعد از اپراتورهای ریاضی فاصله بگذارید:
در داخل پرانتزها فاصله نگذارید:
فاصله هارو فقط قبل از هر کاما بذارید:
چجوری همیشه این قواعد رو رعایت کنیم؟
خب یه راه آسونش میتونه استفاده از ابزار هایی مثل pylint و flake8 باشه. اما یه راه راحت تر، اگه از IDE هایی مثل Pycharm استفاده میکنید خودشون وقتی که کد غیر استاندارد بنویسید بهتون میگن و بییشتر مواقع خودشون کد رو درست میکنن. اگه از VSCode یا هر ادیتور دیگه ای استفاده میکنید میتونید افزونه ی مربوط به این استاندارد رو روش نصب و استفاده کنید.
جمع بندی✍️
PEP8 به شما کمک میکنه که کد پایتون تمیز، خوانا و استاندارد بنویسید. رعایت قواعدی مثل نام گذاری درست، استفاده مناسب از فاصله ها و تو رفتگی ها باعث میشه کد شما به راحتی قابل نگهداری و درک باشه.
➖➖➖➖➖➖➖➖➖➖
وقتی به برنامهنویسی پایتون علاقهمند میشید، یکی از اولین چیزهایی که باید یاد بگیرید PEP8 هست. این یه استاندارد رسمی برای کدنویسی به زبان پایتونه که توسط Python Software Foundation منتشر شده و هدفش اینه که کدهای پایتون هماهنگ، خوانا و استاندارد باشن. با این استاندارد کد های همه برنامه های پایتون توی مسائل پایه ای استایل کد مثل هم میشه و خوندن و درک کد های مختلف هم ساده تر میشه. توی این پست میخوایم توضیح بدیم که PEP8 چیه، چرا مهمه و چندتا از مهمترین قواعدش رو بررسی کنیم.
PEP8 چی هست؟
PEP8 یه استاندارد شامل یه سری دستورالعمل ها و قوانین برای نوشتن کد منظم و تمیز پایتونه. این استاندارد برای کمک به برنامه نویس ها تنظیم شده تا کدی بنویسن که هم برای خودشون هم برای دیگران قابل فهم باشه. دستورااعمل های این استاندارد شامل اصولی درمورد قواعد نام گذاری، استایل کد، تو رفتگی ها و ... میشه.
چرا باید از PEP8 استفاده کنیم؟
خوانایی بیشتر: کد هایی که طبق استاندارد های خاصی نوشته میشن، برای دیگران راحت تر قابل فهم هستن.
نگهداری ساده تر: کد استادارد به راحتی قابل تغییر و گسترشه.
هماهنگی بین تیم ها: وقتی همه از یک استاندارد پیروی کنن، حتی اگه جند نفر هم روی یک پروژه کار کنن کار کردن با کد ها خیلی راحت تر میشه
اصول کلیدی PEP8
1️⃣ قواعد نام گذاری(Naming Conventions)
نام گذاری درست متغیر ها، توابع، کلاس ها و ماژول ها باعث میشه کد شما خوانا و قابل فهم باشه.
نام متغیر ها و توابع: از snake_case استفاده کنید.
my_variable = 10
def my_function():
pass
نام کلاس ها: باید از CapCase استفاده کنید
class UserProfile:
pass
نام ماژول ها: میشه از lowercase استفاده کنید و برای جدا کردن کلمات از خط تیره (-) نکنید
import mymodule
import user_routers
2️⃣ چیدمان کد(Code Layout)
چیدمان منظم کد برای راحتی خوندن و نگهداری کد ها ضروریه
طول خط ها: طول خط ها توی پایتون نباید بیشتر از ۷۹ کاراکتر باشه. این باعث میشه که کد های توی ابزارهای مختلف(مثل کامند git diff) و ترمینال راحت تر دیده بشن.
فاصله های خالی: بعد از کاما و آرگومان ها یک فاصله بگذارین:
print("This code is too long and does not follow the standard. It cannot be read. properly in some tools like 'git diff'. This line should be broken into. multiple lines to follow the standard. The maximum length for a line is 79 characters.")
def my_function(x, y):
return x + y3️⃣ تو رفتگی(Indentation)
تو رفتگی ها برای نمایش ساختار کد و مشخص کردن بلوک های کد استفاده میشن.
از ۴ فضای خالی برای هر سطح تو رفتگی استفاده کنید.
class MyMath:
def my_function(self, x):
if x > 0:
print("Positive")
else:
print("Negative")
5️⃣ فضای خالی در عبارات و دستورات (Whitespaces in Expressions and Statements)
فضای خالی در عبارات و دستورات به خوانایی کد کمک میکنه:
قبل و بعد از اپراتورهای ریاضی فاصله بگذارید:
x = 5 + 3
در داخل پرانتزها فاصله نگذارید:
my_function(1, 2, 3)
فاصله هارو فقط قبل از هر کاما بذارید:
a, b, c = 1, 2, 3
چجوری همیشه این قواعد رو رعایت کنیم؟
خب یه راه آسونش میتونه استفاده از ابزار هایی مثل pylint و flake8 باشه. اما یه راه راحت تر، اگه از IDE هایی مثل Pycharm استفاده میکنید خودشون وقتی که کد غیر استاندارد بنویسید بهتون میگن و بییشتر مواقع خودشون کد رو درست میکنن. اگه از VSCode یا هر ادیتور دیگه ای استفاده میکنید میتونید افزونه ی مربوط به این استاندارد رو روش نصب و استفاده کنید.
جمع بندی✍️
PEP8 به شما کمک میکنه که کد پایتون تمیز، خوانا و استاندارد بنویسید. رعایت قواعدی مثل نام گذاری درست، استفاده مناسب از فاصله ها و تو رفتگی ها باعث میشه کد شما به راحتی قابل نگهداری و درک باشه.
#️⃣ #programming #python
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
Forwarded from 🎄 یک برنامه نویس تنبل (The Lazy 🌱)
🔶 یه سیستم ترجمه PDF با زبان پایتون با استفاده از وب آپ Streamlit نوشتیم که می تواند با مدل های هوش مصنوعی Huggingface به هر زبانی ترجمه کند.
شما می توانید هر مدل هوش مصنوعی توی سیستم ترجمه بکار بگیرید اما باید برای استفاده از آن باید Huggingface را شارژ کنید.
گیت هاب :
https://github.com/Rayiumir/DeepLingua
#python
@TheRaymondDev
شما می توانید هر مدل هوش مصنوعی توی سیستم ترجمه بکار بگیرید اما باید برای استفاده از آن باید Huggingface را شارژ کنید.
گیت هاب :
https://github.com/Rayiumir/DeepLingua
#python
@TheRaymondDev