Syntax | سینتکس
Открыть в Telegram
Focus: Web Lan: Python & Go Website: https://syntaxfa.ir Quick connect: https://quick-connect.syntaxfa.ir Github: https://github.com/syntaxfa Group: https://t.me/Syntax_fa_group
Больше2 990
Подписчики
+724 часа
+137 дней
+3230 день
Архив постов
2 989
مراحل دپلوی:
مرحله اول
1. نوشتن کد ها
2. ران کردن تست با استرس
موفقیت آمیز:
- به جدم کسی نیست در حدم
ناموفق:
- من چقدر برنامه نویس بدبختی هستم 😔
مرحله دوم
1. تصحیح کد ها
2. ران کردن تست با استرس فراوان
موفقیت:
- خدایا شکرت
ناموفق:
خشم فروان
مرحله سوم
1. تصحیح دوباره کد ها
2. ران کردن تست
3. تستا چه موفق بود چه ناموفق دپلوی کن بره
#fun
@Syntax_fa
2 989
Gracefully shutdown
در برنامهنویسی، فرآیند "gracefully shutdown" به معنی خاموش کردن برنامه بهصورتی است که از بروز اختلالات و از دست رفتن دادهها جلوگیری شود. این موضوع در سیستمهای توزیعشده، سرورها و برنامههای بلادرنگ اهمیت بیشتری پیدا میکند.
مدیریت سیگنالها
- سیگنالها: سیستمعاملها سیگنالهایی مثل
SIGTERM یا SIGINT را برای اطلاعرسانی به برنامهها ارسال میکنند که باید خاموش شوند.
لیستی از سیگنال های LINUX. هر سیگنال معنی خاص خودش رو داره. SIGTERM به معنی سیگنالی هستش که برای Process termination ارسال شده است.
https://faculty.cs.niu.edu/~hutchins/csci480/signals.htm
- واکنش به سیگنالها: برنامه باید این سیگنالها را مدیریت کرده و فرآیند خاموشی را آغاز کند.
پردازش درخواستهای جاری
- تکمیل درخواستها: برنامه باید مطمئن شود که تمامی درخواستهای در حال پردازش به اتمام میرسند و پاسخها بهطور کامل ارسال میشوند.
- پذیرش درخواست جدید: ممکن است لازم باشد که پذیرش درخواستهای جدید متوقف شود تا منابع آزاد شوند.
مدیریت منابع
- بستن اتصالات: همهی اتصالات باز به پایگاههای داده و سوکتها باید بهصورت ایمن بسته شوند.
- آزادسازی حافظه: برنامه باید تمام حافظههای تخصیص دادهشده را آزاد کند تا از نشت حافظه جلوگیری شود.
ذخیرهسازی وضعیت
- ذخیرهسازی وضعیت برنامه: در برنامههای حالتگرا، وضعیت فعلی باید ذخیره شود تا در راهاندازی مجدد قابل بازیابی باشد.
- ثبت لاگها: ثبت وقایع و لاگهای مهم برای عیبیابی ضروری است.
هماهنگی با سرویسهای دیگر
- اطلاعرسانی به سرویسهای وابسته: اگر برنامه با سرویسهای دیگر تعامل دارد، باید به آنها اطلاع دهد که در حال خاموش شدن است تا آنها بتوانند اقدامات لازم را انجام دهند.
پیادهسازی در زبانهای مختلف
- جاوا: استفاده از Shutdown Hook برای اجرای کد لازم در زمان خاموشی.
- پایتون: استفاده از کتابخانه signal برای مدیریت سیگنالها و اجرای فرآیندهای نهایی.
- Node.js: مدیریت خاموشی با استفاده از رویدادهای process مانند SIGINT.
#gracefully_shutdown
@Syntax_fa2 989
polymorphism in relational database
این پست درباره یکی از مفاهیم ساده ای هستش که خیلی بدرد بخوره.
بیاید با مثال بررسی کنیم.
فرض کنید ما یک مدل order داریم که انواع مختلفی از محصولات رو میفروشیم.
برای مثال اشتراک میفروشیم که وقتی اشتراک رو میخرن به یه سری سرویس هامون دسترسی خواهند داشت.
در کنار اشتراک یک سری محصولات فیزیکی هم میفروشیم.
در کنار همه اینا یه سری خدمات دیگه هم داریم که پرداخت نیاز دارن.
خب شاید اولین چیزی که بهش فکر میکنیم این باشه بیایم داخل تیبل order فیلد هایی مثل plan و product و ... رو قرار بدیم بعد اگه هرکدوم null نبود یعنی order مربوط به اون خدمات یا محصول هستش:
CREATE TABLE order (
id INT PRIMARY KEY AUTO_INCREMENT,
...
plan_id INT NULL,
product_id INT NULL,
)
اما روش بهتر اینه بیایم دوتا فیلد به اسم type_name و type_id ذخیره کنیم. اگه type_name مثلا plan بود پس order مربوط به پلن با آیدی فلان هستش پس موقعی که خرید موفقیت آمیز بود میدونیم باید چه اکشنی داشته باشیم.
توسعه در آینده هم برامون خیلی راحت تر میشه بدون اینکه نیازی باشه تیبل order تغییری کنه.
#note
@Syntax_fa2 989
از اونجا که بچه های گروه زیادی از جنگو خوششون میاد، اینم چند تا نکته جنگویی(قسمت اول):
۱. چطور از ایمپورت circular تو مدل هامون جلوگیری کنیم؟
برای جلوگیری از این مشکل، جنگو برامون یه راه حل گذاشته. فرض کنید به یه مدل دیگه فارن کی زدید. بجای اینکه مستقیم ایمپورتش کنید. میایم داخل استرینگ بهش میگیم که به کدوم مدل فارن کی بخوره.
مثال:
app1/models.py
class ModelOne(models.Model):
...
app2/models.py
class ModelTwo(models.Model):
model_one = models.ForeignKey("app1.ModelOne")
2. مدل های داخل یک اپ رو بشکنید!
پیشنهاد اینه مدل های یک اپ خیلی زیاد نشه. اما اگه دلایل مشخصی دارید، بهتره مدل هارو داخل یک پکیج قرار بدید تا زیادی شلوغ نشه.
برای اینکار داخل اپ یک پکیج به اسم models میسازیم و داخل فایل های مختلف مدل هامون رو قرار میدیم. در نهایت داخل init ایمپورتشون میکنیم:
#### blog_app/models/__init__.py
from .comment import Comment
from .post import Post
#### blog_app/models/comment.py
class Comment(models.Model):
# comment fields
#### blog_app/models/post.py
3. کوئری هامون چقدر بهینه هستن؟
خب بیاید با نوشتن یدونه دکوریتور بررسی کنیم:
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
خروجی دکوریتور در دو حالت مختلف:
@database_debug
def regular_query():
blogs = models.Blog.objects.all()
return [blog.author.name for blog in blogs]
## OUTPUT
function_name: regular_query
query_count: 4
queries:
SELECT "blog_blog"."id", "blog_blog"."title",
"blog_blog"."content", "blog_blog"."author_id",
"blog_blog"."created_at", "blog_blog"."updated_at" FROM
"blog_blog"
SELECT "author_author"."id", "author_author"."name",
"author_author"."email", "author_author"."bio" FROM
"author_author" WHERE "author_author"."id" = 1 LIMIT 21
SELECT "author_author"."id", "author_author"."name",
"author_author"."email", "author_author"."bio" FROM
"author_author" WHERE "author_author"."id" = 2 LIMIT 21
SELECT "author_author"."id", "author_author"."name",
"author_author"."email", "author_author"."bio" FROM
"author_author" WHERE "author_author"."id" = 2 LIMIT 21
میبینیم که پدر دیتابیسو درآورده. ولی با استفاده از select_related تعداد کوئری ها از 4 تا به یکی میرسه.
پس همیشه از روش هایی استفاده کنید برای اینکه کوئری هایی که میزنید رو بررسی کنید.
#django
@Syntax_fa2 989
Foodanywhere
پروژه Foodanywhere یک پروژه food delivery جنگویی هستش.
- از Postgis برای ثبت اطلاعات جغرافیایی استفاده میکنه.
- این پروژه برای مانیتورینگ از prometheus استفاده میکنه.
- برای مدیریت لاگ ها از loki استفاده میکنه.
- برای دیپلویمنت از kubernetes استفاده میشه و برای ci/cd از github actions.
- اکثر بخش ها هم تست شده و تمامی تستا با pytest نوشته شدن
لطفاً نظراتتون رو جهت بهتر کردن پروژه، حتما در میون بذارید🙏
سورس کد پروژه:
(برای حمایت از محمد، استار فراموش نشه🍸)
https://github.com/mohamad-liyaghi/FoodAnywhere
#django #project
@Syntax_fa
2 989
در صدا و سیما چه میگذرد
اون دختره ندونه بازم منطقیه
ولی آخه جواب درست html ؟ 😠
#fun
@Syntax_fa
2 989
دنیای تکنولوژی و Buzzwordها: حقیقت پشت واژههای پر زرق و برق
در دنیای پر سرعت و پیچیده تکنولوژی، واژههای پر زرق و برق یا همان buzzwordها همواره نقش مهمی ایفا کردهاند. این واژهها اغلب به عنوان نمادهای نوآوری و پیشرفت معرفی میشوند، اما واقعیت این است که بسیاری از آنها چیزی جز بازتعریف مفاهیم قدیمی با نامهای جدید نیستند.
Buzzword
به واژه یا عبارتی گفته میشود که بهطور گسترده در رسانهها و گفتگوهای عمومی استفاده میشود و به نظر میرسد که نشاندهنده یک مفهوم جدید و پیشرفته است. این واژهها اغلب برای جلب توجه، ایجاد هیجان و فروش محصولات یا خدمات استفاده میشوند.
واژههای پر زرق و برق در صنعت تکنولوژی سابقه طولانی دارند. از دهه ۱۹۶۰ میلادی، وقتی که واژههایی مانند "cybernetics" و "artificial intelligence" برای اولین بار مطرح شدند، buzzwordها همواره بخشی از تبلیغات و بازاریابی تکنولوژی بودهاند.
چگونه Buzzwordها شکل میگیرند؟
1. بازتعریف مفاهیم قدیمی
بسیاری از buzzwordها در واقع چیزی جز بازتعریف مفاهیم قدیمی با نامهای جدید نیستند. برای مثال، مفهوم "cloud computing" در واقع بازتعریفی از ایده قدیمی "remote hosting" یا "shared services" است.
2. بازاریابی و تبلیغات
شرکتهای تکنولوژی اغلب از buzzwordها به عنوان ابزاری برای بازاریابی استفاده میکنند. این واژهها به ایجاد هیجان و جذب مشتریان جدید کمک میکنند. به عنوان مثال، واژه "Big Data" به مجموعه دادههای بزرگ اشاره دارد که نیاز به تحلیل پیچیده دارند، اما این مفهوم از دههها پیش وجود داشته است.
3. موجهای نوآوری
هرچند برخی buzzwordها تنها بازتعریفی از مفاهیم قدیمی هستند، اما برخی دیگر واقعاً نمایانگر نوآوریهای جدید هستند. به عنوان مثال، "Blockchain" یک تکنولوژی جدید است که واقعاً تغییرات بزرگی در حوزههای مختلف ایجاد کرده است.
تاثیرات Buzzwordها بر صنعت
1. ایجاد انتظارات غیرواقعی
یکی از مشکلات اصلی buzzwordها ایجاد انتظارات غیرواقعی است. مشتریان و کاربران ممکن است تصور کنند که یک فناوری جدید همه مشکلاتشان را حل میکند، اما در واقعیت، این فناوریها ممکن است محدودیتها و مشکلات خاص خود را داشته باشند.
2. سرمایهگذاریهای نادرست
شرکتها و سازمانها ممکن است به دلیل هیجان و تبلیغات پیرامون یک buzzword، سرمایهگذاریهای نادرستی انجام دهند. این سرمایهگذاریها ممکن است به نتایج مطلوب نرسند و منابع مالی و زمانی زیادی را هدر دهند.
ما برنامه نویسا وقتی با یه buzzword مواجه میشیم بهترین کار اینه اول به اندازه کافی تحقیق کنیم بعد اگه دیدیم واقعا ابزار و تکنولوژی بدرد بخوری برای کارمون هستش، بریم سمتش.
@Syntax_fa
2 989
زبون برنامه نویسیت پرحرفه یا کم حرفه ؟🤏
موقع صحبت از کد زبانهای برنامهنویسی، کلمات verbose و concise زیاد به گوشمان میخورند.
Verbose:
هرچقدر یک زبان برنامهنویسی بیشتر با شما حرف بزند، برای مثال برای انجام یک کار، استپهایی که طی کرده بیشتر در کد دیده شوند و بهصراحت نوشته شوند، آن زبان پرحرفتر است و به آن زبان verbose میگویند.
Concise:
از طرف دیگر، هرچقدر یک زبان برنامهنویسی برای انجام یک سری کارها، استپهایی که انجام شده کمتر در کد بیایند یا بهعبارتی ضمنی انجام شوند، به آن زبان کمحرف یا concise میگویند.
حالا یک مثال از نحوه خواندن خط به خط فایل در 🥰 و 🐍 ببینیم:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("example.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Println("Error reading file:", err)
}
}
بسیاری از استپها بهطور صریح در کد آمدهاند. فایل را باز میکنیم و یک اسکنر تعریف میکنیم و ...
حالا اگر میخواستیم از فایل بخوانیم و در یک متغیر بریزیم، باید درباره این تصمیم میگرفتیم که چطور انجامش دهیم. مثلاً یک آرایه خالی میسازیم، سپس حلقه میزنیم و یک آرایه با ظرفیت مشخص (مثلاً صد تا) تعریف میکنیم. سپس صد تا صد تا از فایل میخوانیم. چک میکنیم ببینیم تعداد بایتهایی که خواندیم چقدر بودهاند و به همان تعداد در آرایه نهایی میریزیم. اگر خطا از نوع End of File بود، یعنی بدون مشکل کل فایل را خواندهایم و...
خب حالا ببینیم در پایتون چطور خط به خط از فایل میخوانیم:
with open("example.txt", "r") as file:
for line in file:
print(line.strip())
در Python، تمام مراحل خواندن فایل بهطور خلاصه و با کد کمتری انجام میشود. فایل را با استفاده از with باز میکنیم که بهطور خودکار فایل را بعد از اتمام عملیات میبندد. سپس با یک حلقه for، خط به خط فایل را میخوانیم و چاپ میکنیم.
شما بگید زبونی که پرحرف باشه رو میپسندید یا زبونی که کم حرف باشه؟
@Syntax_fa2 989
تست سرعت serialization و deserialization جی سان در پکیج های پایتونی:
drf serializatio
Standard json serialization
Pydantic json serialization
Pydantic with ujson serilization
اگه بخوایم عادلانه بررسی کنیم. standard json رو میتونیم با ujson بررسی کنیم. مارشال کردن دیتا توی ujson تقریبا سه و نیم برابر سریع تر از standard json انجام میشه و عملیات unmarshal تقریبا یکونیم برابر توی ujson سریع تر انجام میشه.
همچنین pydantic با pydantic with ujson هم کمی با ujson بهتر عمل میکنه. اگه قراره از پایدانتیک استفاده کنید. بهتره برای json serialization کانفیگش رو روی ujson تنظیم کنید.
و اما نتیجه تست روی 100 هزار تا داده به چه صورت هستش:
DRF Deserialization: 27.931873083114624 .DRF Serialization: 20.0464129447937 .Pydantic Deserialization: 3.9613752365112305 .Pydantic Serialization: 1.3248841762542725 .Pydantic with ujson Deserialization: 3.9036169052124023 .Pydantic with ujson Serialization: 1.321913719177246 .Standard Deserialization: 0.6196784973144531 .Standard Serialization: 0.8552639484405518 .ujson Deserialization: 0.6136562824249268 .ujson Serialization: 0.2362501621246338و اما drf serilization چرا کند هستش؟ 1. معماری و پیچیدگی به دلیل یکپارچگی عمیق با Django و ویژگیهای متعدد، دارای لایههای مختلفی از انتزاع و پیچیدگی است. این امر باعث میشود که پردازشهای بیشتری برای هر درخواست انجام شود. Pydantic: به گونهای طراحی شده که ساده و سبک باشد، و بهینهسازیهای خاصی برای سرعت در آن انجام شده است. این کتابخانه از تایپهای پایتونی به صورت مستقیم استفاده میکند که باعث بهبود عملکرد میشود. 2. اعتبارسنجی دادهها اعتبارسنجی دادهها در DRF به صورت خودکار و با استفاده از روشهای مختلفی انجام میشود که شامل فیلترها، اعتبارسنجها و مبدلهای داده میشود. این فرایندها نیازمند زمان بیشتری برای پردازش هستند. Pydantic: از تایپهای پایتونی و انوتیشنها برای اعتبارسنجی دادهها استفاده میکند که کارایی بالاتری دارد. 3. مدیریت مدلها و QuerySetها DRF: به طور معمول با مدلهای Django و QuerySetها کار میکند که این خود به پیچیدگی و زمان پردازش اضافه میکند. Pydantic: به صورت مستقیم با دادههای ساده کار میکند و نیازی به پردازشهای اضافی مرتبط با QuerySetها ندارد. در نهایت باید بگیم برای بررسی کردن و بنچمارک گرفتن، باید تو شرایط واقعی تری انجام داد. سورس کد رو توی کامنت میذارم. #python #serialization @Syntax_fa
2 989
Gitmoji
وبسایت [Gitmoji](https://gitmoji.dev/) یک منبع آنلاین است که به توسعهدهندگان کمک میکند تا از ایموجیها در پیامهای کامیتهای خود استفاده کنند. این وبسایت مجموعهای از ایموجیها را فراهم میکند که هر یک به یک نوع تغییر یا فعالیت خاص در کد اشاره دارند. به عنوان مثال:
- 🐛: برای فیکس کردن باگها
- ✨: برای اضافه کردن یک ویژگی جدید
- 📝: برای بهروزرسانی مستندات
- 🎨: برای بهبود ساختار یا ظاهر کد بدون تغییر عملکرد
استفاده از Gitmoji باعث میشود که تاریخچه کامیتها خواناتر و قابل فهمتر شود و اعضای تیم توسعهدهنده بتوانند با نگاه به ایموجیها به سرعت متوجه نوع تغییرات اعمال شده شوند. این ابزار بهخصوص برای پروژههای متنباز و تیمهای بزرگی که بر روی یک کدبیس کار میکنند، مفید است.
مثال:
git commit -m ":bug: fix a bug"
#note #gitmoji
@Syntax_Fa2 989
هفت روش برای پیاده سازی dto ها در پایتون:
https://dev.to/izabelakowal/some-ideas-on-how-to-implement-dtos-in-python-be3
#python #dto
@Syntax_fa
2 989
GHOFLE
قفله یک پروژه اپن سورس جنگویی است.
تمرکز اصلی پروژه کار با AWS S3 و Authentication و Payment service هستش.
از اساتید و افراد باتجربه درخواست میکنم اگه میتونن یه نگاه به سورس کد پروژه بندازن و مشکلاتش رو تو کامنت همین پست یا پیوی بگن🙏
نهایت هدف اینه تبدیل به یه پروژه اپن سورس خوب بشه تا بدرد بقیه افراد بخوره
(همچنین اگه دوست دارید برای توسعه پروژه مشارکت داشته باشید، پیوی پیام بدید)
https://github.com/alireza-fa/ghofle
2 989
با پیشرفت فنّاوری و توسعه روزافزون استفاده از نرمافزارها و هوش مصنوعی، استفاده از ابزارها و مکانیزمهای مختلفی برای توسعهٔ سریع و باکیفیت نرمافزارها ضروری است. در این کتاب مجموعه مواردی بیان شده است که به معرفی و پیادهسازی این روشها میپردازند. چه برای افزایش دانش در حوزه نرمافزار و چه برای آشنایی با ابزارها و روشهای پیادهسازی نرمافزارهای مدرن و چه برای آمادگی برای مصاحبههای شغلی برای مهندسی نرمافزار، این کتاب برای شما بسیار مناسب است.
لینک دانلود کتاب
آدرس گیتهاب این کتاب برای بروزرسانیها
https://system-design.ir
Source:
@GoInsights
#book
@Syntax_fa
2 989
اگه کدی که مینویسی، این ویژگی هارو نداره، یه فکری به حال خودت کن 😔:
۱. کدتون مستقل از فریم ورک باشه:
معماری شما نباید وابسته به یه فریم ورک خاص باشه.
کدتون این امکانو بده از فریم ورک ها مثل ابزار ها استفاده کنید بدون اینکه وابسته به محدودیت های یک فریم ورک خاص بشید.
۲. کدتون قابل تست کردن باشه:
قابل تست بودن به این معنیه که بتونید business logic هارو بدون یو آی، دیتابیس، وب سرور یا هر چی وابستگی خارجی که هست، تست کنید.
۳. نباید به ui وابستگی داشته باشید!
قسمت ui رو باید بتونید به راحتی جایگزینش کنید.
مثلا از یک وب ui بتونید بدون اینکه قسمت های دیگه کدتون تغییره کنه، به کنسول و برنامه cli تغییرش بدید.
۴. معماریتون باید مستقل از دیتابیس باشه!
برای مثال: میتونید دیتابیستون رو به راحتی از mysql به mongodb تغییر بدید؟
۵. نباید به یک سرویس خارجی وابستگی داشته باشید!
برای مثال اگه از سرویس اس ام اس استفاده میکنید، آیا میتونید به راحتی بجای کاوه نگار از یه سرویس دیگه استفاده کنید؟
منبع:
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
#note
@Syntax_fa
2 989
از اونجا که بعضیاتون گفتید چرا همش درباره سی شارپو پی اچ پی میم میذاری. اینم یه میم درباره پایتون
#fun
@Syntax_fa
2 989
سوال مصاحبه جنگویی:
سطح: سخت
تو جنگو میخوایم هر درخواست HTTP رو بصورت خودکار توی یک تراکنس دیتابیس قرار بگیره. یعنی اگه هرکدوم از عملیات های دیتابیس در طول پردازش یک درخواست HTTP با خطا مواجه بشه، تموم تغییراتی که توی دیتابیس اعمال شده rollback شه.
بنظرت چیکار میتونیم بکنیم؟
قبل اینکه جوابو ببینی یکم فکر کن یا سرچ کن:
و اما جواب:
میتونیم با اضافه کردن این خط تو settings.py این قابلیت رو اضافه کنیم:
DATABASES["default"]["ATOMIC_REQUESTS"] = True
اگه فقط بخوایم تو ویو های خاصی atomic requets رو داشته باشیم چیکار میتونیم؟
و جواب این سوال:
میتونیم از دکوریتور atomic استفاده کنیم:
from django.db import transaction
from django.views import View
class MyView(View):
@transaction.atomic
def get(self, request, *args, **kwargs):
...
#interview_question #django
@Syntax_fa2 989
SECURE_PROXY_SSL_HEADER در Django انتظار یک تاپل با دو عنصر را دارد، نام سرصفحه برای جستجو و مقدار مورد نیاز.
برای پاسخگویی به این نیاز، تابع config یک آرگومان cast را میپذیرد که هر callable را دریافت میکند و از آن برای تبدیل مقدار رشتهای به چیز دیگری استفاده میکند.
بیایید چند مثال برای موارد ذکر شده ببینیم:
>>> os.environ['DEBUG'] = 'False'
>>> config('DEBUG', cast=bool)
False
>>> os.environ['EMAIL_PORT'] = '42'
>>> config('EMAIL_PORT', cast=int)
42
>>> os.environ['ALLOWED_HOSTS'] = '.localhost, .herokuapp.com'
>>> config('ALLOWED_HOSTS', cast=lambda v: [s.strip() for s in v.split(',')])
['.localhost', '.herokuapp.com']
>>> os.environ['SECURE_PROXY_SSL_HEADER'] = 'HTTP_X_FORWARDED_PROTO, https'
>>> config('SECURE_PROXY_SSL_HEADER', cast=Csv(post_process=tuple))
('HTTP_X_FORWARDED_PROTO', 'https')
همانطور که میبینید، cast بسیار انعطافپذیر است. اما مثال آخر کمی پیچیده شد.
#python_decouple
@Syntax_fa2 989
پکیج `python-decouple`
یک ابزار مفید برای جداسازی تنظیمات و پیکربندیهای پروژههای پایتون است. این کار باعث میشود که کد شما از وابستگیهای محیطی جدا باشد و تنظیمات را به راحتی تغییر دهید بدون اینکه نیاز به تغییر در کد داشته باشید. این پکیج به خصوص برای مدیریت متغیرهای محیطی و تنظیمات حساس مانند کلیدهای API، اطلاعات پایگاه داده و غیره بسیار مفید است.
ویژگیها
- مدیریت متغیرهای محیطی: متغیرهای محیطی را از فایل
.env بارگذاری میکند.
- پشتیبانی از انواع دادهها: قابلیت تبدیل مقادیر متغیرها به انواع دادهای مختلف مانند int`، `float`، `bool و ...
- مقدار پیشفرض: امکان تعریف مقادیر پیشفرض برای متغیرهایی که ممکن است در محیط تنظیم نشده باشند.
نصب
برای نصب پکیج python-decouple میتوانید از دستور زیر استفاده کنید:
pip install python-decouple
نحوه استفاده
1. ایجاد فایل `.env`:
ابتدا یک فایل با نام .env در ریشه پروژه خود ایجاد کنید و تنظیمات مورد نظر خود را در آن وارد کنید. برای مثال:
DEBUG=True
SECRET_KEY=mysecretkey
DATABASE_URL=postgres://user:password@localhost:5432/mydatabase
2. استفاده از `config` در کد پایتون:
در کد پایتون خود، پکیج decouple را وارد کرده و از Config استفاده کنید:
from decouple import config
DEBUG = config('DEBUG', default=False, cast=bool)
SECRET_KEY = config('SECRET_KEY')
DATABASE_URL = config('DATABASE_URL')
3. توضیحات بیشتر:
- config('DEBUG', default=False, cast=bool):
این خط مقدار متغیر DEBUG را از فایل .env میخواند و آن را به نوع bool تبدیل میکند. اگر این متغیر در فایل .env موجود نباشد، مقدار پیشفرض False استفاده میشود.
- config('SECRET_KEY'):
این خط مقدار متغیر SECRET_KEY را از فایل .env میخواند.
- config('DATABASE_URL'):
این خط مقدار متغیر DATABASE_URL را از فایل .env میخواند.
مثال کامل
فرض کنید یک پروژه ساده دارید که از Flask استفاده میکند و میخواهید تنظیمات خود را با استفاده از python-decouple مدیریت کنید.
1. ایجاد فایل `.env`:
DEBUG=True
SECRET_KEY=mysecretkey
DATABASE_URL=sqlite:///mydatabase.db
2. کد پایتون:
from flask import Flask
from decouple import config
app = Flask(__name__)
app.config['DEBUG'] = config('DEBUG', default=False, cast=bool)
app.config['SECRET_KEY'] = config('SECRET_KEY')
app.config['SQLALCHEMY_DATABASE_URI'] = config('DATABASE_URL')
@app.route('/')
def home():
return "Hello, World!"
if __name__ == '__main__':
app.run()
این کد یک برنامه ساده Flask ایجاد میکند که تنظیمات خود را از فایل .env میخواند. با این کار، میتوانید به راحتی تنظیمات خود را تغییر دهید بدون اینکه نیاز به تغییر در کد داشته باشید.
——————————————————-
توضیحات بیشتر برای علاقه مندان😏:
چگونه کار میکند؟
Decouple همیشه گزینهها را به این ترتیب جستجو میکند:
متغیرهای محیطی؛
Repository: فایل ini یا .env؛
آرگومان پیشفرض که به config ارسال شده است.
چهار کلاس جادوی این کار را انجام میدهند:
Config
هماهنگی تمام بازیابیهای تنظیمات.
RepositoryIni
میتواند مقادیر را از os.environ و فایلهای ini بخواند، به همین ترتیب.
نکته: از نسخه 3.0 به بعد، decouple ترتیب اولویت متغیرهای محیطی یونیکس نسبت به فایلهای تنظیمات را رعایت میکند.
RepositoryEnv
میتواند مقادیر را از os.environ و فایلهای .env بخواند.
نکته: از نسخه 3.0 به بعد، decouple ترتیب اولویت متغیرهای محیطی یونیکس نسبت به فایلهای تنظیمات را رعایت میکند.
AutoConfig
این یک کارخانه Config تنبل است که تشخیص میدهد کدام مخزن تنظیمات را استفاده میکنید.
به صورت بازگشتی مسیر ماژول تنظیمات شما را جستجو میکند تا فایل settings.ini یا .env را پیدا کند.
به صورت اختیاری، آرگومان search_path را میپذیرد تا صریحاً تعیین کند جستجو از کجا شروع شود.
شیء config یک نمونه از AutoConfig است که یک Config با مخزن مناسب را در اولین باری که استفاده میشود، ایجاد میکند.
درک آرگومان CAST
به صورت پیشفرض، همه مقادیری که توسط decouple بازگردانده میشوند رشتهای هستند، زیرا آنها از فایلهای متنی یا envvars خوانده میشوند.
با این حال، کد پایتون شما ممکن است انتظار نوع داده دیگری را داشته باشد، برای مثال:
DEBUG در Django انتظار یک مقدار بولی True یا False دارد.
EMAIL_PORT در Django انتظار یک عدد صحیح را دارد.
ALLOWED_HOSTS در Django انتظار یک لیست از نامهای میزبان را دارد.
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
