הפעלת Django בסביבה הרגילה של App Engine

אפליקציות Django שפועלות בסביבה הרגילה של App Engine משנות את קנה המידה שלהן באופן דינמי בהתאם לתנועת הגולשים.

במדריך הזה אנחנו יוצאים מנקודת הנחה שאתם מכירים את פיתוח האינטרנט ב-Django. אם אתם חדשים בפיתוח Django, מומלץ לעבור על כתיבת אפליקציית Django הראשונה לפני שתמשיכו.

במדריך הזה נדגים את Django באופן ספציפי, אבל אפשר להשתמש בתהליך הפריסה הזה עם מסגרות אחרות שמבוססות על Django, כמו Wagtail ו-Django CMS.

במדריך הזה משתמשים ב-Django 4, שמחייב לפחות Python 3.8. ‫App Engine standard תומך ב-Python 3.7 ומעלה, כולל Python 3.8.

מטרות

במדריך הזה תלמדו:

  • יצירה וחיבור של מסד נתונים ב-Cloud SQL.
  • יצירה ושימוש בערכי סודות ב-Secret Manager.
  • פריסת אפליקציית Django בסביבה הרגילה של App Engine.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  5. מתקינים את ה-CLI של gcloud.

  6. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  11. מתקינים את ה-CLI של gcloud.

  12. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  13. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  14. אם עוד לא עשיתם את זה, מאתחלים את App Engine ובוחרים את האזור המועדף:

    gcloud app create
    

הכנת הסביבה

שכפול של אפליקציה לדוגמה

הקוד של אפליקציית Django לדוגמה נמצא במאגר GoogleCloudPlatform/python-docs-samples ב-GitHub.

  1. אפשר להוריד את הדוגמה כקובץ ZIP ולחלץ אותה, או לשכפל את המאגר למכונה המקומית:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. עוברים לספרייה שמכילה את הקוד לדוגמה:

    ‫Linux/macOS

    cd python-docs-samples/appengine/standard_python3/django
    

    Windows

    cd python-docs-samples\appengine\standard_python3\django
    

אישור ההגדרה של Python

המדריך הזה מסתמך על Python להרצת אפליקציית הדוגמה במחשב. כדי להשתמש בקוד לדוגמה, צריך גם להתקין יחסי תלות

פרטים נוספים מופיעים במדריך לסביבת פיתוח בשפת Python.

  1. מוודאים שגרסת Python היא 3.8 לפחות.

     python -V
    

    צריך לראות גרסה Python 3.8.0 ומעלה.

  2. יוצרים סביבה וירטואלית של Python ומתקינים יחסי תלות:

    ‫Linux/macOS

    python -m venv venv
    source venv/bin/activate
    pip install --upgrade pip
    pip install -r requirements.txt
    

    Windows

    python -m venv venv
    venv\scripts\activate
    pip install --upgrade pip
    pip install -r requirements.txt
    

הורדת Cloud SQL Auth Proxy כדי להתחבר ל-Cloud SQL מהמחשב המקומי

כשפורסים את האפליקציה, היא משתמשת בשרת ה-proxy ל-Cloud SQL Auth שמוטמע בסביבת ברירת המחדל ב-App Engine כדי לתקשר עם המכונה של Cloud SQL. עם זאת, כדי לבדוק את האפליקציה באופן מקומי, אתם צריכים להתקין ולהשתמש בעותק מקומי של ה-proxy בסביבת הפיתוח. פרטים נוספים זמינים במדריך לשרת proxy ל-Cloud SQL Auth.

שרת proxy ל-Cloud SQL Auth משתמש ב-Cloud SQL API כדי ליצור אינטראקציה עם מכונת SQL. כדי לעשות את זה, נדרש אימות של האפליקציה באמצעות ה-CLI של gcloud.

  1. מאמתים ומקבלים פרטי כניסה ל-API:

    gcloud auth application-default login
    
  2. מורידים ומתקינים את שרת ה-proxy ל-Cloud SQL Auth במחשב המקומי.

    לפני שמתחילים, צריך לקבוע את הארכיטקטורה של המכונה.

    אם מריצים ב-Linux או ב-Mac, אפשר למצוא את זה על ידי הרצת הפקודה הבאה:

      uname -a
      

    ‏Linux‏ 64 סיביות

    1. מורידים את שרת ה-proxy ל-Cloud SQL Auth:
      curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.0/cloud-sql-proxy.linux.amd64
    2. הופכים את שרת ה-proxy ל-Cloud SQL Auth לקובץ הפעלה:
      chmod +x cloud-sql-proxy

    ‏Linux‏ 32 סיביות

    1. מורידים את שרת ה-proxy ל-Cloud SQL Auth:
      curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.0/cloud-sql-proxy.linux.386
    2. אם הפקודה curl לא נמצאה, מריצים את הפקודה sudo apt install curl וחוזרים על פקודת ההורדה.
    3. הופכים את שרת ה-proxy ל-Cloud SQL Auth לקובץ הפעלה:
      chmod +x cloud-sql-proxy

    macOS‏ 64 סיביות

    1. מורידים את שרת ה-proxy ל-Cloud SQL Auth:
      curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.0/cloud-sql-proxy.darwin.amd64
    2. הופכים את שרת ה-proxy ל-Cloud SQL Auth לקובץ הפעלה:
      chmod +x cloud-sql-proxy

    Mac M1

    1. מורידים את שרת ה-proxy ל-Cloud SQL Auth:
        curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.0/cloud-sql-proxy.darwin.arm64
        
    2. הופכים את שרת ה-proxy ל-Cloud SQL Auth לקובץ הפעלה:
        chmod +x cloud-sql-proxy
        

    ‏Windows‏ 64 סיביות

    לוחצים לחיצה ימנית על https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.0/cloud-sql-proxy.x64.exe ובוחרים באפשרות שמירת קישור בשם כדי להוריד את שרת ה-proxy ל-Cloud SQL Auth. משנים את שם הקובץ ל-cloud-sql-proxy.exe.

    ‏Windows‏ 32 סיביות

    לוחצים לחיצה ימנית על https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.0/cloud-sql-proxy.x86.exe ובוחרים באפשרות שמירת קישור בשם כדי להוריד את שרת ה-proxy ל-Cloud SQL Auth. משנים את שם הקובץ ל-cloud-sql-proxy.exe.

    קובץ אימג' של Docker לשרת proxy ל-Cloud SQL Auth

    לשרת ה-proxy ל-Cloud SQL Auth יש תמונות קונטיינר שונות, כמו distroless,‏ alpine ו-buster. קובץ האימג' של קונטיינר ברירת המחדל של Cloud SQL Auth Proxy משתמש ב-distroless, שלא מכיל מעטפת. אם אתם צריכים מעטפת או כלים קשורים, אתם יכולים להוריד תמונה שמבוססת על alpine או על buster. מידע נוסף זמין במאמר תמונות קונטיינר של Cloud SQL Auth Proxy.

    אפשר למשוך את התמונה העדכנית ביותר למחשב המקומי באמצעות Docker באמצעות הפקודה הבאה:

    docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.26.0
    

    מערכת הפעלה אחרת

    במערכות הפעלה אחרות שלא נכללות כאן, אפשר לקמפל את שרת ה-proxy ל-Cloud SQL Auth ממקור.

    אתם יכולים להעביר את ההורדה למיקום נפוץ, כמו מיקום ב-PATH או בספריית הבית. אם תבחרו לעשות זאת, כשתפעילו את שרת ה-proxy ל-Cloud SQL Auth בהמשך המדריך, הקפידו לציין את המיקום שבחרתם כשמשתמשים בפקודות cloud-sql-proxy.

יצירת שירותים תומכים

במדריך הזה נעשה שימוש בכמה שירותים Google Cloud כדי לספק את מסד הנתונים, את אחסון המדיה ואת אחסון הסודות שתומכים בפרויקט Django שנפרס. השירותים האלה נפרסים באזור ספציפי. כדי לשפר את היעילות בין השירותים, מומלץ לפרוס את כל השירותים באותו אזור. מידע נוסף על האזור הקרוב ביותר אליכם זמין במאמר מוצרים שזמינים לפי אזור.

במדריך הזה נעשה שימוש במנגנוני אירוח נכסים סטטיים משולבים ב-App Engine standard.

הגדרת מכונת Cloud SQL ל-PostgreSQL

‫Django תומך רשמית במספר מסדי נתונים רלציוניים, אבל התמיכה הכי טובה היא ב-PostgreSQL. ‫Cloud SQL תומך ב-PostgreSQL, ולכן במדריך הזה נבחר להשתמש בסוג הזה של מסד נתונים.

בקטע הבא מתואר תהליך היצירה של מכונת PostgreSQL, מסד נתונים ומשתמש במסד הנתונים עבור האפליקציה.

  1. יוצרים את מכונת PostgreSQL:

    המסוף

    1. נכנסים לדף Cloud SQL Instances במסוף Google Cloud .

      כניסה לדף Cloud SQL Instances

    2. לוחצים על Create Instance.

    3. לוחצים על Choose PostgreSQL (בחירת PostgreSQL).

    4. בקטע SQL Edition, בוחרים באפשרות Enterprise.

    5. בקטע הגדרה קבועה מראש של מהדורה, בוחרים באפשרות 'ארגז חול'.

    6. בשדה Instance ID (מזהה המופע), מזינים את הערך INSTANCE_NAME.

    7. מזינים סיסמה למשתמש postgres.

    8. משאירים את ערכי ברירת המחדל בשאר השדות.

    9. לוחצים על Create Instance.

    יחלפו כמה דקות עד שהמכונה תהיה מוכנה לשימוש.

    gcloud

    • יוצרים את מכונת PostgreSQL:

      gcloud sql instances create INSTANCE_NAME \
          --project PROJECT_ID \
          --database-version POSTGRES_16 \
          --tier db-n1-standard-2 \
          --region REGION
      

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫INSTANCE_NAME: שם המכונה של Cloud SQL
    • ‫PROJECT_ID: מזהה הפרויקט Google Cloud
    • ‫REGION: Google Cloud האזור

    יחלפו כמה דקות עד שהמכונה תיווצר ותהיה מוכנה לשימוש.

  2. בתוך המכונה שנוצרה, יוצרים מסד נתונים:

    המסוף

    1. בדף של המופע, עוברים לכרטיסייה Databases (מסדי נתונים).
    2. לוחצים על יצירת מסד נתונים.
    3. בתיבת הדו-שיח Database Name, מזינים DATABASE_NAME.
    4. לוחצים על יצירה.

    gcloud

    • יוצרים את מסד הנתונים במופע שנוצר לאחרונה:

      gcloud sql databases create DATABASE_NAME \
          --instance INSTANCE_NAME
      

      מחליפים את DATABASE_NAME בשם של מסד הנתונים בתוך המכונה.

  3. יוצרים משתמש במסד הנתונים:

    המסוף

    1. בדף של המופע, עוברים לכרטיסייה משתמשים.
    2. לוחצים על הוספת חשבון משתמש.
    3. בתיבת הדו-שיח בחירת שיטה לאימות בקטע 'אימות מובנה':
    4. מזינים את שם המשתמש DATABASE_USERNAME.
    5. מזינים את הסיסמה DATABASE_PASSWORD
    6. לוחצים על הוספה.

    gcloud

    • יוצרים את המשתמש במכונה שנוצרה לאחרונה:

      gcloud sql users create DATABASE_USERNAME \
          --instance INSTANCE_NAME \
          --password DATABASE_PASSWORD
      

      מחליפים את PASSWORD בסיסמה מאובטחת.

אחסון ערכים סודיים ב-Secret Manager

אחרי שמגדירים את שירותי הגיבוי, צריך לספק ל-Django מידע על השירותים האלה. במקום להזין את הערכים האלה ישירות בקוד המקור של Django, במדריך הזה נעשה שימוש ב-Secret Manager כדי לאחסן את המידע הזה בצורה מאובטחת.

יצירת קובץ סביבת Django כסוד ב-Secret Manager

אתם מאחסנים את ההגדרות שנדרשות להפעלת Django בקובץ env מאובטח. אפליקציית הדוגמה משתמשת ב-Secret Manager API כדי לאחזר את ערך הסוד, ובחבילה django-environ כדי לטעון את הערכים לסביבת Django. הסוד מוגדר כך שסביבת App Engine סטנדרטית תוכל לגשת אליו.

  1. יוצרים קובץ בשם .env, מגדירים את מחרוזת החיבור למסד הנתונים, את שם קטגוריית המדיה ואת הערך החדש של SECRET_KEY:

    echo DATABASE_URL=postgres://DATABASE_USERNAME:DATABASE_PASSWORD@//cloudsql/PROJECT_ID:REGION:INSTANCE_NAME/DATABASE_NAME > .env
    echo GS_BUCKET_NAME=PROJECT_ID_MEDIA_BUCKET >> .env
    echo SECRET_KEY=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1) >> .env
    
  2. מאחסנים את הסוד ב-Secret Manager:

    המסוף

    1. נכנסים לדף Secret Manager במסוף Google Cloud .

      מעבר לדף Secret Manager

    2. לוחצים על יצירת סוד.

    3. בשדה שם מזינים django_settings.

    4. בתיבת הדו-שיח Secret value, מדביקים את התוכן של קובץ .env.

    5. לוחצים על יצירת סוד.

    6. כדי למנוע ביטול של הגדרות מקומיות, צריך למחוק את הקובץ המקומי.

    gcloud

    1. יוצרים סוד חדש, django_settings, עם הערך של הקובץ .env:

      gcloud secrets create django_settings --data-file .env
      
    2. כדי למנוע שינויים מקומיים מברירת המחדל, מוחקים את הקובץ המקומי:

      rm .env
      
  3. הגדרת הגישה לסוד:

    המסוף

    1. לוחצים על הכרטיסייה Permissions.
    2. לוחצים על הענקת גישה.
    3. בשדה New Members (חברים חדשים), מזינים PROJECT_ID@appspot.gserviceaccount.com ולוחצים על Enter.
    4. בתפריט הנפתח Role, בוחרים באפשרות Secret Manager Secret Accessor.
    5. לוחצים על Save.

    gcloud

    נותנים גישה לסוד לחשבון השירות הסטנדרטי של App Engine:

      gcloud secrets add-iam-policy-binding django_settings \
          --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
          --role roles/secretmanager.secretAccessor
    

    בפלט, מוודאים שחשבון השירות החדש מופיע ברשימה bindings.

הפעלת האפליקציה במחשב המקומי

אחרי שמגדירים את שירותי הגיבוי, אפשר להריץ את האפליקציה במחשב. ההגדרה הזו מאפשרת פיתוח מקומי, יצירת משתמש על והחלת העברות של מסד נתונים.

  1. במסוף נפרד, מפעילים את שרת ה-proxy ל-Cloud SQL Auth:

    ‫Linux/macOS

    ./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAME
    

    Windows

    cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAME
    

    בשלב הזה נוצר חיבור מהמחשב המקומי למכונת Cloud SQL לצורכי בדיקה מקומית. חשוב להשאיר את Cloud SQL Auth Proxy פועל לאורך כל הבדיקה של האפליקציה באופן מקומי. הפעלת התהליך הזה בטרמינל נפרד מאפשרת לכם להמשיך לעבוד בזמן שהתהליך הזה פועל.

  2. בטרמינל המקורי, מגדירים את מזהה הפרויקט באופן מקומי (משמש את Secret Manager API):

    ‫Linux/macOS

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
    

    Windows

    set GOOGLE_CLOUD_PROJECT=PROJECT_ID
    
  3. מגדירים משתנה סביבה כדי לציין שמשתמשים בשרת proxy ל-Cloud SQL Auth (הערך הזה מזוהה בקוד):

    ‫Linux/macOS

    export USE_CLOUD_SQL_AUTH_PROXY=true
    

    Windows

    set USE_CLOUD_SQL_AUTH_PROXY=true
    
  4. מריצים את ההעברות של Django כדי להגדיר את המודלים והנכסים:

    python manage.py makemigrations
    python manage.py makemigrations polls
    python manage.py migrate
    python manage.py collectstatic
    
  5. מפעילים את שרת האינטרנט של Django:

    python manage.py runserver 8080
    
  6. בדפדפן, עוברים אל http://localhost:8080.

    אם אתם ב-Cloud Shell, לוחצים על הלחצן Web Preview (תצוגה מקדימה של אתר) ובוחרים באפשרות Preview on port 8080 (תצוגה מקדימה ביציאה 8080).

    בדף מוצג הטקסט: Hello, world. אתה נמצא באינדקס של הסקרים". שרת האינטרנט של Django שפועל במחשב שלכם מספק את הדפים של אפליקציית הדוגמה.

  7. לוחצים על Ctrl/Cmd+C כדי לעצור את שרת האינטרנט המקומי.

שימוש במסוף Admin של Django

כדי להתחבר למסוף Admin של Django, צריך ליצור משתמש על. מכיוון שיש לכם חיבור למסד הנתונים שאפשר לגשת אליו באופן מקומי, אתם יכולים להריץ פקודות ניהול:

  1. יוצרים משתמש על. תוצג בקשה להזין שם משתמש, כתובת אימייל וסיסמה.

    python manage.py createsuperuser
    
  2. מפעילים שרת אינטרנט מקומי:

    python manage.py runserver
    
  3. בדפדפן, עוברים לכתובת http://localhost:8000/admin.

  4. מתחברים לאתר הניהול באמצעות שם המשתמש והסיסמה שבהם השתמשתם כשביצעתם את הפקודה createsuperuser.

פריסת האפליקציה בסביבת ברירת המחדל ב-App Engine

אחרי שמגדירים את כל שירותי הגיבוי ובודקים את האפליקציה באופן מקומי, אפשר לפרוס את האפליקציה ב-App Engine standard:

  1. מעלים את האפליקציה על ידי הרצת הפקודה הבאה, שפורסת את האפליקציה כמו שמתואר במאמר app.yaml ומגדירה את הגרסה החדשה שנפרסה כגרסת ברירת המחדל, כך שהיא תציג את כל התנועה החדשה:
    gcloud app deploy
  2. כשמוצגת בקשה, מקלידים yes כדי לאשר את ההגדרות.
  3. מחכים להודעה שהעדכון הסתיים.
  4. פותחים את app.yaml ומעדכנים את הערך של APPENGINE_URL עם כתובת ה-URL של הפריסה:
    ...
    env_variables:
        APPENGINE_URL: https://PROJECT_ID.uc.r.appspot.com
    
  5. מעלים את השינויים בהגדרות:
    gcloud app deploy

הפעלת האפליקציה שנפרסה

האפליקציה נפרסה ועכשיו אפשר לגשת אליה:

  • פותחים את האתר שנפרס:

    gcloud app browse
    
  • אפשרות אחרת היא להציג את כתובת ה-URL ולפתוח אותה באופן ידני:

    gcloud app describe --format "value(defaultHostname)"
    

הבקשה שלכם מטופלת על ידי שרת אינטרנט שפועל בסביבת ברירת המחדל ב-App Engine.

עדכון האפליקציה

כדי לעדכן את האפליקציה, מבצעים שינויים בקוד ומריצים שוב את הפקודה gcloud app deploy.

הפריסה יוצרת גרסה חדשה של האפליקציה ומקדמת אותה לגרסת ברירת המחדל. הגרסאות הקודמות של האפליקציה נשארות. כל הגרסאות האלה של האפליקציה הן משאבים שחלים עליהם חיובים. כדי לצמצם את העלויות, מוחקים את הגרסאות של האפליקציה שלא מוגדרות כברירת מחדל.

הגדרה לסביבת הייצור

עכשיו יש לכם פריסת Django פעילה, אבל יש עוד פעולות שאתם יכולים לבצע כדי לוודא שהאפליקציה שלכם מוכנה לייצור.

השבתת ניפוי הבאגים

מוודאים שהמשתנה DEBUG ב-mysite/settings.py מוגדר ל-False. ההגדרה הזו תמנע הצגה של דפי שגיאה מפורטים למשתמש, כי הם עלולים לחשוף מידע על ההגדרות.

הגבלת ההרשאות של משתמש מסד הנתונים

לכל המשתמשים שנוצרים באמצעות Cloud SQL יש את ההרשאות שמשויכות לתפקיד cloudsqlsuperuser: CREATEROLE,‏ CREATEDB ו-LOGIN.

כדי למנוע ממשתמש מסד הנתונים של Django לקבל את ההרשאות האלה, צריך ליצור את המשתמש ב-PostgreSQL באופן ידני. צריך להתקין את הטרמינל האינטראקטיבי psql או להשתמש ב-Cloud Shell שבו הכלי הזה מותקן מראש.

המסוף

  1. במסוף Google Cloud , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

  2. ב-Cloud Shell, משתמשים בטרמינל המובנה כדי להתחבר למכונת INSTANCE_NAME:

    gcloud sql connect INSTANCE_NAME --user postgres
    
  3. מזינים את הסיסמה של משתמש postgres.

    המודל שלך כרגע הוא psql. אמורה להופיע ההנחיה postgres=>.

  4. יצירת משתמש:

    CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
    

    מחליפים את PASSWORD בסיסמה ייחודית ואקראית.

  5. נותנים למשתמש החדש הרשאות מלאות במסד הנתונים החדש:

    GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
    
  6. יציאה מ-psql:

    \q
    

gcloud

  1. מתחילים חיבור למכונת SQL:

    gcloud sql connect INSTANCE_NAME --user postgres
    

    מחליפים את INSTANCE_NAME במכונה של Cloud SQL שנוצרה.

  2. מזינים את הסיסמה של משתמש postgres.

    המודל שלך כרגע הוא psql. אמורה להופיע ההנחיה postgres=>.

  3. יצירת משתמש:

    CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
    
  4. נותנים למשתמש החדש הרשאות מלאות במסד הנתונים החדש:

    GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
    
  5. יציאה מ-psql:

    \q
    

הסבר על הקוד

אפליקציה לדוגמה

אפליקציית הדוגמה של Django נוצרה באמצעות כלי Django רגילים. הפקודות הבאות יוצרות את הפרויקט ואת אפליקציית הסקרים:

django-admin startproject mysite
python manage.py startapp polls

התצוגות, המודלים והגדרות הניתוב הבסיסיים הועתקו מתוך כתיבת האפליקציה הראשונה ב-Django (חלק 1 וחלק 2).

סודות מ-Secret Manager

הקובץ settings.py מכיל קוד שמשתמש ב-Secret Manager API בשפת Python כדי לאחזר את הגרסה העדכנית של הסוד שצוין, ולשלוף אותו לסביבה (באמצעות django-environ):

env = environ.Env(DEBUG=(bool, False))
env_file = os.path.join(BASE_DIR, ".env")

if os.path.isfile(env_file):
    # Use a local secret file, if provided

    env.read_env(env_file)
# ...
elif os.environ.get("GOOGLE_CLOUD_PROJECT", None):
    # Pull secrets from Secret Manager
    project_id = os.environ.get("GOOGLE_CLOUD_PROJECT")

    client = secretmanager.SecretManagerServiceClient()
    settings_name = os.environ.get("SETTINGS_NAME", "django_settings")
    name = f"projects/{project_id}/secrets/{settings_name}/versions/latest"
    payload = client.access_secret_version(name=name).payload.data.decode("UTF-8")

    env.read_env(io.StringIO(payload))
else:
    raise Exception("No local .env or GOOGLE_CLOUD_PROJECT detected. No secrets found.")

הסוד משמש לאחסון של כמה ערכי סוד כדי לצמצם את מספר הסודות השונים שצריך להגדיר.

הגדרות CSRF

ל-Django יש הגנה מובנית מפני זיוף בקשות באתרים שונים (CSRF). החל מ-Django 4.0, שינויים באופן הפעולה של המערכת מחייבים לציין ל-Django מה כתובת ה-URL של האירוח, כדי שהיא תוכל להציע את ההגנות הטובות ביותר למשתמשים ששולחים נתונים.

אתם מספקים את כתובת ה-URL של האפליקציה כמשתנה סביבה בקובץ settings.py. זה הערך ש-Django משתמשת בו להגדרות הרלוונטיות.

# SECURITY WARNING: It's recommended that you use this when
# running in production. The URL will be known once you first deploy
# to App Engine. This code takes the URL and converts it to both these settings formats.
APPENGINE_URL = env("APPENGINE_URL", default=None)
if APPENGINE_URL:
    # Ensure a scheme is present in the URL before it's processed.
    if not urlparse(APPENGINE_URL).scheme:
        APPENGINE_URL = f"https://{APPENGINE_URL}"

    ALLOWED_HOSTS = [urlparse(APPENGINE_URL).netloc]
    CSRF_TRUSTED_ORIGINS = [APPENGINE_URL]
    SECURE_SSL_REDIRECT = True
else:
    ALLOWED_HOSTS = ["*"]

שינויים מקומיים מברירת המחדל של סודות

אם נמצא קובץ .env במערכת הקבצים המקומית, הוא ישמש במקום הערך מ-Secret Manager. יצירת קובץ .env באופן מקומי יכולה לעזור בבדיקות מקומיות (למשל, פיתוח מקומי מול מסד נתונים של SQLite או הגדרות מקומיות אחרות).

חיבור למסד נתונים

הקובץ settings.py מכיל את ההגדרות של מסד הנתונים של SQL. הוא משתמש בעזר env.db() מ-django-environ כדי לטעון את מחרוזת החיבור שהוגדרה ב-DATABASE_URL להגדרה DATABASES.

כשמריצים את האפליקציה באופן מקומי ומשתמשים בשרת proxy ל-Cloud SQL Auth כדי לגשת למסד הנתונים המתארח, הדגל USE_CLOUD_SQL_AUTH_PROXY משנה את הגדרות מסד הנתונים כך שישתמשו בשרת ה-proxy.

# Use django-environ to parse the connection string
DATABASES = {"default": env.db()}

# If the flag as been set, configure to use proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

תוכן סטטי שמתארח

הקובץ app.yaml מכיל מידע על התצורה של הפריסה ב-App Engine. קובץ app.yaml הזה מציין ש-App Engine מציג קבצים סטטיים מהספרייה static/:

runtime: python313

env_variables:
  # This setting is used in settings.py to configure your ALLOWED_HOSTS
  # APPENGINE_URL: PROJECT_ID.uc.r.appspot.com

handlers:
# This configures Google App Engine to serve the files in the app's static
# directory.
- url: /static
  static_dir: static/

# This handler routes all requests not caught above to your main app. It is
# required when static routes are defined, but can be omitted (along with
# the entire handlers section) when there are no static files defined.
- url: /.*
  script: auto

כשמריצים את האפליקציה באופן מקומי עם DEBUG מופעל, הקבצים האלה מוגשים באופן מקומי על ידי Django:

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("", include("polls.urls")),
    path("admin/", admin.site.urls),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.

מחיקת הפרויקט

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

המאמרים הבאים