<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Future Vision</title><link>https://virgool.ir/feed/@m2kappswindows8.1</link><description>سلام اسم من مصطفئ‌ست، علاقه مند به زبان برنامه‌نویسی پایتون و یادگیری چیز های جدید.</description><language>fa</language><pubDate>2026-11-11 21:34:40</pubDate><image><url>https://files.virgool.ir/upload/users/939490/avatar/BYgh1a.jpg</url><title>Future Vision</title><link>https://virgool.ir/@m2kappswindows8.1</link></image><item><title>تازه های پایتون: Specializing Adaptive Interpreter</title><link>https://virgool.ir/@m2kappswindows8.1/تازه-های-پایتون-specializing-adaptive-interpreter-ahjjlmkvvxvy</link><description>Specializing-Adaptive-Interpreterبا سلام به همه امروز میخواییم درباره ی ویژگی Specializing Adaptive Interpreter که در پایتون نسخه 3.11 اضافه شده و در نسخه ی 3.12 بهینه تر شده کمی صحبت کنیم. Core Developer های پایتون از نسخه 3.10 شروع به بهینه سازی هایی در مفسر پایتون کردن و این بهینه سازی ها از افزایش سرعت در نسخه 3.10 نسبت به نسخه 3.9 شروع شد. بر طبق اسناد رسمی پایتون، نسخه پایتون 3.11 بین 10 الی 60 درصد سریعتر از نسخه 3.10 میباشد. خب قبل از اینکه به بحث اصلی بپردازیم بهتره که ابتدا با چند مفهوم شروع کنیم که مربوط به همین موضوع میشود.مفسر پایتون مانند خیلی از زبان های برنامه نویسی دیگر، کد های نوشته شده به این زبان رو مستقیما به زبان ماشین ترجمه نمیکنه. پایتون در واقع کد نوشته شده رو به تبدیل به بایت کد میکنه. در بعضی از زبان های استاتیک تایپ و کامپایلری مثل جاوا، که کد های این زبان هم به بایت کد تبدیل میشه، کامپایل دستورات قبل از اجرا شدن آن صورت میگیرد. در مقابل، پایتون، کامپایل رو در زمان اجرا و زمانی که ماژول برای اولین بار load میشه انجام میده. خب قبل از اینکه بریم سراغ اینکه ببینیم بایت کد واقعا چیه بذارید یک قدم به عقب تر برگردیم و ببینیم کد ماشین چیه؟ کد ماشین (machine code) چیست؟کد ماشین در واقع کدی است که توسط تراشه یا پردازنده در کامپیوتر اجرا میشه. پردازنده کدهای خاصی رو برای یکسری اقدامات مختلف تعریف میکنه و زمانی که آن کدها به پردازنده ارائه میشه، عمل مربوطه توسط پردازنده انجام میشه. در کامپایل سنتی، برای مثال کامپایل یک برنامه ی نوشته شده به زبان C، کامپایلر، کد های نوشته شده رو دریافت میکنه و به instruction ها یا دستورالعمل های قابل اجرا توسط پردازنده تبدیل میکنه که کد ماشین نامیده میشه. یک مشکلی که در کامپایل سنتی وجود دارد این است که شما باید برای هر پردازنده یا سخت افزاری که قصد دارید کد را روی آن اجرا کنید، برنامه را به طور جداگانه کامپایل کنید! زیرا هر کدام ممکن است یکسری از دستورالعمل های کد ماشین را تعریف کنند که با یکدیگر همخوانی نداشته باشند و متفاوت از یکدیگر باشند. متخصصان و طراحان زبان برای حل این مشکل مفهوم بایت کد را ارائه دادند.بایت کد (bytecode) چیست؟بایت کد ها، مجموعه ای از دستورالعمل های مستقل از سخت افزار هستند که سطح بالاتری از کد ماشین دارند. در این روش، برنامه ی شما به بایت کد کامپایل میشود و این بایت کد ها توسط یک برنامه ی دیگر (ماشین مجازی) تبدیل به کد ماشین شده و به موازات آن باعث اجرا شدن برنامه میشود. از آنجایی که بایت کد مستقل از سخت افزار است، کد را می توان روی هر سخت افزاری اجرا کرد. برای مثال زبانی مانند جاوا با استفاده از ماشین مجازی مخصوص خود به اسم jvm این کار را انجام میدهد. همچنین پایتون، با استفاده از ماشین مجازی خود به اسم pvm بایت کد ها را اجرا میکند.نمایش بایت کد های تولید شده در پایتون با استفاده از پکیج disما در پایتون با استفاده از پکیج dis، قادر به دیدن بایت کد های تولید شده توسط مفسر پایتون هستیم.نکته: نسخه پایتون استفاده شده در این مثال، 3.11 است.بیایید یک نمونه رو باهم ببینیم. ابتدا یک فایل با نام دلخواه بسازید در این مثال من اسم فایل رو util.py قرار میدم. سپس، کد زیر رو داخل همون فایل بنویسید :def add(a, b):&#xA;    return a + bحالا یک فایل دیگه بسازید با نام test.py و کد زیر رو داخلش قرار بدید :from util import add&#xA;&#xA;print(add(3, 5))حالا فایل test.py رو در داخل ترمینال با دستور زیر اجرا کنید :&gt; python test.pyبعد از اجرای این دستور یک folder در همان directory ای که این دو فایل رو ساختید با نام __pycache__ ایجاد خواهد شد که شامل یک یا چند فایل با پسوند pyc. می باشد که در این مثال، یک فایل با نام util.cpython-311.pyc میباشد. این فایل pyc. که مخفف python-compiled است حاصل خروجی فرآیند کامپایل است. این فایل شامل بایت کد های تولید شده حاصل از کامپایل util.py است. حالا کاربرد این فایل چیه؟ دفعه ی بعد که ما دوباره test.py را اجرا کنیم، فایل util.py مجددا کامپایل نمی شود. به جای کامپایل مجدد، بایت کد را مستقیماً از فایل util.cpython-311.pyc اجرا می کند.شما میتوانید فایل pyc. را باز کنید اما به احتمال زیاد محتوای آن قابل خواندن نیست و فقط با یکسری از کاراکتر های نامفهوم مواجه خواهید شد. خب راه حل چیه؟ استفاده از پکیج dis!نکته 1: دقت داشته باشید که در پایتون وقتی ما یک ماژول رو مستقیما اجرا میکنیم، دیگه code object اون ماژول در file system ذخیره نمیشه! فایل pyc. زمانی ایجاد میشه که ما یک ماژول رو import میکنیم. تمام فایل های pyc. در __pycache__ ذخیره میشوند.نکته 2: برای اینکه code object در file system ذخیره بشه نیاز داره که serialization بشه که این serialization توسط یک ماژول موجود در standard library پایتون به اسم marshal انجام میشه! پس میتونیم نتیجه بگیریم که فایل های pyc. در واقع code object های serialize شده توسط marshal هستند.نکته 3: مفهوم code object رو در ادامه توضیح شده است.بسیار خب حالا، در همان فایل test.py کد زیر را جایگزین کد فعلی کنید :import dis&#xA;from util import add&#xA;&#xA;dis.dis(add, adaptive=True)در واقع کاری که پکیج dis انجام میده این است که بایت کد های تولید شده رو به دستورالعمل یا instruction های قابل خواندن برای انسان تبدیل میکنه و بهتره بگیم اصطلاحا disassemble شون میکنه.بعد از اجرای فایل test.py با خروجی زیر مواجه خواهید شد :  1           0 RESUME                   0&#xA;&#xA;  2           2 LOAD_FAST                0 (a)&#xA;              4 LOAD_FAST                1 (b)&#xA;              6 BINARY_OP                0 (+)&#xA;             10 RETURN_VALUE&#xA;همینطور که مشاهده میکنید چهار بایت کد برای تابع add ما تولید شده است. این بایت کد شامل 5 ستون است. ستون اول اشاره به شماره خط کد اصلی نوشته شده در فایل ما دارد. ستون دوم مکان دستور در کد پایتون را به صورت مکان فیزیکی در بایت کد نشان می‌دهد. ستون سوم یا میانی نام بایت کد ها را نشان می دهد. دو ستون آخر جزئیاتی را در مورد پارامتر ها (parameters)، در صورت وجود پارامتر، ارائه می دهد. قبل از اینکه ادامه بدیم، ببینیم بایت کد های موجود در ستون سوم چی هستن :بایت کد RESUME: این بایت کد نشان می‌دهد که اجرای تابع از اینجا شروع شده است.بایت کد LOAD_FAST: این بایت کد برای load کردن مقدار local variables (در اینجا local function scope) استفاده می‌شود. همانطور که میبینید این بایت کد به ترتیب برای load کردن پارامتر های a و b استفاده شده است.بایت کد BINARY_OP: از این بایت کد به منظور انجام عملیات های باینری مانند جمع، تفریق و غیره استفاده می شود. عدد کنار این دستور (ستون چهارم) نشان می‌دهد که چه نوع عملیاتی (در اینجا جمع) باید صورت بگیرد.بایت کد RETURN_VALUE: این بایت کد به منظور برگشت دادن (return value) مقدار محاسبه شده در تابع استفاده می‌شود.نکته مهم: دقت کنید، بایت کدی که در اینجا میبینید همان بایت کدی نیست که توسط مفسر اجرا میشود! این بایت کد ها صرفا یک نمایش human-readable از بایت کد اصلی برای ما است.خب قبل از اینکه درباره ی دو ستون آخر جزئیات بیشتری بگم، بهتره یه توضیح خیلی کوتاه در مورد code object در پایتون بدم.کد آبجکت (code object) چیست؟در پایتون، یک code object یک شیء است که نمایانگر کد کامپایل شده میباشد. این object، یک internal object یا بهتره بگیم یک executable unit است که دستورات بایت کد، ثابت‌ها، نام‌ها و سایر اطلاعات مربوط به کد را ذخیره می‌کند. تفاوت code object و bytecode چیست؟بایت کد مجموعه ای از دستورالعمل های ایجاد شده توسط کامپایلر داخلی پایتون است که توسط ماشین مجازی داخلی اجرا می شود و در واقع یکی از attribute های code object است. ما میتوانیم برای دسترسی به code object یک تابع از attribute عه __code__ اون تابع استفاده کنیم. برای مثال، برای دیدن بایت کد اصلی تابع add ما میتونیم از کد زیر استفاده کنیم :print(add.__code__.co_code)خروجی کد بالا چیزی مشابه با خروجی زیر است :b&#39;\x97\x00|\x00|\x01z\x00\x00\x00S\x00&#39;بسیار خب حالا بریم سراغ دو ستون آخر بایت کد تا ببینیم برای نمایش چه چیزی هستند. ستون چهارم، شماره ی index آن پارامتر را در attribute های مربوط به اون پارامتر ها در code object را نشان میدهد. برای مثال شماره 0 برای پارامتر a نشان دهنده ی شماره ی این پارامتر در attribute عه co_varnames است.این attribute اسامی پارامتر هارا در قالب یک tuple به ما نشان میدهد :print(add.__code__.co_varnames)خروجی :(&#39;a&#39;, &#39;b&#39;)نکته: لزوما همیشه در ستون چهارم شماره index پارامتر های تابع قرار نمیگیرد و ممکن است معنی های مختلفی داشته باشند. در مثالی که زده شد، عددی که در مقابل بایت کد BINARY_OP قرار دارد در واقع مشخص کننده ی نوع عملیات میباشد و برابر با 0 که نشان هنده ی عملیات جمع است می باشد. اگر در بخش return تابع add به جای + از / استفاده کنید میبینید که این عدد به 11 تغییر میکند که نشان دهنده ی عملیات تقسیم با اعشار میباشد. در واقع این اعداد اشاره به argument های همون instruction دارند.در نهایت، در ستون پنجم، dis بر اساس index ها و اعداد ستون چهارم، ثابت ها (const variables)، متغیر ها و سایر مقادیری را در که ستون چهارم مشخص کرده است، جستجو کرده و به ما می گوید که در ستون پنجم چه چیزی پیدا کرده است.Specializing Adaptive Interpreterخب بریم سراغ بحث اصلی یعنی Specializing Adaptive Interpreter و اینکه ببینیم چه کاری برای ما انجام میده. بایت کد BINARY_OP (که نمایانگر عملیات باینری است) به عنوان یک generic bytecode instruction شناخته می شود. تابع add ای که در مثال قبل نوشتیم فقط برای جمع دو عدد نیست. ما برای جمع کردن دو string هم میتوانیم از این تابع استفاده کنیم و پایتون هیچ گونه خطایی از این بابت به ما نمیدهد چون string ها هم از عملیات جمع پشتیبانی میکنند.برای مثال:print(add(&#39;abc&#39;, &#39;xyz&#39;))بنابراین BINARY_OP با هر نوع داده کار می کند و محاسبات لازم به هر داده را انجام می دهد.حالا بیایید این کد را اجرا کنیم :for _ in range(10):&#xA;    add(3, 5)&#xA;&#xA;dis.dis(add, adaptive=True)ما در این کد 10 بار تابع add رو با argument های 3 و 5 صدا زدیم.حالا بیایید بایت کدش رو ببینیم :  4           0 RESUME_QUICK             0&#xA;&#xA;  5           2 LOAD_FAST__LOAD_FAST     0 (a)&#xA;              4 LOAD_FAST                1 (b)&#xA;              6 BINARY_OP_ADD_INT        0 (+)&#xA;             10 RETURN_VALUEدر این بایت کد جدید، ما میبینیم که LOAD_FAST با LOAD_FAST__LOAD_FAST و BINARY_OP با BINARY_OP_ADD_INT جایگزین شده است. در حقیقت بایت کد LOAD_FAST__LOAD_FAST یک نسخه ی بهینه شده برای load کرن دو آرگومان a و b است. پایتون با این کار میاد در همون بایت کد اول آرگومان های a و b رو load میکنه و دیگه برای هر آرگومان بایت کد LOAD_FAST رو ایجاد نمیکنه!نکته: دلیل اینکه در خط بعد از LOAD_FAST__LOAD_FAST بازم برای آرگومان b یک بایت کد تولید کرده این است که این بایت کد از قبل از بهینه شدن تولید شده و پایتون دیگه نمیاد اون رو بازنویسی کنه چون مفسر پایتون از همون بایت کد بهینه شده اول (LOAD_FAST__LOAD_FAST) برای load کردن هر دو آرگومان استفاده میکنه و نیازی به استفاده از بایت کد دوم نداره و اون رو skip میکنه. وقتی تو بایت کد اول هر دو آرگومان رو load میکنه و میره سراغ بایت کد دوم میبینه که خب این بایت کد تو بایت کد قبلی load شده و نیاز نداره ازش استفاده کنه یا بهینه اش کنه پس ازش رد میشه.بایت کد BINARY_OP_ADD_INT یک نسخه بهینه شده از عملیات جمع (+) برای انجام عملیات جمع بین دو عدد صحیح با هم است، که بسیاری از بررسی‌هایی را که معمولا انجام میشوند را دور میزند، به عنوان مثال بررسی برای اینکه این دو دیتا تایپ از عملیات جمع پشتیبانی میکنند یا نه، بررسی و جستجوی متد __add__ در این دو آرگومان، برابر بودن تایپ این دو آرگومان و غیره. در این بایت کد، بایت کد BINARY_OP_ADD_INT یک نمونه از specialized bytecode instruction میباشد که برای عملیات جمع (+) دو عدد صحیح بهینه سازی شده است. اتفاقی که در اینجا افتاده این است که پایتون متوجه شده است که ما مکرراً عملیات جمع (+) را بین دو عدد صحیح انجام میدهیم و بنابراین (در زمان اجرا) بایت کد را تغییر داده و آن را اختصاصی یا به اصطلاح specialized می‌کند. پایتون در دفعات بعد بایت کد بهینه شده را اجرا می کند و به این شکل کد سریعتر اجرا می شود. این دقیقا کاری است که Specializing Adaptive Interpreter انجام میدهد. مفسر اجرای بایت کد را تجزیه و تحلیل می کند. اگر الگوهای خاصی را ببیند که می توانند بهینه شوند، بایت کد مربوط به اون الگو را در زمان اجرا به نسخه اختصاصی شده (specialized version) تغییر می دهد. پایتون زمانی عمل specializing را انجام میدهد که کد &lt;&lt; Hot &gt;&gt; (کد هایی که چندین بار اجرا شدند) ببیند. این ویژگی باعث میشود که پایتون زمان خود صرف اجرای یک کد با عملیات ثابت نکند و به جای آن، آن کد را specialize میکند و از نسخه ی بهنیه شده ی آن استفاده میکند.نکته: دفعات اجرای پایه برای بهینه سازی 8 بار میباشد. یعنی اگر یک تابع بدون هیچ تغییری با مقادیر ثابت 8 بار یا بیشتر اجرا شود در صورت امکان، پایتون شروع به بهینه سازی اون تابع میکند. (ممکن است این عدد در نسخه های بعد بهینه شده یا شده باشد.)خب چی میشه اگه ما آرگومان های تابع add رو که از نوع integer هستند با string جایگزین کنیم!؟ بیایید امتحانش کنیم:# after loop&#xA;add(&#39;abc&#39;, &#39;xyz&#39;)&#xA;&#xA;dis.dis(add, adaptive=True)خروجی رو ببینیم : 23           0 RESUME_QUICK             0&#xA;&#xA; 24           2 LOAD_FAST__LOAD_FAST     0 (a)&#xA;              4 LOAD_FAST                1 (b)&#xA;              6 BINARY_OP_ADD_INT        0 (+)&#xA;             10 RETURN_VALUEخب در خروجی جدید میبینیم که بایت کد فرقی نکرده و همچنان برای جمع دو عدد بایت کد تولید میکنه. دلیل این رفتار پایتون همین Specializing Adaptive Interpreter هست. پایتون وقتی برای چندین بار تابع add رو با اعداد صحیح جمع میکند اون تابع رو برای دفعات بعدی بهینه سازی میکند (برای همین عملیات جمع بین دو عدد integer) و وقتی ما بهش به جای integer به عنوان آرگومان های ورودی، string ارسال میکنیم پایتون چون انتظار همون آرگومان های integer رو از ما داشت، بایت کد بهینه شده رو به حالت عمومیش (generic version) بر میگردونه (BINARY_OP) و از اون برای انجام عملیات جمع (+) بین این دو string استفاده میکنه ولی بایت کد فعلیش (specialized bytecode) رو حفظ میکنه چون این وضعیت (جمع دو string) رو به عنوان یک استثناء در نظر میگیره و اینطور پیش بینی میکنه که این وضعیت، یک وضعیت موقت هست و تابع add ممکنه باز هم در آینده با دو عدد integer اجرا بشه.حالا اگه ما بخواییم 100 بار از این تابع برای جمع دو string استفاده کنیم چی میشه!؟for _ in range(100):&#xA;    add(&#39;abc&#39;, &#39;xyz&#39;)&#xA;&#xA;dis.dis(add, adaptive=True)خروجی رو ببینیم : 23           0 RESUME_QUICK             0&#xA;&#xA; 24           2 LOAD_FAST__LOAD_FAST     0 (a) &#xA;              4 LOAD_FAST                1 (b) &#xA;              6 BINARY_OP_ADD_UNICODE     0 (+)&#xA;             10 RETURN_VALUEحالا در این بایت کد میبینیم که مفسر پایتون بایت کد  BINARY_OP_ADD_INT رو به BINARY_OP_ADD_UNICODE تغییر داده و اون رو برای جمع دو رشته بهینه سازی کرده است چون در این حالت پایتون مطمئن شده که دیگر آرگومان های ورودی integer نیستن و به string تغییر کردند پس بایت کد باید برای جمع دو string بهینه بشه. پس فهمیدیم که specialized adaptive interpreter به دنبال الگوها قابل بهینه سازی می‌گردد و بایت کد را بهینه سازی می‌کند تا در اجرا های آینده بتوانند به شکلی بهینه اجرا شوند. بایت کد های مختلفی مانند BINARY_OP وجود دارند که &#39;Adaptive Instructions&#39; نامیده می شوند و می توانند در زمان اجرا بهینه سازی یا اختصاصی شوند.نکته مهم: هنگام استفاده از dis، برای دیدن کد specialize شده حتما باید پارامتر adaptive رو برابر با True قرار بدید تا بایت کد بیهنه شده نمایش داده بشه!بسیار خب امیدوارم این توضیحات براتون مفید بوده باشه.برای مطالعه ی بیشتر این لینک ها مفید خواهند بود :PEP 659: Specializing Adaptive InterpreterPython 3.11 What&#39;s New: Specializing-adaptive-interpreter</description><category>Future Vision</category><author>Future Vision</author><pubDate>Tue, 30 Jan 2024 01:37:15 +0330</pubDate></item><item><title>سیستم مدیریت محتوای Wagtail</title><link>https://virgool.ir/@m2kappswindows8.1/سیستم-مدیریت-محتوای-wagtail-wqskin0mk02t</link><description>Wagtail cmsاگه یک برنامه نویس جنگو باشید احتمالا تا به حال اسم سیستم مدیریت محتوای Django CMS را شنیده اید. یک سیستم مدیریت محتوا که از جنگو قدرت گرفته و بر پایه ی جنگو ایجاد شده است. اما آیا ما تنها همین یک CMS رو در دنیای پایتون داریم؟ خیر!سیستم مدیریت محتوای Wagtail که با استفاده از زبان برنامه نویسی پایتون و بر پایه جنگو نوشته شده است، یکی دیگر از CMS های ایجاد شده با زبان پایتون هست که توجه‌های بسیاری رو به خودش جلب کرده و تونسته محبوبیت زیادی بین کمپانی های بزرگ و کاربران مختلف پیدا کنه و یکی از رقبای Django CMS به شمار می‌آید. سیستم مدیریت محتوای Wagtail یکی از پیشتازان سیستم های مدیریت محتوای Open-source هست که روز به روز در حال گسترش و رشد است. این CMS محبوب در سال 2015 توسط شرکت Torchbox معرفی شد که یکی از مشارکت کنندگان در توسعه ی جنگو است.اما چرا Wagtail ؟این سیستم مدیریت محتوای قابلیت های کاربردی و کارآمد زیادی دارد که میتونه شمارو جذب خودش کنه به چند مورد از این ویژگی ها در ادامه اشاره شده است :در این CMS احتیاج ندارید تا محتوای خود را برای مشاهده منتشر یا Publish کنید (مشابه وردپرس) تا قادر به دیدن تغییرات باشید بلکه با انتخاب گزینه ی Preview یا پیش‌نمایش میتوانید قبل از انتشار محتوای خود را بررسی کنید!سیستم Wagtail دارای قابلیتی هست که به تولیدکنندگان محتوا، این امکان را می دهد که خیالشان راحت باشد که محتوای آنها مدیریت میشود و همیشه می توانند نسخه مورد نظر محتوای خود را بازیابی کنند.سیستم مدیریت محتوای Wagtail رابطه خوبی با دیتابیس دارد و برای کوئری های شما کارایی بالایی دارد.سیستم مدیریت محتوای Wagtail قادر به آپلود چندین تصاویر است که شما میتوانید با Drag and Drop کردن آنها یا با انتخاب گزینه ی مورد نظر آنها را آپلود کنید.این سیستم مدیریت محتوا دارای یک سیستم هوشمند برای Copy and Paste هست. یعنی با استفاده از Wagtail می‌توانید متن پیوند شده یا از سایت‌ها، ایمیل‌ها یا اسناد دیگر را بدون نگرانی در مورد فاصله های مزاحم یا استایلی که سیستم‌های دیگر ممکن است داشته باشند کپی کنید و نگران بهم ریخته شدن آنها نباشید.سیستم Wagtail از ElasticSearch برای بالا بردن عملکرد و سرعت در جستجو استفاده میکند.و ...پروژه ی Wagtail دارای یک جامعه ی بزرگ، فعال و رو به رشد است که توسط کمپانی های بزرگی مانند :گوگلناساآکسفامموزیلاانجمن MITو ...استفاده شده است. اما خب با وجود تمام ویژگی های این CMS بازم یکسری معایب دارد!برای مثال Wagtail، ابزارای محدودتری نسبت به وردپرس دارد و شاید شما نیاز داشته باشید که یکسری از اونهارو خودتون توسعه بدید!در ادامه تصاویری از محیط Wagtail قرار گرفته است : بسیار خب حالا برای نصب این CMS باید چکار بکنیم ؟راه اندازی و نصب Wagtail بسیار راحت میباشد و تو چند مرحله انجام میشود :اول از همه با این دستور یک محیط مجازی یا ایزوله (Virtual Environment) ایجاد کنید :Windows: python -m venv venv&#xA;Linux: python3 -m venv venvبعد از ایجاد شدن محیط مجازی برای نصب Wagtail این دستور را وارد کنید :Windows: pip install wagtail&#xA;Linux: pip3 install wagtailبعد از نصب شدن Wagtail برای راه اندازی یک App جدید این دستور را در ترمینال خود وارد کنید :&gt;&gt;&gt; wagtail start mysiteحالا باید به پوشه ی اون App ایی که ساختید برید و Dependency های مربوط به App تون رو نصب کنید :&gt;&gt;&gt; cd mysite&#xA;&gt;&gt;&gt; pip install -r requirements.txtحالا برای migrate کردن مدل های Wagtail از این دستور استفاده کنید :&gt;&gt;&gt; python manage.py migrateحالا با زدن دستور زیر یک Super User ایجاد کنید :&gt;&gt;&gt; python manage.py createsuperuserدر نهایت بعد از وارد کردن اطلاعات مورد نیاز و ثبت اون ها با زدن دستور زیر Wagtail را اجرا و وارد پنل ادمین بشید :&gt;&gt;&gt; python manage.py runserverهمچنین شما میتونید تو این آدرس وبسایت هایی که با Wagtail ایجاد شده‌اند رو ببینید.Document: Welcome to Wagtail’s documentation — Wagtail Documentation 4.1.1 documentationGithub: wagtail/wagtail: A Django content management system focused on flexibility and user experience (github.com)</description><category>Future Vision</category><author>Future Vision</author><pubDate>Thu, 01 Dec 2022 20:46:55 +0330</pubDate></item><item><title>با استفاده از پایتون، فلاتر کد بزنید!</title><link>https://virgool.ir/fboard/با-استفاده-از-پایتون-فلاتر-کد-بزنید-q6hyaphajt9k</link><description>خب با دیدن عنوان این مقاله، شاید کمی گیج بشید که فلاتر چه ربطی به پایتون داره؟خب همه ما یا تقریبا اکثر ما اسم دارت و فلاتر رو شنیدیم. دارت یک زبان برنامه نویسی محبوب است که گوگل اونو توسعه داده و با استفاده از فریم‌ورک محبوبش، فلاتر، میتونید یکبار کد بزنید و برای تمام پلتفرم های : WindowsLinuxMacOSAndroidIOSWebخروجی native بگیرید.خب بریم سراغ پایتون...اخیرا فریم‌ورکی برای پایتون منتشر شده که یجورایی عجیب و جادوییه و ممکنه شمارو به وجد بیاره!اسم این فریم‌ورک flet هستش که با استفاده از اون میتونید مثل فلاتر، برنامه های Cross-Platform برای تمام  پلتفرم ها بنویسید!شما با استفاده از این فریم‌ورک، کم و بیش میتونید با پایتون برای پلتفرم هایی که در بالا ذکر شد، با یکبار کد زدن خروجی بگیرید!البته اشاره کنم که این فریم‌ورک از خود فلاتر قدرت گرفته و با Pure Python ساخته نشده!چند زبان محبوبی که در این فریم‌ورک بکار گرفته شده شامل :DartPythonGoمیباشد (البته محدود به همین 3 مورد نیست) و انتظار میره سرعت پایینی نداشته باشه. گفته شده برای استفاده از این فریم‌ورک هیچ تخصص خاصی از FrontEnd نیاز نیس و اگه شما پایتون کار میکنید میتونید به راحتی با استفاده از این فریم‌ورک ایده های خودتونو پیاده سازی کنید!خب بریم تا یک نمونه کد با استفاده از این فریم‌ورک رو ببینیم :خروجی این کد یه همچین چیزی خواهد بود :با اضافه کردن آرگومان view به این قسمت میتوان همین اپ رو داخل مرورگر اجرا کرد :flet.app(target=main, view=flet.WEB_BROWSER)همچنین در کنار ویژگی های خوب این نرم افزار انتظار میره در آینده ای نزدیک پایتون در حوزه ی اندروید هم پیشرفت کنه.ممنون از کسایی که این مقاله رو مطالعه کردن :Website : The fastest way to build Flutter apps in Python | FletDocumentation : Introduction | FletGithub : flet-dev/flet: Flet enables developers to easily build realtime web, mobile and desktop apps in Python. No frontend experience required. (github.com)</description><category>Future Vision</category><author>Future Vision</author><pubDate>Mon, 08 Aug 2022 20:45:52 +0430</pubDate></item><item><title>با PRegEx در پایتون regex را خواناتر بنویسید!</title><link>https://virgool.ir/Rocket/با-pregex-در-پایتون-regex-را-خواناتر-بنویسید-pppps2kmuo5x</link><description>اگه یه نیم نگاهی به تاریخچه‌ی زبان برنامه نویسی پایتون بندازیم، میبینیم که آقای Guido Van Rossum و دیگر Core Developer های پایتون، سعی و تاکید بر سادگی و خوانایی این زبان دارند، و به هر شکلی سعی میکنن تا این زبان سادگی و خوانایی خودشو حفظ کنه. اگه یه برنامه نویس پایتون باشید حتما متوجه این موضوع شدید که در پایتون پیاده‌سازی هر چیزی ممکن است آسان تر از بقیه زبان ها باشد (بدون تعصب و یا بد جلوه دادن زبان های دیگه) اما با این وجود در پایتون مباحثی هس که ممکنه حتی پیاده‌سازی اون‌ها با وجود سادگی این زبان کار دشوار و خسته‌کننده‌ای باشه. یکی از این مباحث، نوشتن یک الگوی عبارات منظم، یا همان Regular به اختصار regex) است که خب البته در این مورد ممکنه نوشتن یک الگوی regex در باقی زبان‌ها هم یک کار سخت و حوصله سر بر باشد.بیایید تا با یک مثلا جلو بریم :تصور کنید یک متن دارید که شامل یک یا چند URL میباشد و شما نیاز دارید تا آن URL هارا از متن استخراج کنید. برای مثال متن شما ممکن است به شکل زیر باشد :بسیار خب ما تو این متن دو URL داریم که میخواییم اون هارو استخراج کنیم. برای استخراج شون باید یک الگوی regex به این شکل بنویسیم :\b(?:https?://)?\w*(?:\.org/?|\.com/?)[^\s]+کد کامل این برنامه به شکل زیر است :Extract URL&#39;s from text in python using regexبه طور خلاصه : ما تو این الگو گفتیم بیا هر url ای که با http یا https شروع میشه و با org. یا com. تموم میشه رو از متن استخراج کن در نهایت تابع findall تمام اون url هارو به صورت لیست به ما تحویل میده.خب اگه به الگویی که برای regex نوشتیم نگاه کنید میبینید که میتونه چقدر سخت، ناخوانا و آزار دهنده باشه و اگه یکم الگوی شما رفته رفته پیچیده بشه موقع دیدنش انگار جن دیدید و ساعت ها باید بشنید و همه ی الگو هارو تجذیه کنید تا بفهمید چی به چیه ممکن ام هس حتی اینکارو نکنید و ولش کنید به امون خدا 8)خب شاید بگید پایتون همه چیو برای ما آسون کرده و کوتاهی نکرده پس چرا برای regex هیچ ابزاری نیس که بشه یکم خواناتر الگو نوشت و حداقل یکم Human-Readable باشه؟خب پس بذارید بهتون بگم که برای اینکارم ما تو پایتون ابزار داریم!!کتابخونه‌ی PRegExکتابخونه ی pregex که به تازگی منتشر شده یک کتابخونه برای کار با regex در پایتون به صورت Human-Readable تره..یعنی شما الگو های regex رو حدودا نزدیک تر به زبان انسان مینویسید.بیایید مثال بالارو با استفاده از این کتابخونه پیاده سازی کنیم :این کد دقیقا همون خروجی بالارو به ما میده اما تفاوتش اینه که خیلی خواناتره!ما الگوهای خودمونو با استفاده از چندتا کلاس پایتونی نوشتیم و دقیقا خروجی که میخواستیم رو بهمون دادخب حالا بیاییم ببینیم اون کلاس ها چکار میکنن :کلاس Optional: این کلاس میاد اون کاراکتر هایی که براش مشخص کردیم رو بر اساس الگویی که بهش میدیم اختیاری در نظر میگیره. (مطابق با ?)کلاس AtLeastOnce: اشاره داره به اینکه اون کاراکتر های ما طبق الگویی که تعیین کردیم یک یا بیشتر از یک بار تکرار شده یا نه. (مطابق با +)کلاس AnyButWhitespace: این کلاس کارش اینه که هر الگویی که شامل کاراکتر باشه رو برای ما میگیره به جز space ها یا همون فضا های خالی. (مطابق با S\)در نهایت تمام این الگو هارو به هم میچسبونیم و با استفاده از متد get_matches  عه آبجکت pre که یک نمونه از کلاس Pregex هس میاییم و اون الگویی که ساختیم رو داخل رشته مون اعمال میکنیم.البته نا گفته نمونه که خود این کتابخونه داره از ماژول re عه پایتون که جزو stdlib های پایتون هس استفاده میکنه اما به صورت یک Interface که در واقع برای آسون تر کردن نوشتن الگوهای regex هستممنون از کسایی که این مقاله رو مطالعه کردن :)منبع : PRegEx: Write Human-Readable Regular Expressions in Python | by Khuyen Tran | Jul, 2022 | Towards Data Scienceداکیومنت : What is pregex? — pregex 1.0.5 documentationگیتهاب : manoss96/pregex: PRegEx - Programmable Regular Expressions (github.com)</description><category>Future Vision</category><author>Future Vision</author><pubDate>Sun, 31 Jul 2022 13:40:38 +0430</pubDate></item><item><title>معرفی فریمورک blacksheep در پایتون</title><link>https://virgool.ir/@m2kappswindows8.1/معرفی-فریمورک-blacksheep-در-پایتون-fwl6mkvgkhwm</link><description>blacksheep frameworkبنظر شما سریع ترین فریم‌ورک وب در پایتون کدام است؟شاید برخی با شنیدن این سوال، ذهنشون بره سمت Django و FastAPI و یا Flask !اما خب پایتون برای وب کم کاری نکرده و فریم‌ورک و میکرو فریم‌ورک های زیاد برای توسعه در حوزه وب داره که خیلیاشون ناشناخته و یا کمتر شناخته شده هستن که ممکن ام هست حتی از فریمورکایی که میشناسیم هم قوی تر باشن!یکی از این فریم‌ورک ها، فریم‌ورک blacksheep هس که مقاله و ویدیوهای کمتری نسبت به باقی فریم‌ورک ها بهش پرداخته شده و تو این پست میخواییم یکم در موردش صحبت کنیم که بعد از خوندن این مقاله شاید شمارو به سمت خودش جذب کنه!مباحث پیشرو:تاریخچه و معرفیامنیتویژگی هابنچمارک هایک کد نمونه از این فریمورکنتیجه گیریتاریخچه و معرفیاین فریم‌ورک در سال 2018 توسط آقای RobertoPrevato با هدف مقیاس و سرعت بالا در کنار سادگی ارائه شد. 2 سال قبل از انتشار این فریم‌ورک یعنی در سال 2016 مقاله ای تحت عنوان uvloop: Blazing fast Python networking ارائه شد که به معرفی uvloop منجر شد. خب شاید اینجا براتون سوال پیش بیاد که uvloop چیه؟ uvloop یک drop-in replacement یا به اصطلاح یک جایگزین کننده برای event loop در asyncio هست که سرعت event loop هارو 2 الی 4 برابر بیشتر میکنه! خود asyncio به خودی خود باعث افزایش سرعت در کد های ما میشه حالا فک کنید این سرعت 2 الی 4 برابر بیشتر بشه چی میشه 8)....بسیار خب حالا بریم یکم از خود این فریم‌ورک بگیمفریم‌ورک blacksheep یک فریم‌ورک مبتنی بر async در پایتون است. استفاده از قابلیت async در کنار uvloop و پشتیبانی از وب سرور های asynchronous مانند uvicorn باعث شده تا این فریم‌ورک به یک فریمورک قدرتمند و پر سرعت تبدیل بشه و به عنوان یکی از Web Framework های مدرن امروزی شناخته بشه! این فریم‌ورک، یک فریم‌ورک general-purpose است که یعنی میشه با استفاده از این فریمورک انواع مختلف سایت ها و وب اپلیکیشن رو پیاده سازی کرد و توسعه داد. این فریم‌ورک پر قدرت سادگی خوشو از میکرو فریم‌ورک Flask به ارث برده و در قدرت از فریم‌ورک ASP.NET الهام گرفته! این فریم‌ورک در ابتدا شامل یک وب سرور HTTP داخلی بود، اما این مورد از این فریم‌ورک حذف شد و به جای اون سعی شد تا با وب سرورهای HTTP ASGI یا همون async خودمون سازگار بشه که بالاتر هم بهش اشاره شد. این کار باعث شد تلاش برای بهبود این فریم‌ورک بیشتر بشه و تمرکز فقط بر روی بهبود عملکرد و اضافه کردن قابلیت های بیشتر به این فریم‌ورک بشه و این روند باعث اضافه شدن پشتیبانی از HTTP2 شد. امنیتیکی از مؤلفه های مهم در حوزه ی تکنولوژی و مخصوصا حوزه ی وب ایجاد امنیت در اون حوزه هست. در بخش  بک اند وب اگه ما به صورت دستی بخواییم تمام پارامتر های امنیتی رو رعایت کنیم ممکنه زمان زیادی رو از ما بگیره و همچنین ممکنه ما به درستی نتونیم اون پارامتر هارو رعایت کنیم. اینجاست که یسری متخصص اومدن و فریم‌ورک هایی رو نوشتن و تمام این پارامتر هارو درون این فریم‌ورک ها رعایت کردن تا خیال مارو تا حدودی از پیاده سازی بحث امنیت راحت کنند اما نباید چون دیگه اون پارامتر ها از قبل برامون ایجاد شدن یسری مباحث رو رعایت نکنیم! خب سرتونو درد نمیارم :)ما گفتیم که تو فریم‌ورک ها یسری از پارامتر های امنيتی اعمال شدند..در این فریم‌ورک قضیه یکم فرق داره!این فریم‌ورک از یک سیاست امنیتی به نام Cross-Origin Resource Sharing یا به اختصار CORS تبعیت میکنه. خب این CORS چی هس حالا؟ CORS روشی رو تعریف می‌کنه که در اون مرورگر و سرور می‌تونن برای تعیین این که آیا اجازه دادن به درخواست cross-origin ایمن هس یا خیر، تعامل داشته باشن. این امکان آزادی و عملکرد بیشتری را نسبت به درخواست‌های کاملا یکسان فراهم می‌کنه، اما امن‌تر از اجازه دادن به همه درخواست‌های cross-origin هس! CORS یک سازوکار مبتنی بر HTTP-header عه که به سرور اجازه میده هر origins (دامنه، scheme یا پورت) رو که مرورگر باید از طریق اون اجازه بارگیری منابع به جز منبع خودشو بده، نشان بده. هم چنین به سازوکاری متکی هس که به وسیله اون مرورگرها یک درخواست «preflight» رو به سرور میزبان منبع متقابل میده تا بررسی کنن که آیا سرور درخواست واقعی را مجاز می کنه یا نه. در این درخواست «preflight»، مرورگر header هایی را می فرستد که نشان دهنده متد HTTP  و header هایی است که در درخواست واقعی از آن استفاده می شود. برای اطلاعات بیشتر این مقاله رو مطالعه کنید.ویژگی هاخب بریم یکمی از قابلیت های این فریم‌ورک رو مرور کنیم :پشتیبانی از معماری MVCپشتیبانی از نسخه 3 Yaml و Jsonآپدیت شده بر اساس آخرین نسخه های پایتون و همچنین پشتیبانی از پایتون نسخه 3.10سازگاری با وب سرور های ASGIپشتیبانی از Routingپشتیبانی از WebSocketپشتیبانی از exception هاپشتیبانی داخلی از احراز هویت JWT قابل ادغام با Jinja2پشتیبانی از Sessionsپشتیبانی از HTML5پشتیبانی از dataclassesدارای کلاس TestClient برای ساده سازی تست های برنامهبنچمارک ها:در ادامه چندتا از benchmark های صورت گرفته بین فریمورک های پایتون رو ببینیم :طبق بنچمارک های موجود این فریم‌ورک سرعت قابل توجهی داره!قابلیت دریافت 500000 هزار request در ثانیه و ارسال نزدیک به 100000 هزار response در ثانیه!! Community :این فریم‌ورک نسبت به فریم‌ورک های Django و FastAPI نسبتا Community کوچیکتر ولی رو به رشدی دارد که ممکن است در آینده بزرگتر شود.Example Code :تو تصویر پایین یک کد ساده رو میبینید که با استفاده از این فریم‌ورک نوشته شده که یک route رو ایجاد میکنهو یک Hello World به علاوه ی زمان جاری سیستم را بر اساس منطقه زمانی و بر اساس استاندارد ISO 8601 رو بر میگردونهنتیجه گیریخب دوستان سعی کردم تو این مقاله به معرفی یکی از فریم‌ورک های کمتر شناخته شده نسبت به جنگو و بقیه موارد رو بپردازم..البته دقت کنید دوستان که این فریم‌ورک با همه ویژگی ها و قدرتی که داره کامیونیتی کوچیک تری نسبت به مثلا جنگو یا FastAPI داره و اگه به مشکلی در این فریم‌ورک بخورید ممکنه اشکال یابی اون زمان بر بشه همچنین منابع یادگیری این فریم‌ورک نسبت به بقیه کمه که خب اینم بخاطر جدید بودن و نو ظهور بودن این فریم‌ورک هس..سعی کنید از چیزی که رسمی و معروفه و کامیونیتی بزرگی داره استفاده کنید و اگرم به این فریم‌ورک علاقه مند شدید میتونید تو یه روز تعطیل یا یه روزی که بیکارید برید داکیومنتشو بخونید و یاد بگیریددر ادامه لینک repo این فریمورک و همچنین لینک مربوط به داکیومنت این فریمورک رو قرار میدم.Github repo :Neoteroi/BlackSheep: Fast ASGI web framework for Python (github.com)Documentation :BlackSheep (neoteroi.dev)لینک مفید: Comparison of new Python web frameworks - DeepSourceدر آخر تشکر میکنم از کسایی که این مقاله رو تا انتها خوندن :)</description><category>Future Vision</category><author>Future Vision</author><pubDate>Sat, 07 May 2022 00:27:48 +0430</pubDate></item></channel></rss>