es
Feedback
Syntax | سینتکس

Syntax | سینتکس

Ir al canal en Telegram
2 984
Suscriptores
+724 horas
+137 días
+3230 días
Archivo de publicaciones
کتاب django in production رو دادم به notebook llm و یه پادکست ساخته برامون که این کتاب درمورد چیا صحبت میکنه و یه دید کلی میده نسبت به کتاب. @normal_developer

https://flutter-tutorial-b68fa.web.app/ سلام دوستان خسته نباشید لطفا با اعداد ارقام بگید سرعت لود وبسایت چقدره نتتون هم درست باشه

پست موقت : سلام روز همگیتون بخیر باشه رفقا . لطفا به لینک زیر برید و سرعت لود شدن وبسایت بار اول و بار دوم رو زیر پست کامنت کنید . دم همتون گرم🔥 https://flutter-tutorial-b68fa.web.app/

⭐️ بنیاد دیسترو | حامی جهان اپن سورس دیسترو یک بنیاد برای حمایت از دنیای متن‌باز است که به تولید و نظارت بر پروژه‌های مفید بر
⭐️ بنیاد دیسترو | حامی جهان اپن سورس دیسترو یک بنیاد برای حمایت از دنیای متن‌باز است که به تولید و نظارت بر پروژه‌های مفید برای جوامع توسعه‌دهنده در سراسر جهان می‌پردازد. با ایجاد ایده‌های جدید، پیاده‌سازی ایده‌های مختلف، و انتشار رایگان آن‌ها در جهان، دیسترو گامی در جهت توسعه جوامع متن‌باز ایران برداشته است. بزودی دیسترو در کنار شما عزیزان فعالیت خود را گسترده‌تر خواهد کرد. جهت اطلاعات بیشتر به گیتهاب دیسترو مراجعه و اساسنامه بنیاد را مطالعه نمایید. @DistroFDN github.com/distrofdn/distrofdn #open_source @Syntax_fa

انتخاب شما کدومه ؟
Anonymous voting

فرانت اند (۲): توضیحات : Design size: 1440 x 1024 Desktop size : 1366 x 738 توی این دیزاین هم برخی آیتم هارو scale کردیم اما تفاوت قابل توجه در فونت ها و ویجت هایی که parent فونت ها هستن وجود داره . ما تو این دیزاین size فونت هارو برای تمام desktop size ها ثابت قرار دادیم و مقدار ویجت والد رو بر اساس padding فونت ها بدست آوریم که خروجی شده این ویدیو

فرانت اند (۲): توضیحات : Design size: 1440 x 1024 Desktop size : 1366 x 738 توی این دیزاین هم برخی آیتم هارو scale کردیم اما تفاوت قابل توجه در فونت ها و ویجت هایی که parent فونت ها هستن وجود داره ما تو این دیزاین size فونت هارو برای تمام desktop size ها ثابت قرار دادیم و مقدار ویجت والد رو بر اساس padding فونت ها بدست آوریم که خروجی شده این ویدیو

فرانت اند (۱) توضیحات : رفقا دیزاین سایز هر دو فرانت اند 1440 در 1024 هست ، اندازه desktop که فرانت اند نشون میده ۱۳۶۶ در ۷۳۸ هست . اینجا برای اینکه آیتم ها ظاهر خودشون رو در هر نوع desktop حفظ کنه از scale کردن استفاده کردیم (بعضی جاها کل آیتم scale شده ، بعضی جاها برخی قسمت ها) . طراحی فونت ها براساس متریال دیزاین هست و چون desktop ما از design size کوچیک تره ،برای اینکه ظاهر مینیمال و جذاب خودشو حفظ کنه از تمام فونت ها 2px کم کردیم و خروجی نهایی این شده

فرانت اند (۱) توضیحات : رفقا دیزاین سایز هر دو فرانت اند 1440 در 1024 هست ، اندازه desktop که فرانت اند نشون میده ۱۳۶۶ در ۷۳۸ هست . اینجا برای اینکه آیتم ها ظاهر خودشون رو در هر نوع desktop حفظ کنه از scale کردن استفاده کردیم (بعضی جاها کل آیتم scale شده ، بعضی جاها برخی قسمت ها) . طراحی فونت ها براساس متریال دیزاین هست و چون desktop ما از design size کوچیک تره ،برای اینکه ظاهر مینیمال و جذاب خودشو حفظ کنه از تمام فونت ها 2px کم کردیم و خروجی نهایی این شده

شب همگی سینتکسیا خوش باشه😉 بطور خیلی خلاصه اول ازتون میخوام که با دقت از این دو تا ویدیو فرانت اند وبسایت syntax دیدن کنید و انتخاب خودتون بهمون بگید که کدوم یکی از لحاظ تناسب و سایز ویجت ها و فونت ها به نسبت desktop بردیگری برتری داره؟ (جزئیات هر فرانت رو زیر ویدیو درج میکنم)

نکات مهم اجرای جنگو با Gunicorn توضیح درباره Gunicorn نمیخوام توضیحات زیادی بدم حوصلتون سر بره پس همون سه خط معرفی که تو وب سایت gunicorn نوشته رو براتون یکم شفافش میکنم: اسمش مخفف green unicorn هستش جی یونیکورن یک http سرور هستش که از استاندارد WSGI(Web server gateway interface) برای اجرای برنامه های وب پایتون استفاده میکنه. استاندارد WSGI برای این بوجود اومد تا هر فریم ورک وب پایتونی روش خودشو واسه ارتباط پیاده نکنه و همه از یه استاندارد مشخص استفاده کنن. در ادامه میگه gunicorn برای unix هستش و برای سیستم عامل هایی مثل مک و لینوکس طراحی شده. بعدش میگه که جی یونیکورن از مدل pre-fork worker استفاده میکنه حالا این به چه معنیه؟ جی یونیکورن کاری که میکنه اینه قبل اینکه شروع به پردازش درخواست ها کنه، میاد و به اندازه ای که تنظیم کردید worker ایجاد میکنه که هر worker درخواست هارو بطور مستقل پردازش میکنه. بعدشم میگه با فریم ورک های وب مختلفی سازگاره که اینم میتونیم دلیلش رو این بدونیم داره برای ارتباط از استاندارد WSGI استفاده میکنه. قسمت آخرشم میگه light resource هستش و منابع کمی مصرف میکنه همچنین برای ترافیک بالا عملکرد خوبی داره. خب جی یونیکورن این ادعا هارو میکنه اما بیاید با چند تا مثال شرایطی رو بررسی کنیم که شما به غلط دارید از جی یونیکورن استفاده میکنید: مثال اول
gunicorn --chdir config config.wsgi:application -b 0.0.0.0:8000
اگه با این دستور جی یونیکورن رو اجرا کنید باید به این نکته دقت کنید بصورت پیشفرض براتون فقط یدونه worker میسازه که این اصلا خوب نیست. خود جی یونیکورن پیشنهاد میده حتی اگه یدونه core دارید 4 تا ورکر بسازید و یه فرمولی هم داده که میگه«تعداد هسته های سی پی یو رو ضربدر 2 به علاوه یک کنید» همچنین به شما اطمینان داده همین تعداد ورکر هزاران ریکوئست رو میتونن پاسخ بدن پس تعداد ورکر هارو الکی زیادش نکنید. البته به کیس شما هم بستگی داره. دستور بهتر برای اجرا اینه تعداد ورکر هارو مشخص کنیم:
gunicorn --workers 5 --chdir config config.wsgi:application -b 0.0.0.0:8000
مثال دوم: فرض کنید کاربر ها تو اپلیکیشن شما فایل هایی رو آپلود میکنن. شما پنج تا ورکر دارید. وقتی پنج تا کاربر همزمان فایل آپلود کنن بنظرتون چه اتفاقی میوفته؟ پنج تا ورکر شما گیر یه io افتادن و مشغولن و درخواست های دیگه کاربرا انجام نمیشه. خب این وضعیتی نیست که باب میلیتون باشه! برای حل این مشکل کافیه از gevent توی جی یونیکرون استفاده گنید؛
gunicorn --workers 1 -k gevent --chdir config config.wsgi:application -b 0.0.0.0:8000
با فلگ -k نوع کلاس ورکر رو مشخص میکنیم. حالا چرا از gevent استفاده میکنیم؟ کتابخونه gevent برای مدریریت همزمانی طراحی شده. میشه گفت یک نمونه lightweight thread هستش که این مدل موقع عملیات های IO سوئیچینگ انجام میده و در این صورت اگه به io خوردید براتون هندل میکنه. کلی نکات دیگه هم قطعا هست که تو یه پست جا نمیشه امیدوارم براتون مفید باشه #python #django #gunicorn #gevent @Syntax_fa

Django Serializers: Related Fields in Serializer وقتی با مدل‌های مرتبط در Django کار می‌کنیم، نمایش اطلاعات کامل آن‌ها در سریالایزرها می‌تواند چالش‌برانگیز باشد. خوشبختانه، Django REST Framework (DRF) ابزارهای قدرتمندی برای این کار در اختیار ما قرار می‌دهد. سریالایزر DRF به‌طور پیش‌فرض برای فیلدهای مرتبط در هنگام سریال‌سازی داده‌ها از مقدار primary key استفاده می‌کند. به عنوان مثال:
class Author(models.Model):
    name = models.CharField()
    last_name = models.CharField()

class Blog(models.Model):
    title = models.CharField()
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

class BlogSerializer(serializers.ModelSerializer):
    class Meta:
        model = Blog
        fields = "__all__"
خروجی BlogSerializer به شکل زیر خواهد بود:
{
    "title": "black python",
    "author": 3
}
حالا اگر بخواهیم به جای PK، اطلاعات اضافی از Author نمایش دهیم، چند راه حل وجود دارد: ▎1. استفاده از depth: با تنظیم پارامتر 1 = depth در Meta کلاس سریالایزر، می‌توانید مشخص کنید که تا چه عمقی از روابط مدل‌ها سریالایز شوند. این روش ساده و سریع است، اما کنترل کمتری بر روی داده‌های خروجی به شما می‌دهد.
class BlogSerializer(serializers.ModelSerializer):
    class Meta:
        model = Blog
        depth = 1
خروجی BlogSerializer به شکل زیر خواهد بود:
{
    "title": "python black",
    "author": { "name": "amirhossein", "id": 1, "last_name": "some last name" }
}
2. استفاده از Nested Serializers: با تعریف سریالایزرهای تو در تو، می‌توانید کنترل کاملی بر روی فیلدهایی که می‌خواهید از مدل‌های مرتبط نمایش دهید داشته باشید. این روش انعطاف‌پذیرتر است، اما نیاز به نوشتن کد بیشتری دارد , مثال:
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = ("name",)

class BlogSerializer(serializers.ModelSerializer):
    author = AuthorSerializer()

    class Meta:
        model = Blog
        fields = "__all__"
خروجی به شکل زیر خواهد بود:
{
    "title": "black python",
    "author": { "name": "amirhossein" }
}
مشکل N + 1 در هنگام استفاده از Depth یا Nested Serializer: حتما باید در queryset خود از select_related یا prefetch_related استفاده کنید تا از بروز مشکل N + 1 جلوگیری کنید! ▎Django Serializers: Validators 1 : field level validators برای اعتبار سنجی داده ها در سطح فیلد در drf باید از دستور زیر پیروی کنید:
class BlogSerializer(serializers.ModelSerializer):
        ....
       def validate_<field name>(self, value): # validate_email
               if vlaue in "_" :
                       serializers.ValidationError("some error")
               return value
2 : object level validator
class BlogSerializer(serializers.ModelSerializer):
     ....
     def validate(self, attrs):
          if attrs.name == attrs.title :
               serializers.ValidationError("name and title can not be same")
          return value
Django Serializers: to_internal_value متود to_internal_value در ModelSerializer قبل از اجرای اعتبارسنجی داده ها به داده های خام دسترسی دارد و میتوانید برای تغییر داده ها یا اضافه کردن داده ها قبل از اعتبارسنجی از اون استفاده کنید:
class BlogSerializer(serializers.ModelSerializer):
    ....
    def to_internal_value(self, data):
          data["user"] = self.context["user"]  # افزودن شی user به data
          return super().to_internal_value(data)
نکته: اقا حتما موقع return از super().to_internal_value(data) استفاده کنید و return data استفاده نکنید ; چون اینطوری باعث میشه تمام validatorهای modelSerializer که از روی مدل شما بطور پیشفرض ساخته شده , غیرفعال بشن! ▎Django Serializers: to_representation ما میتوانیم این رو ش را override کنیم تا قبل از داده های سریالی که نمونه سریالسازبر میگرداند، دستکاری داده ها را انجام دهیم , مثال:
class BlogSerializer(serializers.ModelSerializer):
    ....
    def to_representation(self, instance):
         resp = super().to_representation(instance)
         resp['title'] = resp['title'].upper()
         return resp
برای اطلاعات بیشتر به کتاب :django in production مراجعه کنید.

📊 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"."title", "blog_blog"."content", "blog_blog"."author_id"
💡 توضیح کد: با استفاده از دستور reset_queries تمام پرس‌وجوهای ذخیره شده در connection را حذف می‌کنیم تا فقط کوئری‌های خواسته شده دیباگ شوند. سپس کوئری‌های داخل inner_function که دکوراتور شده‌اند اجرا می‌شوند و شی connection حاوی لیست از پرس‌وجوها می‌شود. بعد از آن، تمام پرس‌وجوها را از connection.queries بازیابی می‌کنیم. 🔗 منبع : کتاب django in productions

زمانی که داشتم این کدارو میزدم فقط منو خدا میدونستیم چی به چیه ولی الان فقط خدا میدونه🥹 پ.ن: وقتی بعد چند وقت رو پروژه های ق
زمانی که داشتم این کدارو میزدم فقط منو خدا میدونستیم چی به چیه ولی الان فقط خدا میدونه🥹 پ.ن: وقتی بعد چند وقت رو پروژه های قدیمت برمیگردی #fun @Syntax_fa

.

برای آشنایی بیشتر یه مثال هم اضافه کنم: اگر از 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

ارور ثروتمند و یا 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

این فایله آپدیت نیست. از این ریپوزیتوری استفاده کنید به فرمت های مختلف و بروز گذاشته: https://github.com/sajaddp/list-of-cities-in-Iran

لیست شهر های هر استان ممکنه بکارتون بیاد یجا ذخیرش کنید. source @Syntax_fa

Repost from N/a
🎨 برنامه نویســی | چنل مخصوص توسعه دهندگان و برنامه نویسان❤️‍🩹 💼 مهارت های نرم و پیشرفت شغلی 📚 مقاله و اخبار جذاب برنامه‌
🎨 برنامه نویســی | چنل مخصوص توسعه دهندگان و برنامه نویسان❤️‍🩹
💼 مهارت های نرم و پیشرفت شغلی
📚 مقاله و اخبار جذاب برنامه‌نویسی 
🌐 معرفی ابزار، منابع مفید و کاربردی
📊 کوئیز ها و چالش های کدنویسی
🚀 | 𝗖𝗵𝗮𝗻𝗻𝗲𝗹 : @DevChannel_IR 💭 | 𝗚𝗿𝗼𝘂𝗽 : @DevChat_IR ➖➖➖➖➖➖➖➖➖➖➖