Python حرفه‌ای: ساخت وب‌سایت شخصی - بخش سوم

Professional Python: Build a Personal Website - Part 3

14 فروردین 1400
درسنامه درس 37 از سری پایتون حرفه‌ای
Python حرفه ای: ساخت وب سایت شخصی - بخش سوم (قسمت 37)

نگاهی خلاصه به دنیای پایگاه های داده

ما در چند قسمت قبل در حال شبیه سازی یک پایگاه داده بوده ایم. چه فایل های txt و چه فایل های csv تنها منبعی برای نوشتن داده ها بودند. ما به این کار، یعنی نوشتن داده ها روی هارد دیسک، data persistence می گوییم. پایگاه های داده نیز دقیقا به همین شکل عمل کرده و داده های ما را persist می کنند (یعنی در هارد دیسک ذخیره می کنند) اما همانطور که حدس می زنید بسیار پیچیده تر از یک فایل txt بوده و قابلیت های بی شماری را به ما می دهند. کار پایگاه های داده به صورت تخصصی این است که از داده های شما مراقبت کرده و در صورت نیاز در سریع ترین حالت ممکن آن را به شما برسانند. بگذارید کمی به عقب برگردیم.

تمام کمپانی های دنیا نیاز به ذخیره داده دارند و این مسئله اصلا مبحث جدیدی نیست. زمانی که هنوز خبری از کامپیوتر ها نبود، داده ها در قالب بایگانی و آرشیو ذخیره می شدند (کابینت هایی بزرگ که پر از پرونده بودند) البته این روش هنوز هم در بسیاری از قسمت های یک شرکت رایج است و هنوز به نقطه ای نرسیده ایم که بخواهیم همه چیز را الکترونیکی کنیم. با این همه هنوز هم بیشتر داده های یک شرکت به صورت الکترونیکی ذخیره می شوند بنابراین به راهی برای ذخیره کردن داده ها نیاز داریم.

در حالت عادی یک وب سایت ساده سه قسمت دارد:

  • قسمت front-end: این قسمت همان کد های HTML و CSS و JavaScript است که ظاهر سایت ما را تشکیل می دهند و درون مرورگر کاربر اجرا می شوند.
  • قسمت back-end: این قسمت مسئولیت مدیریت سایت را بر عهده دارد و مغز یا منطق سایت است. ما این قسمت را با زبان پایتون یا node.js یا PHP و امثال آن می نویسیم (در پروژه خودمان همان فایل server.py).
  • پایگاه داده: این قسمت یک سرور پایگاه داده است که برنامه پایگاه داده شما روی آن قرار خواهد داشت. توجه داشته باشید که منظور ما از «سرور» یک سرور نرم افزاری نیست نه اینکه پایگاه داده در یک سرور فیزیکی جداگانه قرار داشته باشد (گرچه می توانیم برای وب سایت های بزرگ سرور پایگاه داده را از سرور اصلی جدا کنیم).

قبلا توضیح دادم که ما در سایت خود یک فرم contact یا «تماس با ما» را داریم و این فرم داده های کاربر را دریافت می کند اما این داده ها باید در جایی ذخیره شوند چرا که در حالت عادی اسکریپت سرور ما روی مموری قرار دارد بنابراین با توقف سرور تمام داده ها حذف می شوند. همچنین متغیر ها همیشه در مموری باقی نمی مانند چرا که زبان هایی مانند پایتون garbage collection خودکار دارند.

در دنیای توسعه وب، پایگاه های داده بسیار متفاوتی وجود دارند اما مشهورترین آن ها در سال ۲۰۲۱ پایگاه های داده MySQL و MongoDB و PostgreSQL و Redis هستند. البته اگر بخواهیم به صورت دقیق تر صحبت کنیم  MySQL و MongoDB و PostgreSQL و Redis یک DBMS هستند که مخفف database management system یا «سیستم مدیریت پایگاه داده» می باشد. DBMS ها نرم افزار های پیشرفته ای هستند که به شما اجازه می دهند با سرور پایگاه داده در ارتباط باشید اما من برای ساده تر شدن درک مطلب آن ها را پایگاه داده صدا خواهم زد. از بین تمام پایگاه های داده موجود معمولا دو نوع پایگاه داده شهرت بسیار بیشتری از بقیه پایگاه های داده دارند.

دسته اول RDBMS ها یا سیستم های مدیریت پایگاه داده رابطه ای (relational database management systems) هستند. این دسته از DBMS ها بر اساس روابط بین داده ها ساخته شده اند بنابراین دو دو شناسه اصلی دارند:

  • داده ها در RDBMS ها بر اساس یک ساختار کاملا مشخص و از پیش تعریف شده ذخیره می شوند. ما به این ساختار مشخص schema می گوییم.
  • این داده ها بر اساس چیزی به نام relation (رابطه بین داده ها) بین جدول های داده ای پخش می شوند.

از طرفی پایگاه های داده غیر رابطه ای مانند MongoDB به پایگاه های داده non-relational database مشهور هستند. در دنیای MySQL داده ها درون جدول (table) ذخیره می شوند اما در دنیای MongoDB به آن ها کالکشن (collection به معنی مجموعه) می گوییم. نکته جالب دیگری در مورد پایگاه داده MongoDB وجود دارد که آن را از پایگاه داده MySQL متفاوت می کند. پایگاه های داده MongoDB همگی schemaless هستند یعنی ساختار داده ها از قبل در آن ها مشخص نیست. به طور مثال در یک کالکشن واحد، می توانیم چندین و چند نوع داده مختلف با ساختارهای مختلف داشته باشیم اما در MySQL اینطور نیست. اگر قبلاً با پایگاه داده MySQL کار کرده باشید می دانید که ساختار داده های درون جدول در همان ابتدا مشخص می شوند و تغییر دادن ساختار جدول پس از گذشت زمانی مشخص، کار واقعاً سختی است. مزیتِ نداشتن ساختاری از قبل تعریف شده این است که پایگاه داده شما به همراه برنامه رشد می کند و از نظر مقیاس پذیری هیچ مشکلی نخواهید داشت.

به طور کل فلسفه MongoDB و MySQL دقیقا بر خلاف یکدیگر است. به طور مثال در MongoDB روابط بین داده ها یا relations بسیار کمتر از MySQL است، حتی می توانید هیچ ارتباطی بین داده های خود نداشته باشید. البته ذخیره داده ها بدون ساختار قبلی باعث بی نظمی پایگاه داده شما می شود بنابراین منظور ما از نداشتن ساختارِ قبلی، به هم ریختگی داده ها نیست بلکه منظور آزادی شما به عنوان توسعه دهنده در حین توسعه برنامه است.

طبیعتا این یک نگاه کلی به این دو پایگاه داده است و شما برای درک بهتر هر کدام باید به سراغ یادگیری تخصصی آن ها بروید. روکسو چندین و چند دوره مختلف را برای شما دارد بنابراین می توانید همین حالا شروع کنید.

deploy کردن سایت

حتما می پرسید deploy یعنی چه؟ به زبان ساده deploy کردن سایت یعنی قرار دادن آن روی یک سرور واقعی برای استفاده تمام مردم. هر وب سایت معمولا دو حالت یا مرحله اصلی دارد:

  • مرحله development یا توسعه: در این مرحله در حال کدنویسی سایت هستیم و فعلا استفاده از آن برای عموم مردم آزاد نیست.
  • مرحله production یا عملیات: در این مرحله کدنویسی سایت تمام شده است و حالا سایت برای همه باز شده است.

deploy کردن، یعنی انتقال سایت از مرحله development به مرحله production! در حال حاضر ما وب سایت خودمان را روی یک سرور تمرینی و محلی داریم اما نمی توانیم آدرس http://127.0.0.1:5000 را به کسی بدهیم. چرا؟ به دلیل اینکه 127.0.0.1 دقیقا برابر با localhost است! در حال حاضر اگر سرور شما در حال اجرا باشد (آدرس http://127.0.0.1:5000 در مرورگر برایتان باز شود) می توانید به آدرس http://localhost:5000 نیز بروید! هر دوی این آدرس ها یکی هستند. به زبان ساده localhost به کامپیوتر خودتان اشاره دارد بنابراین نمی توانید آدرسی که localhost باشد را به دیگران بدهید چرا که localhost در هر سیستم فقط به همان سیستم اشاره خواهد کرد.

این مسئله زمانی که در حال توسعه وب سایت خودمان هستیم (مرحله development) مشکلی ندارد اما بالاخره باید آن را روی یک سرور واقعی قرار بدهیم. طبیعتا فرآیند قرار دادن وب سایت روی یک سرور واقعی پیچیده است؛ ابتدا باید سرور را اجاره کنید و سپس عملیات deploy را انجام بدهید. این عملیات پیچیده نیاز به چندین مقاله و دوره خاص خودش را دارد بنابراین آموزش کامل آن برای ما در این مقاله مقدور نیست اما می توانیم از یک سرویس ساده و خودکار برای میزبانی سایت خودمان استفاده کنیم.

وب سایت pythonanywhere.com یکی از وب سایت های محبوب در این زمینه است که فرآیند deploy کردن را برایتان آسان تر می کند. خوشبختانه این وب سایت یک حساب رایگان را نیز در اختیار ما می گذارد بنابراین از آن برای انجام این کار استفاده می کنیم. البته این سرور رایگان بسیار محدود است و فقط برای تمرین استفاده می شود اما یک URL واقعی را به ما می دهد تا مشکل نداشتن URL را حل کنیم و وب سایت خود را روی یک سرور واقعی، هر چند ضعیف، قرار بدهیم. برای شروع به این وب سایت رفته و یک حساب جدید بسازید؛ ابتدا به این آدرس رفته و روی گزینه Create a beginner account کلیک نمایید. پس از انجام مراحل ثبت نام به داشبورد خود منتقل می شوید.

ما برنامه خود را با فریم ورک flask نوشته ایم بنابراین به صفحه زیر می رویم:

help.pythonanywhere.com/pages/Flask/

در این صفحه روش deploy کردن وب سایت های Flask توضیح داده شده است. من روش های مختلف را برای شما توضیح می دهم. در قدم اول وارد حساب کاربری تان در سایت pythonanywhere.com شوید. با انجام این کار وارد داشبورد خود خواهید شد که معمولا چهار قسمت دارد:

  • recent consoles: از این قسمت برای ارتباط با pythonanywhere از طریق ترمینال bash و امثال آن استفاده می شود. در این قسمت لیستی از دستورات کنسول خودتان را مشاهده خواهید کرد.
  • recent files: در این قسمت فایل های موجود در سرور خود را مشاهده خواهید کرد. از آنجایی که تازه ثبت نام کرده ایم به جز چند فایل تنظیمات فایلی نداریم. برای مشاهده این فایل ها باید روی گزینه browse files کلیک کنید. در ضمن محدودیت حجم فایل برای حساب ما ۱۰۰ مگابایت است.
  • recent notebooks: این قسمت مربوط به Jupyter Notebooks است که هنوز به آن نرسیده ایم و برای حساب ما نیز فعال نیست (حساب ما رایگان و محدود است).
  • all web apps: تمام وب سایت های ما در این قسمت نمایش داده می شوند و طبیعتا فعلا خالی هستند.

روش اول deploy در pythonanywhere

روش اول برای قرار دادن پروژه خودمان در  pythonanywhere این است که گزینه open web tabs را انتخاب کنید (از قمست all web apps) و سپس از صفحه باز شده روی گزینه add a new web app کلیک نمایید. زمانی که روی این گزینه کلیک نمایید اولین سوالی که از شما پرسیده می شود Your web app's domain name است. این صفحه به شما توضیح می دهد که به دلیل رایگان بودن حساب خود، توانایی ثبت دامنه خاصی را برای برنامه ما نداریم و  pythonanywhere از فرمول زیر برای ایجاد یک دامنه استفاده خواهد کرد:

username.pythonanywhere.com.

بنابراین اگر نام کاربری شما Ahmad باشد دامنه شما به شکل زیر خواهد بود:

Ahmad.pythonanywhere.com.

روی گزینه next کلیک کرده و به صفحه بعدی بروید. در این صفحه لیستی از فریم ورک های مختلف را مشاهده می کنید و از آنجایی که ما از Flask استفاده می کنیم، همین گزینه را انتخاب می کنیم. سپس به صفحه دیگری می روید که نسخه پایتون را می خواهد. من آخرین نسخه (3.8) را در این وب سایت انتخاب می کنم. در مرحله بعدی از شما خواسته می شود که آدرس فایل سرور مورد نظر خود را مشخص کنید. به طور پیش فرض آدرس زیر برایتان انتخاب شده است:

/home/Username/mysite/flask_app.py

من این نام را به شکل زیر تغییر می دهم:

/home/Username/mysite/server.py

حالا دوباره روی next کلیک کنید. با انجام این کار بعد از چند ثانیه سرور مورد نظرتان ساخته می شود و به صفحه monitoring منتقل می شوید. در این صفحه بخش های مختلفی مانند Traffic وجود دارد که ترافیک مصرفی توسط وب سایت شما را اندازه می گیرد اما برای ما بخش Code مهم است. یکی از گزینه های موجود در این بخش گزینه زیر است:

Source code:            /home/AmirZM/mysite                 Go to directory

از اینجا گزینه go to directory را بزنید. با این کار می توانید فایل های سایت خود را ببینید که فعلا فقط یک فایل server.py است. شما باید تمام فایل های پروژه خودمان (portfolio) را در این قسمت آپلود کنید. این کار آزار دهنده است! چرا؟ به دلیل اینکه این روش تنها برای وب سایت هایی است که کدنویسی شان به تازگی شروع شده است. یعنی اگر می خواهید از صفر شروع کنید باید از روش اول جلو بروید چرا که ساده ترین روش است اما اگر از قبل کد های سایت خود را نوشته اید باید به سراغ روش دیگری بروید.

روش دوم deploy در pythonanywhere

در روش دوم باید از گیت هاب استفاده کنیم. اگر می خواهید برنامه نویس بشوید، چه توسعه دهنده وب چه برنامه نویس ویندوز و الی آخر، باید حتما با Git و GitHub آشنا باشید. از طرفی ما در روکسو یک دوره گیت و گیت هاب نیز داریم بنابراین در صورت نیاز می توانید به آن مراجعه کرده و همه چیز را یاد بگیرید.

در اولین مرحله به پوشه پروژه خودتان (portfolio) رفته و نگاهی به محتویات آن بیندازید. همانطور که می دانید ما از virtual environment ها استفاده کرده ایم بنابراین ترمینال یا CMD را در همین مسیر باز کنید و مطمئن شوید که در virtual environment پروژه هستید. این کار با دستور زیر انجام می شد:

. venv/bin/activate

زمانی که وارد virtual environment شوید یک پرانتز در ابتدا ترمینال شما باز می شود بنابراین می دانید که در virtual environment هستید. حالا دستور زیر را اجرا کنید:

pip freeze > requirements.txt

این دستور باعث ساخت فایلی به نام requirements.txt در سیستم شما خواهد شد. فایل requirements.txt یکی از فایل های بسیار رایج در گیت هاب و برای پروژه های پایتون است. به نظر شما این فایل چیست؟ اگر آن را باز کنید محتوایی شبیه به محتوای زیر را در آن می بینید:

click==7.1.2

Flask==1.1.2

itsdangerous==1.1.0

Jinja2==2.11.3

MarkupSafe==1.1.1

Werkzeug==1.0.1

این لیستی از پکیج هایی است که پروژه ما به آن ها نیاز دارد. شماره ای که روبروی هر پکیج می بینید، نسخه آن پکیج است که در virtual environment شما وجود دارد. این فایل معادل فایل package.json در پروژه های Node.js است. ما می توانیم با استفاده از این فایل، محیط توسعه خود را در سیستم های دیگر نیز کپی کنیم.

در مرحله بعدی به گیت هاب رفته (قطعا باید حساب داشته باشید) و یک repository جدید بسازید. حالا باید تمام فایل های زیر را در این repository آپلود کنید:

  • database.csv
  • requirements.txt
  • server.py
  • پوشه static
  • پوشه templates

در مرحله بعدی آدرس repository خود (از نوع HTTPS) را کپی کنید. این آدرس با کلیک روی گزینه Code و انتخاب سربرگ HTTPS انجام می شود و شبیه به آدرس زیر است:

https://github.com/RediSearch/RediSearch.git

این آدرس متعلق به یک پروژه به نام RedisSearch در گیت هاب است و ربطی به کار ما ندارد. من آن را فقط به عنوان مثال برای شما قرار دادم. این مقدار برای repo من به شکل زیر است:

https://github.com/AmirZM/portfolio.git

حالا به داشبورد خود در pythonanywhere بروید و از قسمت recent consoles روی گزینه bash$ کلیک نمایید. با انتخاب این گزینه یک ترمینال bash برایتان باز می شود. حالا باید دستور زیر را در ترمینال تایپ کرده و enter بزنید:

git clone https://github.com/AmirZM/portfolio.git

طبیعتا به جای آدرس repository من باید آدرس repository خودتان را قرار دهید. با انجام این کار تمام فایل ها از repository گیت هاب روی سرور  pythonanywhere کپی می شود. حالا به داشبورد برگشته و از قسمت all web apps گزینه open web tab را انتخاب کنید. اگر مراحل «روش اول deploy» را انجام نداده اید، حالا باید این کار را انجام بدهید اما اگر این کار را انجام داده اید باید با اسکرول به انتهای صفحه و انتخاب گزینه delete username.pythonanywhere.com پروژه قبلی را حذف کنید و سپس مراحل روش اول را دوباره انجام بدهید. البته روش راحت تر این است که از قسمت code آدرس های source code و working directory را به آدرس جدید تغییر بدهید. به هر حال از هر روشی که استفاده می کنید باید آدرس فایل ها را به درستی به pythonanywhere بدهید.

در مرحله بعدی (پس از تنظیم آدرس ها) دوباره به ترمینال bash$ در pythonanywhere برگشته و دستور زیر را در آن تایپ کنید:

python3.8 my-virtualenv

این دستور یک virtual environment جدید را برایتان می سازد. به جای my-virtualenv می توانید از هر نام دیگری برای virtual environment خود استفاده کنید. پس از اینکه این عملیات تمام شد حالا دستور pip install flask را در ترمینال اجرا کنید. آخرین مرحله نیز باید دستور زیر را اجرا نمایید:

pip install -r requirements.txt

این دستور تمام پکیج های مورد نیاز پروژه ما را از فایل requirements.txt دریافت کرده و نصب خواهد کرد. اطلاعات بیشتر و جزئی تر در این صفحه موجود می باشد. توجه داشته باشید که باید در پوشه portfolio باشید تا بتوانید دستور بالا را اجرا کنید در غیر این صورت خطایی دریافت می کنید که چنین فایلی وجود ندارد (no such file or directory: requirements.txt).

حالا دوباره به داشبورد رفته و روی open web tab کلیک نمایید تا به قسمت monitoring بروید. در مرحله بعدی به دنبال بخش Virtualenv باشید و روی گزینه قرمز رنگ Enter path to a virtualenv, if desired کلیک کنید. حالا نام virtual environment خود را در این قسمت تایپ کنید. نام virtual environment من my-virtualenv بود بنابراین همین مقدار را تایپ کرده و تایید می کنم. با انجام این کار چنین مقداری را مشاهده خواهید کرد:

/home/username/.virtualenvs/my-virtualenv

آخرین مرحله این است که از همین صفحه monitoring و بخش Code روی لینک WSGI configuration file کلیک نمایید. با کلیک روی این فایل وارد فایلی متنی به شکل زیر می شوید:

# This file contains the WSGI configuration required to serve up your

# web application at http://<your-username>.pythonanywhere.com/

# It works by setting the variable 'application' to a WSGI handler of some

# description.

#

# The below has been auto-generated for your Flask project




import sys




# add your project directory to the sys.path

project_home = '/home/username/portfolio'

if project_home not in sys.path:

    sys.path = [project_home] + sys.path




# import flask app but need to call it "application" for WSGI to work

from server import app as application  # noqa

شما باید مقدار project_home را طوری تنظیم کنیم که دقیقا به پوشه portfolio اشاره کند. این قسمت باید به صورت خودکار برایتان تنظیم شده باشد اما اگر نشده بود باید آن را ویرایش کنید. حالا از صفحه monitoring روی گزینه سبز رنگ reload AmirZM.pythonanywhere.com کلیک کنید تا پروژه یک بار ریستارت شود.

سخن آخر

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

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

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.