-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
71 lines (62 loc) · 5.37 KB
/
app.py
File metadata and controls
71 lines (62 loc) · 5.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# ==============================================================================
# קובץ השרת הראשי (app.py) - הגרסה המודולרית
# תפקידו: הגדרות, אתחול, וחיבור ה-Blueprints (החלקים השונים)
# זהו קובץ הכניסה הראשי שמריץ את השרת ומחבר את כל הרכיבים.
# ==============================================================================
import os # ספרייה סטנדרטית של פייתון לעבודה עם מערכת ההפעלה (נתיבים, תיקיות וכו')
from flask import Flask # ייבוא המחלקה הראשית של Flask ליצירת אפליקציית הוובר
from flask_jwt_extended import JWTManager # ייבוא מנהל האימות (JWT) לטיפול בטוקנים והתחברות
# מייבאים את המודלים (db, bcrypt) כדי לאתחל אותם
from models import db, bcrypt # ייבוא אובייקטי מסד הנתונים וההצפנה שיצרנו ב-models.py, כדי לחבר אותם לאפליקציה כאן
from dotenv import load_dotenv
# --- ייבוא ה-Blueprints שיצרנו בתיקיית routes ---
# Blueprints הם כמו תת-אפליקציות המכילות את הנתיבים השונים
from routes.auth import auth_bp # ייבוא המודול שאחראי על הרשמה והתחברות
from routes.recipes import recipe_bp # ייבוא המודול שאחראי על ניהול מתכונים
from routes.general import general_bp # ייבוא המודול הכללי (כמו דף הבית או פונקציות אדמין)
# 1. יצירת האפליקציה
app = Flask(__name__) # יצירת המופע הראשי של אפליקציית Flask
load_dotenv() # זה טוען את המשתנים מקובץ ה-.env לזיכרון
# ====================
# הגדרות (Configuration)
# כאן אנחנו קובעים משתנים גלובליים שישמשו את האפליקציה
# ====================
# ההגדרות נשארות כאן כדי שיהיו זמינות לכל האפליקציה דרך current_app
basedir = os.path.abspath(os.path.dirname(__file__)) # מציאת הנתיב המלא לתיקייה שבה נמצא הקובץ הנוכחי (app.py)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'recipes.db') # הגדרת מיקום קובץ מסד הנתונים (SQLite) בתוך התיקייה הראשית
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # כיבוי תכונה של SQLAlchemy שעוקבת אחרי שינויים באובייקטים, כדי לחסוך בזיכרון (לא נחוץ לנו)
app.config['JWT_SECRET_KEY'] = os.getenv('JWT_SECRET_KEY', 'fallback-key-for-local')
# הגדרות תיקיית ההעלאות
app.config['UPLOAD_FOLDER'] = os.path.join(basedir, 'static', 'images') # הגדרת הנתיב המלא לתיקייה שבה יישמרו תמונות המשתמשים
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif', 'webp'} # הגדרת סט (קבוצה) של סיומות קבצים מותרות להעלאה, מטעמי אבטחה
# ====================
# אתחול הרחבות (Extensions)
# חיבור הספריות החיצוניות (DB, הצפנה, JWT) למופע האפליקציה הספציפי שלנו
# ====================
db.init_app(app) # חיבור מסד הנתונים לאפליקציה שנוצרה
bcrypt.init_app(app) # חיבור ספריית ההצפנה לאפליקציה
jwt = JWTManager(app) # אתחול מנהל ה-JWT עם הגדרות האפליקציה (כמו המפתח הסודי)
# ====================
# יצירת מסד הנתונים ותיקיות
# פעולות שצריכות לקרות לפני שהשרת מתחיל לקבל בקשות
# ====================
with app.app_context(): # יצירת "הקשר אפליקציה" זמני. זה נדרש כדי לבצע פעולות על מסד הנתונים כשהשרת עוד לא ממש רץ.
db.create_all() # יצירת כל הטבלאות המוגדרות ב-models.py בתוך מסד הנתונים, אם הן לא קיימות.
# יצירת תיקיית התמונות הראשית אם לא קיימת
if not os.path.exists(app.config['UPLOAD_FOLDER']): # בדיקה האם תיקיית ההעלאות כבר קיימת במערכת הקבצים
os.makedirs(app.config['UPLOAD_FOLDER']) # אם היא לא קיימת, צור אותה (כולל תיקיות אב אם צריך)
# ====================
# חיבור החלקים (Register Blueprints)
# זה השלב שבו השרת "לומד" על הנתיבים החדשים
# אנחנו אומרים לאפליקציה הראשית להשתמש בנתיבים שהוגדרו בקבצים הנפרדים
# ====================
app.register_blueprint(auth_bp) # רישום המודול של האותנטיקציה (auth.py)
app.register_blueprint(recipe_bp) # רישום המודול של המתכונים (recipes.py)
app.register_blueprint(general_bp) # רישום המודול הכללי (general.py)
# ====================
# הרצת השרת
# ====================
if __name__ == '__main__': # תנאי שבודק האם הקובץ הזה מורץ ישירות (ולא מיובא כמודול לקובץ אחר)
# אם אנחנו במחשב האישי - debug יהיה True. בשרת אמיתי - False.
debug_mode = os.getenv('FLASK_DEBUG', 'True') == 'True'
app.run(debug=debug_mode, port=5000)