CodeCrafters
765 subscribers
91 photos
50 videos
42 files
170 links
Download Telegram
حالا اگر بخواید تو کلاس کاستوم خودتون داک تایپینگ رو پیاده سازی کنید دو روش وجود داره
1. Regular methods
که دقیقا همون مثال پرنده ای که زدیم در بالا از همین روش استفاده شده ولی اگر بخوایم یک مثال کاربردی تر بزنیم میتونیم فرض کنیم میخوایم چند کلاس بسازیم واسه خواندن انواع فایل های csv, json, txt خب میایم سه تا کلاس میسازیم و واسه هر کدوم یک متد با نام مشابه برای خواندن فایل و یک اتریبیوت با نام مشابه نیز میسازیم، اینطوری یک اینترفیس یکسان و مشترک برای کلاس های مختلف با ساز و کار مختلف داریم. به راحتی میتونیم چند ابجکت مختلف از این کلاس ها بسازیم و با یک حلقه فور میتونیم از متد خواندن استفاده کنیم.

2. Special methods
اسپشیال متد ها یا همون داندر متد ها، با دوتا اندراسکور در اول و اخر نامشون مشخص میشوند و معنای خاصی برای پایتون دارند.
بیاید فرض کنیم میخوایم یک صف )queue( درست کنیم
و میخوایم که صف ما iterable باشه و همچنین بتونیم از
Len, reversed , in استفاده کنیم
خب کد ما به به این شکل خواهد شد :
from collections import deque

class Queue:
def __init__(self):
self._elements = deque()

def enqueue(self, element):
self._elements.append(element)

def dequeue(self):
return self._elements.popleft()

def __iter__(self):
return iter(self._elements)

def __len__(self):
return len(self._elements)

def __reversed__(self):
return reversed(self._elements)

def __contains__(self, element):
return element in self._elements

خب تو این کلاس ما دوتا عملیات کلاسیک اضافه کردن به صف و حذف کردن از صف رو داریم و همچنین چند داندر متد برای کلاس پیاده سازی کردیم تا عملیات های مورد نیاز مارو پشتیبانی کنه.
>>> from queues import Queue

>>> queue = Queue()
>>> queue.enqueue(1)
>>> queue.enqueue(2)
>>> queue.enqueue(3)

>>> [item for item in queue]
[1, 2, 3]

>>> len(queue)
3
>>> list(reversed(queue))
[3, 2, 1]

>>> 2 in queue
True
>>> 6 in queue
False
میبینید که تمام عملیات های مورد نیاز مارو به خوبی انجام میده.
منبع
#duck_typing
#type_system

#reall_python

@code_crafters
👍4💋21
دوستان عزیز داریم یه گروه جمع میکنیم که صفحات و مطالب سایت reall python رو ترجمه کنیم به زبان فارسی


اگه کسانی تمایل به همکاری دارن بهم پیام بدن که بتونیم تو این عید صفحات بیشتر و کل سایت رو ترجمه کنیم کنار هم در نهایت بعد از اتمام سایت رو بالا میاریم و اسامی افراد شرکت کننده در ترجمه صفحات هم داخلش میزاریم


یک اینکه این موضوع منجر میشه که با پایتون بیشتر آشنا بشید
ماژول‌ها و موارد بیشتری از پایتون رو بشناسید
و اینکه بعنوان یک کار در جامعه فارسی زبان ازتون باقی خواهد مونده
👍9
5-بررسی سلامت داکرفایل
اجرای چک های سلامت مستقیماً در داکرفایل روشی قدرتمند برای نظارت خودکار بر وضعیت عملیاتی کانتینرهای شما است. با تعریف بررسی های بهداشتی، داکر می تواند تصمیمات آگاهانه ای در مورد سلامت کانتینرها بگیرد و اقدامات مناسب را انجام دهد، مانند راه اندازی مجدد کانتینر معیوب یا جلوگیری از هدایت ترافیک به آن تا زمانی که سالم شود


بررسی سلامت داکرفایل چیست
بررسی سلامت داکر دستوری است که در داکرفایل مشخص شده است که داکر به صورت دوره ای برای بررسی سلامت یک کانتینر اجرا می کند. این دستور باید نشان دهد که آیا کانتینر به درستی کار می کند یا خیر، داکر وضعیت خروج از فرمان بررسی سلامت را برای تعیین وضعیت سلامت کانتینر تفسیر می کند: وضعیت خروج 0 به معنای سالم و غیر صفر به معنای ناسالم است

چگونه از بررسی سلامت داکرفایل استفاده کنیم
بررسی های سلامت در داکرفایل با استفاده از دستورالعمل HEALTHCHECK تعریف شده است. می‌توانید دستور اجرا، فاصله بین بررسی‌ها، زمان پایان هر چک، تعداد دفعات تکرار قبل از در نظر گرفتن سرویس ناسالم، و دوره شروع برای تثبیت کانتینر قبل از شروع بررسی‌های سلامت را مشخص کنید


نمونه داکرفایل با بررسی سلامت
این مثال یک بررسی سلامتی را روی ظرف Nginx تنظیم می‌کند و از curl برای درخواست صفحه اصلی هر 30 ثانیه استفاده می‌کند. اگر دستور سه بار پشت سر هم ناموفق باشد (صفحه به درستی برگردانده نشده است)، داکر ظرف را به عنوان ناسالم علامت گذاری می کند
Dockerfile
FROM nginx:latest


COPY nginx.conf /etc/nginx/nginx.conf

# Health check script
COPY health-check.sh /usr/share/nginx/html/health-check.sh

# Make the script executable
RUN chmod +x /usr/share/nginx/html/health-check.sh


EXPOSE 80

# Health check definition
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD /usr/share/nginx/html/health-check.sh

health-check.sh
#!/bin/bash


if curl -sSf https://localhost:80 > /dev/null; then
exit 0
else
exit 1
fi
چه وقتی از بررسی سلامت کانتینر استفاده کنیم
در دسترس بودن سرویس: زمانی که باید اطمینان حاصل کنید که یک سرویس در یک کانتینر در دسترس است و قبل از ارسال ترافیک به آن پاسخگو است

آمادگی وابستگی: در کاربردهای چند کانتینری، که در آن کانتینرهای خاصی به عملکرد کامل سایر کانتینرها بستگی دارند

سیستم های خود درمانی: برای ایجاد یک سیستم انعطاف پذیرتر که می تواند به طور خودکار ظروف ناسالم را راه اندازی مجدد کند

بهترین رویکرد
به حداقل رساندن تأثیر عملکرد: اطمینان حاصل کنید که دستور بررسی سلامت سبک است و تأثیر قابل توجهی بر عملکرد ظرف ندارد

دوره‌های شروع دقیق: یک دوره شروع واقعی را تنظیم کنید تا قبل از شروع شکست در بررسی‌های سلامت، زمان کافی برای شروع اولیه به برنامه خود بدهید

از نقاط پایانی سلامت خاص استفاده کنید: ترجیح می‌دهید از نقاط پایانی خاص (به عنوان مثال، /healthz) استفاده کنید که سلامت اجزای مختلف برنامه را بررسی می‌کند، نه فقط صفحه اصلی یا یک بررسی اولیه TCP

دام‌های رایج
دستورات پیچیده: از دستورات بیش از حد پیچیده بررسی سلامت که ممکن است غیرقابل اعتماد باشند یا عوارض جانبی غیرمنتظره ایجاد کنند، خودداری کنید

نادیده گرفتن وابستگی های خارجی: اگر سلامت کانتینر شما به خدمات خارجی بستگی دارد، مطمئن شوید که بررسی سلامت شما در دسترس بودن آنها را در نظر می گیرد و از مثبت کاذب جلوگیری می کند


یک نمونه برای داکرفایل جنگو
#----
# Use an official Python runtime as a parent image
FROM python:3.8

# Set environment variables
ENV PYTHONUNBUFFERED 1

# Set working directory
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed dependencies specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Expose port 8000 to the outside world
EXPOSE 8000

# Define the health check command
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl --silent --fail localhost:8000/health-check || exit 1

# Run the Django application
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

#---


یک نمونه در داکرکامپوز
#---
version: '3'

services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:8000"
restart: on-failure
healthcheck:
test: ["CMD-SHELL", "curl --silent --fail localhost:8000/health-check || exit 1"]
interval: 5s
timeout: 3s
retries: 3
#---


لینک وبسایت

#docker

@code_crafters
6-قالب بندی خروجی داکر CLI
رابط خط فرمان داکر (CLI) یک ویژگی قدرتمند برای سفارشی کردن خروجی دستورات با استفاده از گزینه formating-- فراهم می کند.این گزینه از زبان الگوی Go استفاده می کند تا به کاربران اجازه دهد دقیقاً نحوه ساختار خروجی را مشخص کنند و تجزیه یا ادغام با ابزارهای دیگر را آسان تر می کند

قالب بندی خروجی داکر CLI چیست
قالب‌بندی خروجی داکر CLI به شما امکان می‌دهد تا خروجی دستورات Docker را مطابق با نیازهای خود تنظیم کنید، با استفاده از زبان قالب Go برای تعیین فرمت خروجی. این ویژگی برای استخراج قطعات خاصی از اطلاعات از خروجی‌های فرمان پرمخاطب داکر، به‌ویژه هنگام خودکارسازی وظایف یا ادغام با خطوط لوله CI/CD بسیار ارزشمند است

چگونه از قالب بندی خروجی داکر CLI استفاده کنیم
فاگ format-- را می توان با دستورات مختلف داکر CLI برای سفارشی کردن خروجی آنها استفاده کرد.در اینجا مثالی از نحوه فهرست کردن همه شناسه‌های کانتینر با استفاده از قالب سفارشی آورده شده است:
docker ps --format '{{.ID}}'

این دستور شناسه‌های همه کانتینرهای در حال اجرا را، یکی در هر خط، بدون هیچ گونه اطلاعات یا هدر اضافی فهرست می‌کند

مثال پیشرفته: فهرست کردن تصاویر با ویژگی های خاص
در اینجا نحوه فهرست کردن تصاویر، نشان دادن تنها مخزن، برچسب و اندازه آنها در قالب جدول آمده است:
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

این دستور یک جدول با فرمت منظم از تصاویر Docker شما ایجاد می کند که فقط نام مخزن، برچسب و اندازه تصویر را نشان می دهد


چه وقتی از قالب بندی خروجی داکر CLI استفاده کنیم
اسکریپت و اتوماسیون: زمانی که نیاز به تجزیه خروجی های دستور Docker در اسکریپت ها یا ابزارهای اتوماسیون دارید

گزارش سفارشی: ایجاد گزارش یا داشبورد سفارشی که به اطلاعات خاصی از محیط Docker شما نیاز دارد

خروجی ساد: زمانی که می خواهید خروجی را برای وضوح ساده یا تمرکز بر جزئیات خاص ساده کنید

بهترین رویکرد
الگوسازی Go را درک کنید: برای استفاده مؤثر از گزینه‌های قالب‌بندی، با نحو قالب‌بندی Go آشنا شوید

از قالب بندی جدول برای خوانایی استفاده کنید: از قالب بندی جدول برای خروجی های قابل خواندن توسط انسان استفاده کنید، به خصوص هنگام به اشتراک گذاری اطلاعات با اعضای تیم

ترکیب با سایر ابزارهای یونیکس: برای پردازش قدرتمندتر، خروجی داکر فرمت شده را با ابزارهای یونیکس مانند grep، awk یا jq برای خروجی های JSON ترکیب کنید

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

قالب بندی ناسازگار: هنگام استفاده از فرمت های سفارشی در میان اسکریپت ها یا ابزارهای مختلف، برای جلوگیری از سردرگمی، سازگاری را حفظ کنید

لینک وبسایت

#docker

@code_crafters
Property and Descriptor-Based Attributes

Property
پایتون به شما امکان می‌دهد رفتاری شبیه به تابع را بر روی اتریبیوت های موجود در کلاس اضافه کنید و آن‌ها را به اتریبیوت های مدیریت‌شده (managed attribute) تبدیل کنید. این نوع ویژگی از بروز تغییرات اساسی در APIیعنی همان اینترفیس عمومی های شما جلوگیری می‌کند.

به عبارت دیگر، با اتریبیوت های مدیریت شده، شما می‌توانید همزمان از رفتار شبیه به تابع و دسترسی شبیه به اتریبیوت بهره‌مند شوید. نیازی به تغییر APIهای خود با جایگزین کردن اتریبیوت ها با متدها نیست، که ممکن است کد کاربران‌تان را دچار مشکل کند.
برای ایجاد یک اتریبیوت مدیریت شده با رفتار شبیه به تابع در پایتون، شما می‌توانید از یک property یا یک descriptor استفاده کنید، بسته به نیازهای خاص خود.
به عنوان مثال، به کلاس Circle خود برگردید و فرض کنید که نیاز دارید شعاع را تایید کنید تا اطمینان حاصل شود که فقط اعداد مثبت ذخیره می‌شوند. چگونه این کار را بدون تغییر اینترفیس کلاس انجام می‌دهید؟ سریع‌ترین روش برای حل این مشکل استفاده از یک property و پیاده‌سازی منطق ولیدیشن( اعتبارسنجی) در متد setter است.


import math

class Circle:
def __init__(self, radius):
self.radius = radius

@property
def radius(self):
return self._radius

@radius.setter
def radius(self, value):
if not isinstance(value, int | float) or value <= 0:
raise ValueError("positive number expected")
self._radius = value

def calculate_area(self):
return round(math.pi * self._radius**2, 2)

برای تبدیل اتریبیوت radius به یک پراپرتی، از دکوریتور property استفاده میکنیم یک متد getter بنویسیم. این متد هنگامی اجرا میشه که میخواهیم مقدار اتریبیوت radius رو مشاهده کنیم، پس قطعا باید مقدار شعاع رو به ما ریترن(return) کنه.
برای اینکه یک متد setter برای پراپرتی شعاع مون بنویسم از دکوریتور @ attr_name.setter استفاده میکنیم.
حال داخل متد setter میایم و منطق اعتبارسنجی که نیاز داشتیم رو پیاده میکنیم و اگر عدد طبق چیزی که انتظار داشتیم نبود به ما خطا میدهد در غیر این صورت در یک اتریبیوت non-public به نام _radius ذخیره میکنیم. حالا اتریبیوت radius ما تبدیل به یک پراپرتی شده و هرموقع که نیاز به مشاهده مقدار یا تغییر مقدار ان بودیم خود پایتون اتومات، ابتدا با توجه به عملیات یکی از متد های getter یا setter رو کال میکنه.
نحوه کارکرد اون به شکل زیر هست.
>>> from circle import Circle

>>> circle_1 = Circle(100)
>>> circle_1.radius
100
>>> circle_1.radius = 500
>>> circle_1.radius = 0
Traceback (most recent call last):
...
ValueError: positive number expected

>>> circle_2 = Circle(-100)
Traceback (most recent call last):
...
ValueError: positive number expected

>>> circle_3 = Circle("300")
Traceback (most recent call last):
...
ValueError: positive number expected


میبینید که با اتریبیوت radius دارید به طور عادی رفتار میکنید اما در پشت قضیه، یک رفتار متد مانند دارد و اگر مقدار نامعتبر دهید خطا میدهد.
منبع
#Property #Python
@Code_Crafters
2🔥1👏1
Descriptor
استفاده از descriptor ها هم یک روش قوی برای اضافه کردن رفتار متد مانند به یک اتریبیوت بدون تغییر دادن اینترفیس یک کلاس است. فرض کنید یک برنامه طراحی نوشتید و دو تا کلاس به نام های دایره و مربع دارید. میخواهیم عددی را به عنوان شعاع/ طول بگیریم و قبل ان چک کنیم که عدد حتما مثبت باشد. خب طبق چیزی که تا الان یاد گرفتیم میدانیم که با property میشود همین کار را انجام داد اما این کار باعث کد تکراری زدن میشود و خوب نیست پس از descriptor استفاده میکنیم.
با استفاده از descriptor کدی مانند زیر خواهیم داشت.

import math

class PositiveNumber:
def __set_name__(self, owner, name):
self._name = name

def __get__(self, instance, owner):
return instance.__dict__[self._name]

def __set__(self, instance, value):
if not isinstance(value, int | float) or value <= 0:
raise ValueError("positive number expected")
instance.__dict__[self._name] = value

class Circle:
radius = PositiveNumber()

def __init__(self, radius):
self.radius = radius

def calculate_area(self):
return round(math.pi * self.radius**2, 2)

class Square:
side = PositiveNumber()

def __init__(self, side):
self.side = side

def calculate_area(self):
return round(self.side**2, 2)


در قطعه کد بالا میبینیم که یک کلاس به نام PositiveNumber داریم.
این همان descriptor ما هست. سه داندر متد داره که به ترتیب به توضیح انها میپردازم.
متد اولی توسط پایتون به صورت اتومات هنگامی که از ان یک اینستنس بسازید صدا زده میشود و نام ان اینستنس هرچه که باشد به عنوان ارگومان name به متد پاس داده میشود. ارگومان owner هم نام کلاسی است که descriptor در ان استفاده شده است. ( در مثال ما Circle یا Square)
متد دوم همان متد getter و متد سوم هم همان متد setter همانند کاری که در پراپرتی انجام دادیم.
ارگومان instance که در دو متد getter,setter وجود داره درواقع همون اینستنسی هست که از کلاس Circle یا Square ما ساخته شده.
توجه داشته باشید که برای ذخیره یا مشاهده از اتریبیوت
__dict__
استفاده میکنیم که جلوتر متوجه علت ان خواهید شد.
این متد ها، اتومات توسط خود پایتون صدا زده میشوند.
حال در کلاس دایره خود، یک اتریبیوت کلاس به نام radius داریم که مقدارش، یک اینستنس از کلاس descriptor ما هست.
حال از این بعد هروقت بخواهیم مقداری در اتریبیوت radius ذخیره کنیم یا مقدار ان را مشاهده کنیم، بجای انکه پایتون از اتریبیوت
__dict__
ان را بخواند یا ذخیره کند، متد های getter, setter از کلاس PositiveNumber با توجه به عملیات مورد نیاز صدا زده میشود و ارگومان های مورد نیاز پاس داده خواهد شد.
منبع
#Descriptor #Python
@Code_Crafters
👍42👏1
This media is not supported in your browser
VIEW IN TELEGRAM
وقتی پروژه رو با اموزش هندی‌ها از یوتیوب پیش میبری

#fun

@code_crafters
🤣12👍1
فصل چهارم کتاب

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

مراحل برنامه نویسی همزمان
برنامه نویسی همزمان مجموعه‌ای از انتزاع‌ها است که به توسعه دهندگان این اجازه رو میده تا برنامه خودشون رو به وظابفی کوچک و مستقل ساختار داده و از طریق سیستم زمان اجرا (system runtime) جهت اجرا در صف انتقال دهند، سیستم زمان اجرا منابع رو برای استفاده بهینه هماهنگ کرده و وظایف رو برای اجرا در منابع ارسال میکند، دو انتزاع برای اینکار در همزمانی وجود دارد فرآیندها و رشته‌ها

فرایندها(processes)
فرآیند خود یک برنامه است که روی دیسک مینشیند یک مجموعه دستورالعمل‌ها رو نشون میده که منتظر اجرا هستند، سیستم عامل این دستورالعمل هارو میگیره به حالت اجرا میبره و به یک برنامه با ارزش تبدیل میکند

سورس کدها بجز یکسری دستورالعمل چیزی نیستند و بخودی خود هیچ ارزشی ندارن مگر اینکه اجرا شده و با انتزاع منابع عمل میکند

توسعه دهندگان هنگام نوشتن کد حافظه‌ای رو برای ذخیره، فایلهایی جهت خواندن و نوشتن و سخت افزارهایی برای ارسال سیگنال به آنرا ندارند

منابع واقعی باید در زمان اجرا فراهم شوند، انتزاع ارائه شده توسط سیستم عامل برای یک برنامه در حال اجرا همان چیزیست که ما بهش فرآیند میگوییم

در سطح دستورالعمل ماشین هیچ مفهومی از فرآیند وجود ندارد

هدف از فرآیندها در سیستم عامل، جداسازی وظایف و تخصیص منابع جهت اجرای انهاست، تمام لرآیندها منابع مشترک دارند و توسط سیستم عامل مدیریت میشوند جهت اطلاع سیستم عامل از رابطه بین فرآیندها و منابع، هر فرآیند باید فضای آدرس مستقل و جدول فایل خود را داشته باشد
فرآیندها واحد تخصیص منابع در سیستم عامل هستند

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

نگاهی به درون فرآیند تصویر اول در کامنت‌ها
فرایند فقط یک برنامه در حال اجرا است، که با دسترسی به سیستم
داده هایی که فرآیند می خواند یا می نویسد در حافظه ذخیره می شود.  بنابراین، حافظه ای که فرآیند می تواند ببیند یا به آن دسترسی داشته باشد (فضای آدرس) بخشی از فرآیند در حال اجرا است.
• فایل اجرایی با تمام دستورالعمل های ماشین بخشی از فرآیند است.
• فرآیند همچنین به یک شناسه نیاز دارد: یک نام منحصر به فرد که فرآیند را می توان با آن شناسایی کرد. به آن شناسه فرآیند (PID) می گویند.
• در نهایت، برنامه ها اغلب به دیسک ها، منابع شبکه یا سایر دستگاه های شخص ثالث دسترسی دارند. چنین اطلاعاتی باید شامل فهرستی از فایل‌هایی باشد که در حال حاضر توسط فرآیند باز می‌شوند، اتصالات شبکه باز و هرگونه اطلاعات اضافی درباره منابعی که استفاده می‌کند.

بنابراین، یک فرآیند چیزهای زیادی را در بر می گیرد: یک فایل اجرایی، مجموعه منابع مورد استفاده (فایل ها، اتصالات و غیره) و فضای آدرس با متغیرهای داخلی. به همه اینها زمینه اجرا می گویند. شروع فرآیند همیشه یک‌ کار سنگین بوده است
فرآیندها معمولاً توسط سیستم عامل ایجاد می شوند. علاوه بر ایجاد فرآیندها، سیستم عامل مسئولیت خاتمه فرآیند را نیز بر عهده دارد.  این یک کار پیش پا افتاده نیست.  سیستم عامل باید بفهمد که فرآیند به پایان رسیده است - یا کار کامل شده است، فرآیند ناموفق است و زمان پاکسازی آن فرا رسیده است، یا فرآیند والد تمام شده است. ایجاد یا خاتمه یک فرآیند نسبتاً پرهزینه است زیرا همانطور که دیدیم، یک فرآیند منابع زیادی به آن متصل است و باید ایجاد یا آزاد شوند.  انجام این کار به زمان سیستم نیاز دارد و تاخیر اضافی را معرفی می کند.


یک فرآیند میتواند فرآیندهای خود را اجرا کند که به آنها فرآیندها فرزند میگویند و کامل مستقل هستند حافظه و و فضای نام خود را دارند تصویر دوم در کامنت‌ها

درک این موضوع در کد راحتتر از تئوری آن است کدهای فرآیند در کامنت‌ها


لینک وب‌سایت

#concurrency

@code_crafters
رشته‌ها threads
اشتراک گذاری حافظه بین فرآیندها در اکثر سیستم عامل ها امکان پذیر است، اما به موارد اضافی نیاز دارد که تلاش بیشتری طلب میکند، اما یک مفهوم دیگر که در اشتراک حافظه یک بیت بیشتر به ما کمک میکند وحود دارد:رشته

یک برنامه به سادگی مجموعه ای از دستورالعمل های ماشین است که باید پشت سر هم اجرا شوند برای تحقق این امر سیستم عامل از مفهوم رشته استفاده میکند
گفتیم یک فرآیند یک برنامه در حال اجرا به اضافه منابع است، اگر برنامه را به اجزای جداگانه تقسیم کنیم، یک فرآیند محفظه ای از منابع (فضای آدرس، فایل ها، اتصالات و غیره) است و یک رشته یک بخش پویا است - دنباله ای از دستورالعمل ها که در داخل این ظرف اجرا می شوند.  بنابراین، در زمینه سیستم عامل، یک فرآیند را می توان به عنوان واحدی از منابع در نظر گرفت، در حالی که یک رشته را می توان به عنوان واحد اجرا مشاهده کرد


رشته‌ها با این ایده متولد شدن که کارآمدترین راه برای اشتراک گذاری فضای ادرس مشترک هستند تصویر اول در کامنت‌ها
رشته‌ها در یک فرآیند واحد، مانند فرآیندهایی هستند که میتوانند به راحتی منابع را با یکدیگر و فرآیند اصلی خود به اشتراک بگذارند

رشته‌ها وضعیت خود را حفظ میکنند تا مستقل از بقیه اجرا شوند، همچنین رشته‌ها از حضور بقیه رشته‌ها بی اطلاع هستند مگر اینکه باهم تداخلی داشته باشند
سیستم عامل رشته‌ها رو مدیریت میکند و میتواند بین چند پردازنده آنها را اجرا کند بنابراین رشته‌ها گزینه خوبی برای اجرای همزمانی هستند
 اکثر سازندگان سخت افزار از Pthreads استفاده می کنند، که یک استادارد IEEE می باشد
در این استاندارد، هر برنامه ای که اجرا می کنیم باعث می شود سیستم عامل یک فرآیند ایجاد کند و هر فرآیند حداقل یک رشته دارد. یک فرآیند بدون رشته نمی تواند وجود داشته باشد. هر رشته همچنین زمینه اجرای مستقل خود را حفظ می کند تا اطمینان حاصل شود که دستورالعمل های آن به طور ایمن و مستقل اجرا می شوند


مزایای استفاده از رشته‌ها نسبت به فرآیندها
۱: فرآیندها کاملاً مستقل هستند، هر کدام دارای فضای آدرس، مجموعه‌ای از رشته‌ها و کپی‌هایی از متغیرها هستند که کاملاً مستقل از همان متغیرها در سایر فرآیندها هستند رشته ها نسبت به عملکرد استاندارد fork() سربار حافظه کمتری دارند زیرا رشته والد کپی نمی شود رشته ها از همان فرآیند استفاده می کنند.به همین دلیل، رشته ها را گاهی اوقات فرآیندهای سبک وزن نیز می نامند
در نتیجه، ما می‌توانیم رشته‌های بیشتری نسبت به فرآیندهای روی یک سیستم ایجاد کنیم
ایجاد و پایان دادن به رشته ها سریعتر از فرآیندها است زیرا زمان کمتری را برای سیستم عامل برای تخصیص و مدیریت منابع نخ نیاز دارد.به همین دلیل، می‌توانیم هر زمان که در برنامه‌ای منطقی بود، رشته‌هایی ایجاد کنیم و نگران اتلاف زمان و حافظه پردازنده نباشیم

۲: هزینه ارتباط کمتر، هر فرآیند با حافظه خاص خود کار می کند.فرآیندها فقط می توانند چیزی را از طریق یک مکانیسم ارتباطی فرآیندی مبادله کنند
رشته‌ها از فضای آدرس یکسانی استفاده می‌کنند و بنابراین می‌توانند با نوشتن و خواندن در فضای آدرس مشترک فرآیند والد خود بدون هیچ مشکلی یا سربار با یکدیگر ارتباط برقرار کنند: هر چیزی که توسط یک رشته تغییر کند بلافاصله در دسترس همه است
از این رو، برای سیستم های SMP که به طور گسترده مورد استفاده قرار می گیرند، گاهی اوقات استفاده از رشته ها بسیار راحت تر از فرآیندها است


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

کد رشته‌ها در کامنت

لینک وبسایت

#concurrency

@code_crafters
وقتی رو شغلش و تخصصش کراش میزنی

سوا ازین‌ها گذشته هر آدمی رابطه مستقیمی با الانش داره، بابت همین بشدت موضوع مهمی هستش که مدام و مدام راجب داشتن سابقه تو هر استخدامی میپرسن😅😅😅😅😅

مثلا کسی که سابقه کار با php رو داشته باشه قطعا واسه پایتون خوب نیست یا سابقه فرانت شما برای بکند فقط افتضاح ببار میاره

#fun

@code_crafters
😁6👍2👎2
دوستان داریم یک مقدار سایت رو توسعه میدیم

و ازین ببعد مطالب حجیم رو در سایت میزاریم فقط و لینک رو در کانال براتون قرار میدیم

حدود ده نفر از دوستان در حال ترجمه و تبدیل مقالات سایت real python هستند و این مطالب هم در سایت براتون میزاریم و بخشی رو براش جدا میکنیم

خلاصه کتاب همزمانی رو هم در سایت میزارم براتون ازین ببعد (اینجوری یکم سرعتم بیشتر میشه بابت خلاصه نوشتن کتاب و لازم نیست دو نسخه مناسب تلگرام و سایت ازش بسازم )

و احتمال زیاد یک‌ کتاب دیگه در خصوص میکروسرویس در پایتون و جنگو رو هم مدنظر دارم براتون ترجمه کنم ،اول باید کتاب رو بررسی کنم خودم ببینم مطالبش چی هست


دوستانی هم که تمایل دارن به همکاری کردن که در کنار هم یاد بگیریم و پیش بریم پیام بدین

هدف ما ساخت یک کامیونیتی فعال خود یادگیرنده هستش تو این مسیر من بهتون کمک میکنم

@code_crafters
👍14🔥3
در خصوص میکروسرویس این کتاب رو‌ باهم پیش میریم


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

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

فصل سوم هم پایه‌های جنگو هست و چون مطالب جالبی داخلش مطرح شده بود ترجمه میکنیم

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


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

#book

@code_crafters
8👍2
🎙 سری پادکست‌های توسعه چابک (Agile)

☁️ ممنون می‌شم نظراتتون رو بشنوم که استفاده کنیم.

✔️ ویس بعد راجب اجایل در ایران و فریمورک‌های اجایل صحبت می‌کنیم.

آیدی بنده:
@AminAlih47

#agile

@code_crafters
👏4👍1
🎙 قسمت دوم سری پادکست‌های توسعه چابک

توی این ویس یکم بیشتر راجب اجایل صحبت می‌کنیم و بعدش هم می‌پردازیم به اجایل در ایران و فریمورک‌های اجایل

☁️ ممنون می‌شم نظراتتون رو بشنوم که استفاده کنیم.

✔️ ویس بعد راجب فریمورک اسکرام صحبت خواهیم کرد. (تا آخر هفته منتشر می‌شه)

آیدی بنده:
@AminAlih47

#agile

@code_crafters
3
🔸telAdviser
🔰ربات cli تلگرام برای راحتی بیشتر و دورزدن محدودیتها

💠ویژگی‌ها:
🔹کانال/گروه هایی که محدودیت گذاشتن و فوروارد پستاشونو بستن راحت دور بزنید
🔹پستهای کانال و گروهای پابلیک و پرایوت به هرجایی که خواستید فوروارد کنید تا بکاپ داشته باشید
🔹تایمتونو سر سلکت کردن پست‌ها هدر ندید و...

https://github.com/maanimis/telAdviser

@code_crafters
🔥71👍1
طراحی میکروسرویس در جنگو بخش اول شروع کار با جنگو

در این بخش پوشش میدیم جنگو رو و مناسب کسانی است که به تازگی باهاش آشنا شده‌اند موارد پوششی این بخش شامل ساختار جنگو، چرخه حیات درخواست (request) و پاسخ (response) ، دستورات پایه‌ای جنگو، کنترل جریان در اپلیکیشن، هندلرهای جنگو، ساخت فایلهای url و view و دانش template ها، بعد از اتمام این بخش شما توانایی دانستن دانشی از web application ها و ساخت rest api با جنگو و چگونه ارائه دادن درخواست داده و باز گرداندن پاسخ بدست خواهید آورد

نکته: دانش پایتونی در خصوص موارد بالا الزامی می‌باشد


جنگو یک فریمورک وب اپلیکیشن بر پایه پایتون هستش، که هر کاربری میتواند با استفاده از آن اقدام به ساخت web application و web api کند، که بسیار ساختارمند و سریعتر از برخی دیگر از زبانهای سمت وب(داخل کتاب اشاره به php دارد) می باشد، که میتوان پروژه‌های بزرگ را با آن به راحتی پیاده سازی کرد.جنگو، از پایتون پشتیبانی می‌کند به این معنا که میتوان از تمامی ویژگی‌های پایتون مانند objects, class, polymorphism, list, tuple, dictionary و ... را در آن استفاده کرد

پایه جنگو، پایتون می‌باشد پس تمامی سینتکس کدها و تلفیق آنها شبیه پایتون است ،جنگو از یک مفسر (interpreter) داخلی برای اجرای فایل‌ها استفاده می‌کند، ما میتونیم بصورت جداگانه اجرا کنیم فایلهای جنگو رو در یک مفسر پایتونی


ما بارها درباره طراحی الگوی ساختار MVC شنیده‌ایم، که فرم کامل آن به شکل Model, View, Controller می‌باشد این الگوی طراحی برنامه رو به سه قسمت منطقی تقسیم میکند، هر قسمت عملکرد متفاوتی دارد و هر قسمت ساخته شده برای هندل کردن جنبه‌هایی از یک برنامه هستش، به این معنا که تمام ساختار یک پروژه توزیع شده در سه بخش قرار میگیرد، جنگو هم تقریبا شبیه با MVC و از الگوی طراحی(معماری) MVT View استفاده میکند، طراحی پروژه‌های جنگو تقسیم شده در سه بخش هستش که ساخت وهندل کردن ساختار پروژه‌های بزرگ رو راحت میکنه

مفهوم MVT
بخش M مورد استفاده برای هندل کردن داده ،مانند واکشی داده از دیتابیس و انتقال داده به ویو

بخش V ویو مربوطه به ذخیره سازی و منطق تجاری(business logic) پروژه که مرتبط هست با مدل و تملیپت

بخش T فرانت، به این معنا که صفحات html و GUI مرتبط با کار، میان داخل بخش تمپلیت، که با مدل و ویو بطور مستقل ارتباط میگیرد


بیایید یک نگاه به ساختار جنگو بیاندازیم
├── first_django_project
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

1 directory, 6 files
هنگام آغاز پروژه با جنگو یک دایرکتوری با نام مدنظر ما ساخته میشود که داخل آن یک دایرکتوری دیگر با همان نام وجود دارد و جنگو بصورت اتومات یکسری فایل با نام‌های مختلف نیز برای ما میسازد ،مانند نمونه بالا که برای اجرای پروژه حیاتی میباشند، هر فایل مفهوم متفاوت و عملکرد خاصی دارد، بیایید اندکی بررسی کنیم

در پایتون متد init (dunder init) که یک سازنده کلاس هستش، این احرا میشه وقتی یک نمونه کلاس ساخته میشه، در جنگو هم فایل (dunder init.py) در مرحله اول اجرا میشود،ما میتونیم ازین فایل استفاده کنیم برای مثال ما بسته‌هایی رو داریم که در جاهای مختلف ازش استفاده میکنیم کافیه در این فایل واردش کنیم


فایل settings.py
این فایل اصلی است، ازین جهت بسیار حائز اهمیت می‌باشد که تمامی پیکربندی‌های پروژه در آن نوشته میشود
ALLOWED_HOSTS = []
در این لیست ما میتونیم یک یا چندین ip بنویسیم که میخواهیم پروژه به آن گوش بدهد، اگر چیزی ننویسیم پیش فرض localhost رو مدنظر میگیره

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

در این لیست ما میتونیم برنامه‌های خودمون رو تعریف کنیم داخل این لیست و خود جنگو برخی برنامه‌های پیش فرض را هم داخل آن جا داده که برای اجرای پروژه ذکر شده

ROOT_URLCONF = 'first_django_project.urls'
این متغیر مسیر پیش فرض url روت پروژه رو معرفی میکنه

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
این دیکشنری برای اتصال به دیتابیس مهم است و شامل اطلاعات درایور و پارامترهای ارتباطی با دیتابیس می باشد، که جنگو بصورت پیش فرض sqlite3 رو تنظیم میکنه


فایل دیگر ما که urls.py است، ما در این فایل URRهای پروژه رو تعریف میکنیم، که مورد استفاده برای کاربران پروژه جهت پردازش request و response هستش

لینک وبسایت

#microservice
#django

@code_crafters
👍41
در این فایل است که با ویو ارتباط میگیریم و تمامی urlهای پروژه که توسط جنگو و برای کاربران تعریف شده است قرار دارد


فایل uwsgi.py وقتی استفاده میشه که ما مستقر میکنیم پروژه رو بر روی سرور برنامه، در جنگو این فایل ایجاد میکنه تنظیمات رو برای استقرار، با استفاده از این فایل وب سرور میتونه به راحتی با اپلیکیشن جنگو‌ ارتباط برقرار کند،

فایل manage.py ازین جهت حائز اهمیت است که جنگو با کمک این فایل پروژه رو استارت میکنه (به زبان دیگر setup پروژه جنگو با این فایل اجرا میشه) اگر دقت کنید پوشه داخلی (first_django_priject) با این فایل در یک سطح ساخته میشوند که نشان از اهمیت یکسان آن دو هست


برای اجرای پروژه جنگویی ما دو گام پیش رو داریم:
ابتدا با دستور 
django-admin startproject first_project_django
که ساختار اولیه پیش فرض ساخته میشود با نام مدنظر ما (first_project_django)

سپس با دستور
python manage.py runserver
پروژه روی ip مدنظر ما (اگر در قسمت allow host تعریف شده باشد ip مدنظر ما و در غیر این صورت در ip پیشفرض 127.0.0.1) بر روی پورت پیش فرض 8000 اجرا خواهد شد همچینین میتونیم با پاس دادن پورت مدنظرمون به دستور پورت پیشفرض رو هم تغییر داد
python manage.py runserver 8001

اگر در مرورگر خود 127.0.0.1:8000 رو وارد کنیم خروجی رو میبینیم


جریان احرایی برنامه جنگویی
با دستور بالا پروژه جنگویی اجرا میشه

۱-درون فایل manage.py، فایل settings.py ذکر شده که به معنای فایل تنظیمات است
۲- درون فایل settings بخش‌های کدی وجود دارد که خط به خط هر بخش اجرا میشود
۱- ماژول‌های ضروری جهت اجرا رو import میکند

۲- مسیر پروژه رو میسازه

۳-در بخش allow host هر مقدار ip رو‌تعریف میکنیم و سپس پروژه در اون ip خاص استارت خواهد شد

۴-در بخش بعدی تمامی appها لود شده که ما در install app تعریف کرده‌ایم

۵-در بخش بعدی مجموعه URLها رو در بخش روت تعریف میکند، که تعریف شده داخل فایل urls.py

۶-حالاجستجو برای پوشه templateها شروع میشه که چون تعریف نشده مقدار خالی رو تنظیم میکنه

۷-در بخش دیتابیس اجرا میکنه کد رو و با دیتابیس پروژه ارتباط برقرار میکند
۳-پس از اجرا کردن فایل settings سرور استارت زده و در ip با پورت مدنظر ما در دسترس قرار میگیرد


جنگو‌ چگونه درخواست‌هارو‌هندل میکنه
۱-متغیر ROOT_URLCONF از فایل settings رو لود میکن
۲-این منغییر را بصورت گلوبال تنظیم کرده و سپس مسیر را برای یافتن URLهای تعریف شده توسط کاربر مشخص می کند

۳-هر url تعریف شده به یک تابع نسبت داده شده است

urlpatterns = [
path('admin/', admin.site.urls),
]
۴-که بعد از کاما مشخص شده و هنگام صدا زدن تابع مدنظر رو اجرا میکنه


شرح مراحل کنترل جریان درخواست:
وقتی URL توسط کاربر نهایی صدا زده می‌شود، درخواست از طریق سرور جنگو منتقل میشه و بررسی میکنه که URL خواسته شده در فایل موجود هست یا نه

در مرحله اول درخواست کاربر بصورت شی HttpRequest ارسال میشه، سپس برای ارسال پاسخ از یک شی HttpResponse استفاده میشه
اگر url درخواستی کاربر وجود داشته باشد تابع نسبت داده شده آن در فایل views.py فراخوانده میشود
صفحات خطای پیش فرض:
خطای 400: اگر کاربر ارسال کنه درخواستی رو و به خطا بخوره جنگو مقدار تابع django.views.defaults.bad_request()
صدا میزنه و یک استثنا پیش فرض با وضعیت رو برمیگردونه

خطای 403:اگر کاربر ارسال کنه درخواستی و اجازه دسترسی نداشته باشد مقدار تابع django.views.defaults.permission_denied()
صدا زده میشود

خطای 404: اگر کاربر ارسال کنه درخواستی رو و با خطای نبود URL مواجه بشه مقدار django.views.defaults.page_not_found()
صدا زده میشه

خطای 500: اگر کاربر ارسال کنه درخواستی رو و با خطای سرور مواجه بشه مقدار تابع django.views.defaults.server_error()
صدا زده میشه



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

مقدار get
این روش برای دریافت داده از طریق ارسال داده‌های مرتبط به سرور استفاهده میشه، دارای طول محدود داده جهت ارسال است، اطلاعات و داده‌ها در url قابل مشاهده است و انتقال داده آن ناامن است

مقدار post
برای ارسال داده‌های حساس کاربر به سرور مناسب است، داده ها در url قابل مشاهده نیست و امنتر از get می‌باشد و محدودیت ارسال اطلاعات آن نیز بیشتر

لینک وبسایت
#microservice
#django

@code_crafters
👍41
مقدار connect
این درخواست یک خط لوله (pipline) را به سرور ایجاد خواهد کرد و بعد از احرازهویت و سنجش آن را تایید و ایجاد میکند

مقدار put
این روش شبیه به مقدار post است دقیقا با این تفاوت که اگه بارها اون رو تکرار کنیم یک مقدار یکسان به ما خواهد داد در حالیکه در post ممکن مقادیر متفاوت ایجاد گردد، این روش مناسب ایجاد یا تغییر منابع با آپلود داده است

مقدار delete
اگر کاربر بخواهد هر داده‌ای رو حذف از دیتابیس این بهترین روش است


ایجاد فایل ویو و پیکربندی url پیش تعریف کاربر
طبق الگوی MVT ،بیزنس لاجیک در فایل view تعریف میشه، و این فایل توسط URLها صدا زده میشه و همچین رابط بین مدل و تمپلیت است، پوشه داخلی و در کنار settings.py یک فایل با نام views.py میسازیم
from django.http import HttpResponse

def index(request):
return HttpResponse("Hello, world. this is my first URL.")

ابتدا ماژول مدنظر خودمون رو ایمپورت کرده و سپس تابع ویوی مدنظر خودمون رو میسازیم و در فایل urls.py اون رو صدا میزنیم

from . import views

urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', views.index),
]


پایه لاگ‌ها و در دسترس بودن نوع لاگ
توسعه دهندگان سعی میکنن تمام رخ‌دادهای خطا رو در پروژه مدیریتی کنن اما گاهیی ممکن هست رخ‌دادی رو فراموش یا مدیریت نکنند، برای گرفتن جریان برنامه و اون خطا پایتون ماژولی دارد با نام logger که مصرف داخلی جنگو نیز دارد، لاگر پایتون به چهار قسمت تبدیل شده:
بخش loggers:
هنگام تعریف لاگرها باید در اولین نقطه برنامه و بالاترین قرار بگیرند، لاگرها انواع مختلفی دارند که داده‌هارو بطور متفاوتی مدیریت میکنند، در خصوص آنها بیشتر صحبت خواهیم کرد

بخش Handler:
هندلرهارو میتونیم موتور لاگرها بدونیم، که تعریف میکنند رفتار هر پیغام رو، که بستکی به نوع لاگر دارد، ما میتونیم پیغام‌ها یا ارورهارو بعنوان یک پیام به لاگر پاس دهیم، میتونیم لاگ‌هارو در کنسول چاپ یا در فایلهای مجزا در دسترس قرار دهیم

بخش Filters:
فیلتر ارائه‌دهنده‌ای است که کنترل اضافی را بر روی رکوردهای گزارش ارائه می‌کند که از لاگر به کنترل‌کننده منتقل می‌شود

بخش Formatters:
ما تعریف میکنیم فرمتی رو برای رکوردها، که چاپ کنن متن رو، همچنین میتونیم فرمت مدنظر خودمون رو تعریف کنیم برای چاپ لاگ‌ها


انواع لاگ‌ها
DEBUG:
استفاده میشه برای چاپ و نوشتن اطلاعات اندکی درباره سیستم و برنامه

INFO:
استفاده میشه برای گرفتن اطلاعاتی از سیستم

WARNING:
بیشتر استفاده میشه بوسیله سیستم ارائه دهنده اطلاعات برای مشکلات جزئی که در سیستم رخ میده

ERROR:
این لاکر اطلاعات مهم را میگیرد، که روی میدن در سیستم و برنامه

CRITICAL:
برای چاپ پیامی استفاده میشه که سیستم یا برنامه دارای مشکل جزئی است

اجرای لاگر
لاگرها به سادگی در جنگو اجرا میشن، در بخش اول ما پیکربندی میکنیم فایل settings رو و میسازیم فایل لاگ رو، و اشاره میکنیم نوع لاگ رو در کد

یک نمونه ساده از پیکربندی لاگر
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/home/debug.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}

برای دیدن خروجی و اجرا در برنامه هم بصورت زیر در ویو
import logging

logger = logging.getLogger(name)

logger.debug('this is example of debug logger')
logger.info('this is example of info logger')
logger.warn('this is example of warn logger')
logger.error('this is example of error logger')

و برای تغییر فرمت هم
formatters = {
'f': {'format':
'%(asctime)s %(name)-12s %(levelname)-8s %(message)s'}
},


لینک وبسایت

#microservice
#django

@code_crafters
3👍3
توسعه API در جنگو

در این قسمت ما شروع میکنیم به پیاده سازی api و یادگرفتن آن در جنگو و پیاده سازی کردنش، api در میکروسرویس جایگاه بسیار حائز اهمیتی دارد

ایده اصلی API
یک api مجموعه‌ای ازعملیات‌هاست که اجرا میشه و خروجی تولید میکنه، پایه‌ترین آن انتقال داده بر روی شبکه از یک نقطه به نقطه دیگر است، برای مثال ما یک برنامه‌موبایلی داریم که کاربر با وارد کردن اطلاعات خود میتواند داخل اپ ما ثبتنام و لاگین کند و یا از طریق سایر برنامه‌های دیگر با وارد کردن اطلاعات برای مثال به داشبورد خودش منتقل بشه، از دیگر موارد مهم در api میتوان به هندل کردن موارد امنیتی اشاره کرد، امنیت داده، کنترل سخت افزار و نرم افزار و ....، امروزه با استفاده از api میتوانیم یک بخش کد یا برنامه رو توسعه داده و در جاهای مورد نیاز دیگر از آن استفاده کرد

ساخت یک اپ در جنگو
اجازه بدید یک اپ جنگو بسازیم جهت نگهداری کدها، کارایی اپ جنگو در مناسب بودن هندل کردن بخش‌های جداگانه هر ماژول است، اگر در ماژولی تغییر ایجاد کنیم نباید روی دیگر ماژول‌ها تاثیر گذار باشد، ما کار رو در یک پروژه جدید با نام django_project01 پیش میبریم و یک اپ داخل آن با نام first_app میسازیم

django-admin startproject django_project01

cd django_project01

python manage.py startapp first_app

بعد از زدن دستورات ساختار پروژه به این شکل خواهد بود

.
├── django_poject01
│ ├── asgi.py
│ ├── __init__.py
│ ├── pycache
│ │ ├── init.cpython-310.pyc
│ │ └── settings.cpython-310.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── first_app
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
└── manage.py

4 directories, 15 files

جنگو برای اپ نیز یکسری فایل تولید میکند(که از بررسی آن سر باز میزنیم، اپ را در فایل settings به لیست install apps اضافه میکنیم)

ما میتونیم ویوهای خودمون رو به دو شکل CBV و FBV در فایل views.py بنویسیم


برای قسمت fbv(function base view)
from django.http import HttpResponse
import json


def get_method_example(request):
userid = request.GET.get('userid', '')
resp = {}
if userid:
resp['status'] = 'Success'
resp['status_code'] = '200'
resp['data'] = userid
return HttpResponse(json.dumps(resp), content_type='application/json')

@csrf_exempt
def get_method_example(request):
userid = request.POST.get('userid', '')
resp = {}
if userid:
resp['status'] = 'Success'
resp['status_code'] = '200'
resp['data'] = userid
return HttpResponse(json.dumps(resp), content_type='application/json')
دو تابع درست کرده‌ایم یکی برای درخواست‌های GET و یکی برای درخواست‌های POST، حال با اضافه کردن دوتا url به پروژه میتوانیم هر دو ویو رو با برنامه postman تست کنیم


برای قسمت cbv(class base view)
from django.http import HttpResponse
import json
from django.views import View

class ClassBaseViewExample(View):
def get(self, request):
userid = request.GET.get('userid', '')
resp = {}
if userid:
resp['status'] = 'Success'
resp['status_code'] = '200'
resp['data'] = userid
return HttpResponse(json.dumps(resp), content_type='application/json')

def post(self, request):
userid = request.POST.get('userid', '')
resp = {}
if userid:
resp['status'] = 'Success'
resp['status_code'] = '200'
resp['data'] = userid
return HttpResponse(json.dumps(resp), content_type='application/json')

برای cbv یک کلاس با دو تابع نوشته شده که مشابه کدهای قبلی می باشد و اکنون با نوشتن یک urlبرای آن میتوان هر دوتابع این ویو رو در postman تست کرد


برای مثال در قسمت url اصلی پروژه
from django.contrib import admin
from django.urls import path
from first_app import views

urlpatterns = [
path('admin/', admin.site.urls),
path('get_method/', views.get_method_example),
path('post_method/', views.post_method_example),
path('cbv_method/', views.ClassBaseViewExample.as_view()),
]


لینک وبسایت

#microservice
#django

@code_crafters
4👍1
فرا رسیدن عید سعید فطر، عید پاداش یک ماه بندگی و عبادت را به همه مسلمانان جهان تبریک و شادباش میگوییم. 🥳🎉

با آروزی قبولی طاعات و عبادات شما عزیزان ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
19👎6🤮3🎉1