این یک متن ترجمه شده ماشینی است که ممکن است حاوی خطا باشد!
Info
تقریباً تمام تنظیمات از اینجا گرفته شده است: Flask Quickstart
GitHub?
لطفاً کد خود را در GitHub قرار دهید!
برای اطلاعات مربوط به GitHub classroom، تیمها را بررسی کنید، در آنجا لینکی به یک repository خواهید یافت که میتوانید آن را به عنوان یک پروژه شروع کپی کنید.
کمی تئوری 💤😴
La oss se litt på teorien bak søvn. Hvorfor sover vi egentlig? Det er et spørsmål forskere har stilt seg i årevis, og svaret er ikke enkelt. Søvn er essensielt for mange viktige funksjoner i kroppen vår, inkludert:
- Restitusjon: Kroppen reparerer og gjenoppbygger seg selv under søvn.
- Hukommelse: Søvn spiller en viktig rolle i å konsolidere minner.
- Hormonregulering: Mange hormoner reguleres under søvn.
- Immunforsvar: Søvn styrker immunforsvaret.
Det finnes to hovedtyper søvn: REM-søvn (Rapid Eye Movement) og non-REM-søvn. REM-søvn er kjent for drømmer, mens non-REM-søvn er viktig for fysisk restitusjon. Søvnsyklusen består av flere faser av både REM- og non-REM-søvn, og en komplett syklus varer omtrent 90-120 minutter.
اجازه دهید کمی به تئوری پشت خواب نگاه کنیم. چرا اصلاً میخوابیم؟ این سوالی است که محققان سالهاست از خود میپرسند و پاسخ آن ساده نیست. خواب برای بسیاری از عملکردهای مهم در بدن ما ضروری است، از جمله:
- بهبودی: بدن در طول خواب خود را ترمیم و بازسازی میکند.
- حافظه: خواب نقش مهمی در تثبیت خاطرات ایفا میکند.
- تنظیم هورمونها: بسیاری از هورمونها در طول خواب تنظیم میشوند.
- سیستم ایمنی: خواب سیستم ایمنی را تقویت میکند.
دو نوع اصلی خواب وجود دارد: خواب REM (حرکت سریع چشم) و خواب غیر REM. خواب REM به خاطر رویاها شناخته میشود، در حالی که خواب غیر REM برای بهبودی فیزیکی مهم است. چرخه خواب شامل چندین مرحله از هر دو خواب REM و غیر REM است و یک چرخه کامل حدود 90-120 دقیقه طول میکشد.
Fun Fact: Hvorfor heter det Flask? 🤔
در اصل، Flask فقط یک شوخی اول آوریل بود (فقط یه شوخی برادر). این قرار بود یک شوخی بر اساس یک چارچوب از قبل موجود به نام “Bottle” باشد، اما آنقدر محبوب شد که به یک چارچوب واقعی تبدیل شد! (منبع: Wikipedia)
اول از همه، Flask چیست؟ Flask یک فریمورک سبکوزن برای ساخت برنامههای وب است. اگرچه سبکوزن است، اما این بدان معنا نیست که بد است! برعکس، در واقع دومین فریمورک پرکاربرد برای Python در بین فریمورکهای وب است. رتبه اول به Django میرسد.
به طور خلاصه: Flask به شما امکان ساخت یک سرور وب را میدهد!
وقتی سال گذشته با HTML/CSS/JavaScript کار میکردید، صفحات HTML را مستقیماً در مرورگر “اجرا” میکردید. به همین ترتیب، وقتی برنامههای Python میساختید، فقط فایلها را در VS Code اجرا میکردید.
اما حالا میخواهیم یک سرور وب، یعنی یک “بکاند” (کلمه تخصصی بزرگی، میدانم 🤓) بسازیم. این از Python برای “ارائه” صفحات وب HTML به یک کاربر استفاده میکند.
وبسرور؟ ارائه صفحات وب؟ چی؟ 😭
تا به حال فکر کردهاید وقتی مثلاً وارد https://youtube.com میشوید، دقیقاً چه اتفاقی میافتد؟ نه؟
تصور کنید که آدرس یک صفحه وب را در مرورگر خود مینویسید، چگونه تمام اطلاعات مربوط به محتوا، ظاهر صفحه و غیره را دریافت میکنید؟
پاسخ: یک وبسرور! 🖥️
کاربر (یعنی شما)، درخواست میکند که youtube.com را ببیند. بنابراین شما یک “درخواست” به یک وبسرور ارسال میکنید و میپرسید:
- 📞 “سلام، من میخواهم صفحه وب یوتیوب را ببینم، آیا آن را برای من دارید؟”
- 🖥️ “آها، یوتیوب؟ من آن را برای شما ارسال میکنم!” (شروع به ارسال حجم زیادی از اطلاعات)
- 📞 “خیلی ممنون، من صفحه وب را میبینم!”
Warning
این یک توضیح دقیق علمی نیست.
یعنی چیزی وظیفه دارد یک صفحه وب را به کاربر بازگرداند. اینجاست که وبسرور، یعنی برنامه Flask وارد تصویر میشود.
بخش 1 - نصب
PyCharm? Null problem!
اگر در PyCharm کار میکنید، میتوانید به سادگی نوع پروژه “Flask” را پیدا کرده و یک پروژه ایجاد کنید. به این ترتیب، میتوانید مستقیماً به بخش 2 بروید. در سایر ویرایشگرهای کد، احتمالاً باید Flask را به صورت دستی نصب کنید. با این حال، خواندن مطالب اینجا همچنان میتواند مفید باشد!
ترمینال را باز کنید. بررسی کنید که خط فرمان به پوشه صحیح اشاره میکند.
در ترمینال وارد کنید: pip install flask.
این flask را روی ماشین شما نصب میکند، pip install زمانی استفاده میشود که بخواهیم “بستهها” یا “کتابخانههای” خارجی را نصب کنیم.
یک فایل جدید با نام app.py ایجاد کنید. سپس کد زیر را در این فایل قرار دهید:
# imports
from flask import Flask
# ایجاد یک سرور flask
app = Flask(__name__)
# ما یک "مسیر" برای صفحه اصلی که "/" است ایجاد میکنیم
@app.route("/")
def hello():
return "Hello World!"
# در حال حاضر فقط از این برای شروع برنامه استفاده میکنیم
if __name__ == "__main__":
app.run(debug=True)
این کد چه کار میکند؟
ابتدا باید Flask را وارد کنیم. اگر این برای شما کار نمیکند، ممکن است مرحله ۲ را اشتباه انجام داده باشید.
بعد از آن باید یک app ایجاد کنیم، یعنی یک “سرور وب” که میتوانیم “درخواستها” را به آن ارسال کنیم. اصطلاحات تخصصی زیادی در اینجا وجود دارد، اما مهمترین چیزی که باید بدانید این است که این یک برنامه است که میتواند دادهها را ارسال و دریافت کند.
Info
لطفاً نام متغیر را “app” بگذارید. از نظر فنی میتوانید آن را هر نامی بگذارید، اما اگر بعداً چیزی گیجکننده شد، تقصیر من نیست! ☝️🤓
سپس یک تابع با یک “route” داریم. بعداً به این موضوع برمیگردیم. اما یک route فقط چیزی است که کمی اطلاعات را دریافت میکند و چیز دیگری را برمیگرداند.
در نهایت برنامه را با app.run() اجرا میکنیم. debug=True فقط به Flask میگوید که باید گزارشهای اضافی برای کارهایی که در حال انجام است، از جمله کارهایی که اشتباه پیش میروند، چاپ کند. هنگام انتشار یک برنامه Flask، حتماً آن را به debug=False تغییر دهید.
برنامه را اجرا کنید. در ترمینال باید لینکی به شکل زیر را ببینید: http://127.0.0.1:5000. روی آن کلیک کنید یا آن را در مرورگر خود وارد کنید، چه چیزی ظاهر میشود؟
هیچ اتفاقی نمیافتد!
- آیا مرحله ۲ را انجام دادهاید؟
- آیا پایتون را نصب کردهاید؟
Del 2 - Routes ساده
اکنون که یک برنامه پایه داریم، به اولین مفهوم Flask میپردازیم: “Routes”!
“Route”، این چیست؟
یک “route” یا “مسیر”، مکانی است که میتوانید در یک وبسایت به آن بروید. برای مثال، اگر nettside.no/hjelp را داشته باشید، “/hjelp” یک route است.
مسئله 1 - مسیرهای پایه
بیایید یک مسیر پایه اضافه کنیم. ما یک مسیر ایجاد خواهیم کرد که اگر /joke را در آدرس وبسایت وارد کنید، یک جوک به شما میدهد.
در اینجا باید از یک مفهوم جدید پایتون استفاده کنیم که قبلاً ندیدهاید! یک decorator. این یک تابع خاص است که عملکرد یک تابع از قبل موجود را بدون تغییر خود تابع، اصلاح یا گسترش میدهد.
به کد زیر نگاه کنید:
@app.route("/joke")
def joke():
# این یک شوخی ساده است.
return "Why did the chicken cross the road? Buck if I know!"
در اینجا میتوانید ببینید که ما @app.route("/joke") را اضافه کردهایم. این decorator به app ما میگوید که این تابع باید یک route با مقدار /joke باشد.
این کد را بعد از @app.route("/") اضافه کنید. سعی کنید کد را اجرا کنید، چه اتفاقی میافتد؟ در حال حاضر، هیچ! اما تمام چیزی که برای دریافت جوک فوقالعاده خندهدار خود نیاز دارید این است که http://127.0.0.1:5000/joke را بنویسید. سپس به وبسرور گفتهاید که باید از /joke دریافت کند.
Løsning: Hele koden så langt
# imports
from flask import Flask
# opprett en flask server
app = Flask(__name__)
# vi lager en "rute" for hovedsiden som er "/"
@app.route("/")
def hello():
return "Hello World!"
# ny rute for å hente en vits
@app.route("/joke")
def joke():
return "Why did the chicken cross the road? Buck if I know!"
# for øyeblikket bruker vi bare dette for å starte programmet
if __name__ == "__main__":
app.run(debug=True)
راه حل: کل کد تا کنون
# وارد کردنها from flask import Flask # ایجاد یک سرور فلاسک app = Flask(__name__) # ما یک "مسیر" برای صفحه اصلی که "/" است ایجاد میکنیم @app.route("/") def hello(): return "Hello World!" # مسیر جدید برای دریافت یک جوک @app.route("/joke") def joke(): return "Why did the chicken cross the road? Buck if I know!" # در حال حاضر فقط از این برای شروع برنامه استفاده میکنیم if __name__ == "__main__": app.run(debug=True)
ما بعداً خواهیم دید که چگونه میتوان کل صفحات وب را از طریق این موارد در Level 2 ارسال کرد.
وظیفه 2 - مسیرها با پارامترها
مسیرها نیازی ندارند که ایستا باشند. در واقع، ما میتوانیم چیزی را که پارامتر نامیده میشود را به مسیرها ارسال کنیم.
به عنوان مثال، ما یک مسیر در وبسایت ایجاد خواهیم کرد که به نامی که وارد میشود سلام میکند.
به کد زیر نگاه کنید:
@app.route("/hello/<name>")
def hello_name(name):
# این تابع یک پیام خوشامدگویی را با نام داده شده برمیگرداند.
return "Hello " + name
در اینجا از پرانتزهای تمساحی برای نشان دادن اینکه این باید یک پارامتر باشد استفاده میکنیم. <name> در این مورد میتواند هر نوع مقداری را بپذیرد.
این کد را در app.py قرار دهید، کد را اجرا کنید، به مرورگر بروید و موارد زیر را امتحان کنید:
http://127.0.0.1:5000/hello/Bob.
چه اتفاقی میافتد؟ نامهای دیگری را هم امتحان کنید!
Løsning: Hele koden så langt
# imports
from flask import Flask
# opprett en flask server
app = Flask(__name__)
# vi lager en "rute" for hovedsiden som er "/"
@app.route("/")
def hello():
return "Hello World!"
# ny rute for å hente en vits
@app.route("/joke")
def joke():
return "Why did the chicken cross the road? Buck if I know!"
# hei på deg!
@app.route("/hello/<name>")
def hello_name(name):
return "Hello " + name
# for øyeblikket bruker vi bare dette for å starte programmet
if __name__ == "__main__":
app.run(debug=True)
راه حل: کل کد تا کنون
# imports
from flask import Flask
# ایجاد یک سرور فلاسک
app = Flask(__name__)
# ما یک "مسیر" برای صفحه اصلی که "/" است ایجاد می کنیم
@app.route("/")
def hello():
return "Hello World!"
# مسیر جدید برای دریافت یک جوک
@app.route("/joke")
def joke():
return "Why did the chicken cross the road? Buck if I know!"
# سلام به شما!
@app.route("/hello/<name>")
def hello_name(name):
return "Hello " + name
# در حال حاضر فقط از این برای شروع برنامه استفاده می کنیم
if __name__ == "__main__":
app.run(debug=True)
YouTube eksempel
اگر مثال یوتیوب قبلی را در نظر بگیریم، شاید بتوانید تصور کنید که چگونه سرور وب میداند کدام ویدیو را باید به شما نشان دهد.
به طور خلاصه، لینکهای یوتیوب به این شکل هستند:
https://www.youtube.com/watch?v=<video_id>
در اینجا <video_id> یک پارامتر است که به سرور وب میگوید کدام ویدیو را باید ارسال کند. بنابراین، سرور وب تمام چیزی را که کاربر میخواهد دریافت کند، مدیریت میکند.
مسئله 3 - انواع پارامتر
در حال حاضر، هنگام نوشتن یک پارامتر با <parameter>، مقدار آن همیشه به عنوان یک نوع string، یعنی متن، تفسیر میشود.
انواع؟ این چیست؟
انواع چیزی نیست که قبلاً زیاد در مورد آن صحبت کرده باشیم، اما مهمترین چیزی که باید بدانید این است که همه متغیرها به یک شکل کار نمیکنند.
تصور کنید از شما خواسته شود که دو فیل و کلمه “پرتقال” را با هم جمع کنید. در واقع پاسخ چیست؟ پاسخ این است که کار نمیکند، زیرا از ابتدا هیچ معنایی ندارد!
در پایتون میتوانیم اینطور ببینیم:
antall_elefanter = 2
frukt = "appelsin"
print(antall_elefanter + frukt) # این کار نمیکند!!
چرا کار نمیکند؟!
زیرا، antall_elefanter و frukt دو نوع کاملاً متفاوت هستند. یکی عدد است (integer یا int به زبان تخصصی)، و دیگری متن است (string به زبان تخصصی). ما نمیتوانیم یک int و یک string را با هم جمع کنیم!
پارامترهای مسیر ویژگیهای متعددی دارند. ما میتوانیم “نوع” پارامتر را مشخص کنیم!
به کد زیر نگاه کنید:
@app.route("/calculate/<int:num>")
def calculate(num):
# Denne ruten dobler tallet som sendes inn.
# این مسیر عددی را که ارسال میشود دو برابر میکند.
return str(num * 2)
این کد یک عدد را میگیرد و آن را در 2 ضرب میکند.
این کد را در app.py قرار دهید، کد را اجرا کنید، به مرورگر بروید و موارد زیر را امتحان کنید:
http://127.0.0.1:5000/calculate/3.
چه پاسخی دریافت میکنید؟ اعداد دیگری را هم امتحان کنید و ببینید چه اتفاقی میافتد!
Løsning: Hele koden så langt
# imports
from flask import Flask
# opprett en flask server
app = Flask(__name__)
# vi lager en "rute" for hovedsiden som er "/"
@app.route("/")
def hello():
return "Hello World!"
# ny rute for å hente en vits
@app.route("/joke")
def joke():
return "Why did the chicken cross the road? Buck if I know!"
# hei på deg!
@app.route("/hello/<name>")
def hello_name(name):
return "Hello " + name
# kalkulator!
@app.route("/calculate/<int:num>")
def calculate(num):
return str(num * 2)
# for øyeblikket bruker vi bare dette for å starte programmet
if __name__ == "__main__":
app.run(debug=True)
درباره return و Flask
شاید اینجا ببینید که ما مینویسیم return str(num * 2).
Flask همیشه انتظار دارد یک پاسخ HTTP معتبر دریافت کند. یک عدد ساده یک پاسخ معتبر نیست. Flask انتظار دارد یک string، یعنی متن، را برگرداند.
اطلاعات بیشتر درباره return و Flask
شما همچنین میتوانید یک کد وضعیت را در اینجا برگردانید، اما این چیزی نیست که بخواهیم در حال حاضر در مورد آن صحبت کنیم. میتوانید این کار را با نوشتن return "Hallo", 200 انجام دهید. 200 فقط به این معنی است که همه چیز خوب و طبق انتظار پیش رفته است. اگر در مورد معنای کدهای وضعیت کنجکاو هستید، کدهای وضعیت ویکیپدیا را بررسی کنید.
int typen
توجه داشته باشید که در پارامتر اینجا <int:num> نوشته شده است.
پارامترها میتوانند به این شکل نوشته شوند: <type:navn>. در این کد، نوع int است، که اصطلاح تخصصی برای integer، یعنی یک عدد صحیح، است.
لیست انواع در Flask
| نوع | چیست؟ | مثالها |
|---|---|---|
<string:name> | (پیشفرض) تمام متن به جز / | "heisann", "Bob", "Kåre" |
<int:number> | اعداد صحیح مثبت. | 2, 4, 47, 214 |
<float:decimal> | اعداد اعشاری (اصطلاح تخصصی: اعداد ممیز شناور) | 2.4, 3.7, 44.213 |
<path:value> | شبیه به string اما / را نیز میپذیرد | "heisann/hoppsann" |
<uuid:user_id> | رشتههای “UUID” را میپذیرد | 550e8400-e29b-41d4-a716-446655440000 |
مهم است به خاطر داشته باشید که نام بعد از : میتواند هر چیزی باشد.
مسئله 4 - ماشین حساب ساده
بیایید مسیر calculate خود را کمی ارتقا دهیم! شما میتوانید پارامترهای بیشتری را نیز در یک مسیر دریافت کنید! سعی کنید دو پارامتر به مسیر calculate اضافه کنید، یکی با نام num1 و دیگری با نام num2. سپس، اعداد را با هم جمع کنید و آنها را به وبسایت برگردانید.
Løsning
@app.route("/calculate/<int:num1>/<int:num2>")
def calculate(num1, num2):
return str(num1 + num2)
این یک مثال از نحوه پیادهسازی یک مسیر در Flask است که دو عدد را به عنوان پارامتر میگیرد و مجموع آنها را برمیگرداند.
مسئله 5 - ماشین حساب توسعه یافته
در نهایت، سعی کنید یک ماشین حساب بسازید که بتوانید از +، -، *، / استفاده کنید.
میتوانید یا از کلماتی مانند add، subtract استفاده کنید یا از کاراکترها.
سعی کنید آن را با استفاده از فقط یک مسیر (route) حل کنید! (شما می توانستید def add(num1, num2) را ایجاد کنید، اما اینجا هدف این است که آن را با استفاده از فقط def calculate انجام دهید).
اضافی: مطمئن شوید که تقسیم بر صفر باعث خطا شود.
Løsning
@app.route("/calculate/<int:num1>/<string:op>/<int:num2>")
def calculate(num1, op, num2):
if op == "add":
return str(num1 + num2)
elif op == "subtract":
return str(num1 - num2)
elif op == "multiply":
return str(num1 * num2)
elif op == "divide":
# Ekstra, kult hvis du husket dette! 😎
if num2 == 0:
return "Can't divide by zero!!"
return str(num1 / num2)
Løsning: Hele koden
# imports
from flask import Flask
# opprett en flask server
app = Flask(__name__)
# vi lager en "rute" for hovedsiden som er "/"
@app.route("/")
def hello():
return "Hello World!"
# ny rute for å hente en vits
@app.route("/joke")
def joke():
return "Why did the chicken cross the road? Buck if I know!"
# hei på deg!
@app.route("/hello/<name>")
def hello_name(name):
return "Hello " + name
# kalkulator!
@app.route("/calculate/<int:num1>/<string:op>/<int:num2>")
def calculate(num1, op, num2):
if op == "add":
return str(num1 + num2)
elif op == "subtract":
return str(num1 - num2)
elif op == "multiply":
return str(num1 * num2)
elif op == "divide":
# Ekstra, kult hvis du husket dette! 😎
if num2 == 0:
return "Can't divide by zero!!"
return str(num1 / num2)
# for øyeblikket bruker vi bare dette for å starte programmet
if __name__ == "__main__":
app.run(debug=True)
تکالیف اضافی
Oppgave 1: Enkel datainnsamling
Denne oppgaven går ut på å samle inn data om dine daglige aktiviteter over en periode på 7 dager. Noter ned hva du gjør hver time, og hvor mye tid du bruker på hver aktivitet.
وظیفه ۱: جمعآوری دادههای ساده
این وظیفه شامل جمعآوری دادهها در مورد فعالیتهای روزانه شما در طی یک دوره ۷ روزه است. آنچه را که هر ساعت انجام میدهید و مدت زمانی که صرف هر فعالیت میکنید، یادداشت کنید.
Oppgave 2: Visualisering av data
Når du har samlet inn dataene, skal du visualisere dem ved hjelp av et diagram eller en graf. Dette kan gjøres for hånd, eller ved hjelp av et dataprogram som Excel eller Google Sheets.
وظیفه ۲: تجسم دادهها
پس از جمعآوری دادهها، آنها را با استفاده از نمودار یا گراف تجسم کنید. این کار میتواند به صورت دستی یا با استفاده از یک برنامه کامپیوتری مانند Excel یا Google Sheets انجام شود.
Oppgave 3: Analyse av data
Analyser dataene du har samlet inn og visualisert. Hva kan du konkludere ut fra dataene? Er det noen mønstre eller trender du kan identifisere?
وظیفه ۳: تجزیه و تحلیل دادهها
دادههایی را که جمعآوری و تجسم کردهاید تجزیه و تحلیل کنید. چه نتیجهگیریهایی میتوانید از دادهها بگیرید؟ آیا الگو یا روندی وجود دارد که بتوانید شناسایی کنید؟
Oppgave 4: Rapportskriving
Skriv en kort rapport som oppsummerer dine funn. Rapporten skal inneholde en beskrivelse av datainnsamlingsmetoden, en presentasjon av dataene, og en analyse av funnene.
وظیفه ۴: نوشتن گزارش
گزارشی کوتاه بنویسید که یافتههای شما را خلاصه کند. گزارش باید شامل شرح روش جمعآوری دادهها، ارائه دادهها و تجزیه و تحلیل یافتهها باشد.
مسئله E1 - سلام سلام سلام سلام
مسیر /hello را تغییر دهید تا یک پیام منحصر به فرد بر اساس کسی که سلام میکند ارائه دهد.
تکلیف E2 - جوک تصادفی
مسیر /joke را تغییر دهید تا یک جوک تصادفی را از یک لیست از جوکها دریافت کند. (نیازی به تعداد زیادی جوک نیست، فقط نشان دهید که کار میکند)
مسئله E3 - (حتی بیشتر) ماشین حساب توسعه یافته
عملکردهای بیشتری را به ماشین حساب خود اضافه کنید، مانند توان، سینوس، کسینوس، محاسبه مساحت، یا هر چیزی که به آن فکر میکنید.
مسئله E4 - چه فایدهای دارد؟
مسیر /joke را بیشتر گسترش دهید تا بتواند یک “دسته بندی” از جوکها را بپذیرد، به طوری که بتوانید با نوشتن /joke/<category> یک جوک از آن نوع دریافت کنید. اگر فقط /joke را بنویسید، یک جوک تصادفی از هر دسته بندی دریافت خواهید کرد.
Hint
از لیستهای متعدد (یک لیست برای هر دسته) یا یک دیکشنری پایتون استفاده کنید. در مورد دیکشنریها اینجا بخوانید: Python Dictionaries