Django على Cloud Run

1. مقدمة

894762ebb681671c.png

Cloud Run هو نظام أساسي مُدار للحوسبة يتيح لك تشغيل حاويات لا تتضمّن حالة ويمكن استدعاؤها من خلال طلبات HTTP. ‫Cloud Run هي خدمة لا تستخدِم الخوادم، فهي تزيل كل عمليات إدارة البنية الأساسية، ما يتيح لك التركيز على ما يهمّك أكثر، وهو إنشاء تطبيقات رائعة.

ويتفاعل أيضًا بشكلٍ أصلي مع العديد من الأجزاء الأخرى من المنظومة المتكاملة في Google Cloud، بما في ذلك Cloud SQL لقواعد البيانات المُدارة وCloud Storage لتخزين العناصر المُوحَّد ومدير الأسرار لإدارة الأسرار.

Django هو إطار عمل ويب عالي المستوى مكتوب بلغة Python.

في هذا الدليل التعليمي، ستستخدم هذه المكوّنات لنشر مشروع Django صغير.

ملاحظة: تم التحقّق من هذا الدرس التطبيقي حول الترميز آخر مرة باستخدام Django 5.0. من المفترض أن يستمر عمل هذا الدرس التطبيقي حول الترميز ما لم تحدث أي تغييرات جذرية في التحديثات المستقبلية. اطّلِع على ملاحظات الإصدارات المستقبلية من Django.

ما ستتعرّف عليه

  • كيفية استخدام Cloud Shell
  • كيفية إنشاء قاعدة بيانات Cloud SQL
  • كيفية إنشاء حزمة في Cloud Storage
  • كيفية إنشاء مفاتيح سرية في أداة "إدارة الأسرار"
  • كيفية استخدام "الأسرار" من خدمات Google Cloud المختلفة
  • كيفية ربط مكوّنات Google Cloud بخدمة Cloud Run
  • كيفية استخدام Container Registry لتخزين الحاويات التي تم إنشاؤها
  • كيفية النشر على Cloud Run
  • كيفية تنفيذ عمليات نقل مخطّطات قاعدة البيانات في Cloud Build

2. الإعداد والمتطلبات

إعداد البيئة حسب السرعة التي تناسبك

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديلها في أي وقت.
  • يكون معرّف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ وحدة تحكّم Cloud Console سلسلة فريدة تلقائيًا، ولا يهمّك عادةً معرفة محتواها. في معظم مختبرات رموز البرامج، ستحتاج إلى الإشارة إلى معرّف المشروع (يُعرَف عادةً باسم PROJECT_ID). إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف آخر عشوائي. يمكنك بدلاً من ذلك تجربة عنوانك الخاص لمعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة ويبقى ساريًا طوال مدة المشروع.
  • يُرجى العِلم أنّ هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات عن كلّ من هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تتطلّب المشاركة في هذا الدليل التعليمي البرمجي أي تكلفة، أو قد تتطلّب تكلفة بسيطة. لإيقاف الموارد لتجنُّب تحصيل رسوم بعد انتهاء هذا الدليل التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. المستخدمون الجدد في Google Cloud مؤهّلون للاستفادة من برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.

Google Cloud Shell

على الرغم من أنّه يمكن تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، سنستخدم في هذا الدليل التعليمي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة توضّح ماهيتها. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

9c92662c6a846a5c.png

من المفترض ألا يستغرق توفير Cloud Shell والاتصال بها سوى بضع لحظات.

9f0e51b578fecce5.png

تم تحميل هذه الآلة الافتراضية بجميع أدوات التطوير اللازمة. ويقدّم هذا الدليل دليلاً منزليًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يُحسِّن بشكل كبير أداء الشبكة والمصادقة. يمكن تنفيذ الكثير من عملك في هذا الدليل التعليمي للترميز، إن لم يكن كلّه، باستخدام متصفّح.

بعد الاتصال بخدمة Cloud Shell، من المفترض أن تظهر لك رسالة تفيد بأنّه تم مصادقة حسابك وأنّه تم ضبط المشروع على معرّف مشروعك.

  1. نفِّذ الأمر التالي في Cloud Shell لتأكيد مصادقة حسابك:
gcloud auth list

ناتج الأمر

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. شغِّل الأمر التالي في Cloud Shell للتأكّد من أنّ الأمر gcloud يعرف مشروعك:
gcloud config list project

ناتج الأمر

[core]
project = <PROJECT_ID>

إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:

gcloud config set project <PROJECT_ID>

ناتج الأمر

Updated property [core/project].

3- تفعيل واجهات برمجة تطبيقات Cloud

من Cloud Shell، فعِّل واجهات برمجة تطبيقات Cloud للمكونات التي سيتم استخدامها:

gcloud services enable \
  run.googleapis.com \
  sql-component.googleapis.com \
  sqladmin.googleapis.com \
  compute.googleapis.com \
  cloudbuild.googleapis.com \
  secretmanager.googleapis.com \
  artifactregistry.googleapis.com

بما أنّ هذه هي المرة الأولى التي تطلب فيها بيانات من واجهات برمجة التطبيقات من gcloud، سيُطلب منك تفويض استخدام بيانات الاعتماد لتقديم هذا الطلب. سيحدث ذلك مرة واحدة لكل جلسة في Cloud Shell.

قد يستغرق إكمال هذه العملية بضع لحظات.

بعد اكتمال العملية، من المفترض أن تظهر رسالة نجاح مشابهة لما يلي:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

4. إنشاء مشروع نموذج

ستستخدم نموذج مشروع Django التلقائي كنموذج لمشروع Django.

لإنشاء مشروع النموذج هذا، استخدِم Cloud Shell لإنشاء دليل جديد باسم django-cloudrun والانتقال إليه:

mkdir ~/django-cloudrun
cd ~/django-cloudrun

بعد ذلك، ثبِّت Django في بيئة افتراضية مؤقتة:

virtualenv venv
source venv/bin/activate
pip install Django

حفظ قائمة الحِزم المثبَّتة على requirements.txt

pip freeze > requirements.txt

يجب أن تتضمّن هذه القائمة Django وتبعياته: sqlparse وasgiref.

بعد ذلك، أنشئ مشروع نموذج جديدًا:

django-admin startproject myproject .

سيظهر لك ملف جديد باسم manage.py ومجلد جديد باسم myproject سيحتوي على عدد من الملفات، بما في ذلك ملف settings.py.

تأكَّد من أنّ محتوى المجلد على المستوى الأعلى كما هو متوقّع:

ls -F
manage.py myproject/ requirements.txt venv/

تأكَّد من أنّ محتوى مجلد myproject كما هو متوقّع:

ls -F myproject/
__init__.py asgi.py settings.py  urls.py  wsgi.py

يمكنك الآن الخروج من بيئتك الافتراضية المؤقتة وإزالتها:

deactivate
rm -rf venv

من هنا، سيتم استدعاء Django داخل الحاوية.

5- إنشاء الخدمات الاحتياطية

ستنشئ الآن الخدمات الأساسية: حساب خدمة مخصّص ومستودع للعناصر وقاعدة بيانات Cloud SQL وحزمة في Cloud Storage وعدد من قيم Secret Manager.

إنّ تأمين قيم كلمات المرور المستخدَمة في عملية النشر مهم لأمان أي مشروع، ويضمن عدم وضع أي شخص كلمات المرور عن طريق الخطأ في مكان غير مناسب (على سبيل المثال، في ملفات الإعدادات مباشرةً أو كتابتها مباشرةً في وحدة التحكّم حيث يمكن استرجاعها من السجلّ).

للبدء، اضبط متغيّرَين أساسيَين للبيئة، أحدهما لرقم تعريف المشروع:

PROJECT_ID=$(gcloud config get-value core/project)

ويجب أن يكون هناك رمز واحد للمنطقة:

REGION=us-central1

إنشاء حساب خدمة

لتقييد إمكانية وصول الخدمة إلى أجزاء أخرى من Google Cloud، أنشئ حساب خدمة مخصّصًا:

gcloud iam service-accounts create cloudrun-serviceaccount

ستشير إلى هذا الحساب من خلال عنوان بريده الإلكتروني في الأقسام المستقبلية من هذا الدليل التعليمي. اضبط هذه القيمة في متغيّر بيئة:

SERVICE_ACCOUNT=$(gcloud iam service-accounts list \
    --filter cloudrun-serviceaccount --format "value(email)")

إنشاء سجلّ للعناصر

لتخزين صورة الحاوية التي تم إنشاؤها، أنشئ سجلّ حاويات في المنطقة التي اخترتها:

gcloud artifacts repositories create containers --repository-format docker --location $REGION

ستشير إلى هذا السجلّ بالاسم في الأقسام المستقبلية من هذا الدليل التعليمي:

ARTIFACT_REGISTRY=${REGION}-docker.pkg.dev/${PROJECT_ID}/containers

إنشاء قاعدة البيانات

إنشاء مثيل Cloud SQL:

gcloud sql instances create myinstance --project $PROJECT_ID \
  --database-version POSTGRES_14 --tier db-f1-micro --region $REGION

قد يستغرق إكمال هذه العملية بضع دقائق.

في هذه الحالة، أنشئ قاعدة بيانات:

gcloud sql databases create mydatabase --instance myinstance

في هذه الحالة نفسها، أنشئ مستخدمًا:

DJPASS="$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 30 | head -n 1)"
gcloud sql users create djuser --instance myinstance --password $DJPASS

امنح حساب الخدمة إذنًا بالاتصال بالمثيل:

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:${SERVICE_ACCOUNT} \
    --role roles/cloudsql.client

إنشاء حزمة التخزين

أنشئ حزمة في Cloud Storage (يُرجى العلم أنّ الاسم يجب أن يكون فريدًا على مستوى العالم):

GS_BUCKET_NAME=${PROJECT_ID}-media
gcloud storage buckets create gs://${GS_BUCKET_NAME} --location ${REGION} 

امنح حساب الخدمة أذونات لإدارة الحزمة:

gcloud storage buckets add-iam-policy-binding gs://${GS_BUCKET_NAME} \
    --member serviceAccount:${SERVICE_ACCOUNT} \
    --role roles/storage.admin

تخزين الإعدادات كسرّ

بعد إعداد الخدمات الاحتياطية، ستخزِّن الآن هذه القيم في ملف محمي باستخدام "مدير الأسرار".

تتيح لك أداة Secret Manager تخزين الأسرار وإدارتها والوصول إليها كبيانات ثنائية أو سلاسل نصية. وهو يعمل بشكل جيد لتخزين معلومات الضبط، مثل كلمات مرور قاعدة البيانات أو مفاتيح واجهة برمجة التطبيقات أو شهادات بروتوكول النقل الآمن للطبقات (TLS) التي يحتاجها التطبيق أثناء التشغيل.

أولاً، أنشئ ملفًا يحتوي على قيم سلسلة اتصال قاعدة البيانات وحزمة الوسائط ومفتاح سري لخدمة Django (يُستخدَم للتوقيع التشفيري على الجلسات والرموز المميّزة) وتفعيل تصحيح الأخطاء:

echo DATABASE_URL=\"postgres://djuser:${DJPASS}@//cloudsql/${PROJECT_ID}:${REGION}:myinstance/mydatabase\" > .env

echo GS_BUCKET_NAME=\"${GS_BUCKET_NAME}\" >> .env

echo SECRET_KEY=\"$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 50 | head -n 1)\" >> .env

echo DEBUG=True >> .env

بعد ذلك، أنشئ سرًا باسم application_settings باستخدام هذا الملف كسرّ:

gcloud secrets create application_settings --data-file .env

اسمح لحساب الخدمة بالوصول إلى هذا السرّ:

gcloud secrets add-iam-policy-binding application_settings \
  --member serviceAccount:${SERVICE_ACCOUNT} --role roles/secretmanager.secretAccessor

تأكَّد من إنشاء المفتاح السري من خلال إدراج المفاتيح السرية:

gcloud secrets versions list application_settings

بعد تأكيد إنشاء السر، أزِل الملف المحلي:

rm .env

6- ضبط إعدادات تطبيقك

استنادًا إلى الخدمات الداعمة التي أنشأتها للتو، عليك إجراء بعض التغييرات على مشروع النموذج لتلائمها.

سيشمل ذلك تقديم django-environ لاستخدام متغيّرات البيئة كإعدادات الضبط التي ستضيف إليها القيم التي حدّدتها على أنّها سرية. لتنفيذ ذلك، عليك توسيع نطاق إعدادات النموذج. ستحتاج أيضًا إلى إضافة تبعيات إضافية لـ Python.

ضبط الإعدادات

نقل ملف settings.py وإعادة تسميته إلى basesettings.py:

mv myproject/settings.py myproject/basesettings.py

باستخدام محرِّر الويب في Cloud Shell، أنشئ ملف settings.py جديدًا باستخدام الرمز البرمجي التالي:

touch myproject/settings.py
cloudshell edit myproject/settings.py

myproject/settings.py

import io
import os
from urllib.parse import urlparse

import environ

# Import the original settings from each template
from .basesettings import *

# Load the settings from the environment variable
env = environ.Env()
env.read_env(io.StringIO(os.environ.get("APPLICATION_SETTINGS", None)))

# Setting this value from django-environ
SECRET_KEY = env("SECRET_KEY")

# Ensure myproject is added to the installed applications
if "myproject" not in INSTALLED_APPS:
    INSTALLED_APPS.append("myproject")

# If defined, add service URLs to Django security settings
CLOUDRUN_SERVICE_URLS = env("CLOUDRUN_SERVICE_URLS", default=None)
if CLOUDRUN_SERVICE_URLS:
    CSRF_TRUSTED_ORIGINS = env("CLOUDRUN_SERVICE_URLS").split(",")
    # Remove the scheme from URLs for ALLOWED_HOSTS
    ALLOWED_HOSTS = [urlparse(url).netloc for url in CSRF_TRUSTED_ORIGINS]
else:
    ALLOWED_HOSTS = ["*"]

# Default false. True allows default landing pages to be visible
DEBUG = env("DEBUG", default=False)

# Set this value from django-environ
DATABASES = {"default": env.db()}

# Change database settings if using the Cloud SQL Auth Proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

# Define static storage via django-storages[google]
GS_BUCKET_NAME = env("GS_BUCKET_NAME")
STATICFILES_DIRS = []
GS_DEFAULT_ACL = "publicRead"
STORAGES = {
    "default": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
    "staticfiles": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
}

ننصحك بقراءة التعليقات المُضافة حول كلّ إعداد.

يُرجى العِلم أنّه قد تظهر لك أخطاء فحص الأخطاء في هذا الملف. هذا مُتوقع. لا تتضمّن Cloud Shell سياق متطلبات هذا المشروع، وبالتالي قد تُبلغ عن عمليات استيراد غير صالحة وعمليات استيراد غير مستخدَمة.

متطلّبات Python

ابحث عن ملف requirements.txt وأضِف الحِزم التالية إليه:

cloudshell edit requirements.txt

requirements.txt (إضافة)

gunicorn
psycopg2-binary
django-storages[google]
django-environ

تحديد صورة تطبيقك

سيشغّل Cloud Run أي حاوية طالما أنّها متوافقة مع عقد حاويات Cloud Run. يختار هذا الدليل التوجيهي حذف Dockerfile، ولكن بدلاً من ذلك، يستخدم حِزم Cloud Native Buildpacks. تساعد حِزم الإنشاء في إنشاء حاويات للغات الشائعة، بما في ذلك Python.

يختار هذا البرنامج التعليمي تخصيص Procfile المستخدَم لبدء تطبيق الويب.

لتضمين مشروع النموذج في حاوية، عليك أولاً إنشاء ملف جديد باسم Procfile في أعلى مستوى من مشروعك (في الدليل نفسه الذي يتضمّن manage.py)، ثم نسخ المحتوى التالي:

touch Procfile
cloudshell edit Procfile

ملف Procfile

web: gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 myproject.wsgi:application

7- ضبط خطوات نقل البيانات وإنشاؤها وتنفيذها

لإنشاء مخطّط قاعدة البيانات في قاعدة بيانات Cloud SQL وتعبئة حزمة Cloud Storage بالمواد غير القابلة للتقديم أو الإيقاف، عليك تنفيذ migrate وcollectstatic.

يجب تنفيذ أوامر نقل البيانات الأساسية هذه في سياق صورة الحاوية التي تم إنشاؤها مع إمكانية الوصول إلى قاعدة بياناتك.

ستحتاج أيضًا إلى تشغيل createsuperuser لإنشاء حساب مشرف لتسجيل الدخول إلى حساب مشرف Django.

ولإجراء ذلك، ستستخدم مهام Cloud Run لتنفيذ هذه المهام. تسمح لك مهام Cloud Run بتنفيذ عمليات لها نهاية محدّدة، ما يجعلها مثالية للمهام الإدارية.

تحديد كلمة مرور المستخدم الفائق في Django

لإنشاء حساب المستخدم المتميّز، ستستخدم النسخة غير التفاعلية من الأمر createsuperuser. يتطلب هذا الأمر متغيّر بيئة مُعنوَنًا بشكل خاص لاستخدامه بدلاً من طلب إدخال كلمة المرور.

أنشئ سرًا جديدًا باستخدام كلمة مرور تم إنشاؤها عشوائيًا:

echo -n $(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 30 | head -n 1) | gcloud secrets create django_superuser_password --data-file=-

اسمح لحساب الخدمة بالوصول إلى كلمة المرور هذه:

gcloud secrets add-iam-policy-binding django_superuser_password \
  --member serviceAccount:${SERVICE_ACCOUNT} \
  --role roles/secretmanager.secretAccessor

تعديل ملف Procfile

للمساعدة في توضيح مهام Cloud Run، أنشئ اختصارات في ملف Procfile، وأضِف نقاط الدخول التالية إلى Procfile:

migrate: python manage.py migrate && python manage.py collectstatic --noinput --clear
createuser: python manage.py createsuperuser --username admin --email noop@example.com --noinput

من المفترض أن يكون لديك الآن ثلاثة إدخالات: نقطة الإدخال التلقائية web ونقطة الإدخال migrate لتطبيق عمليات نقل قواعد البيانات ونقطة الإدخال createuser لتشغيل الأمر createsuperuser.

إنشاء صورة تطبيقك

بعد إجراء تعديلات على Procfile، يمكنك إنشاء الصورة:

gcloud builds submit --pack image=${ARTIFACT_REGISTRY}/myimage

إنشاء مهام Cloud Run

الآن بعد أن أصبحت الصورة متوفّرة، يمكنك إنشاء مهام Cloud Run باستخدامها.

تستخدِم هذه المهام الصورة التي تم إنشاؤها سابقًا، ولكنّها تستخدِم قيمًا مختلفة من command. ويتم ربطها بالقيم الواردة في Procfile.

أنشئ مهمة لنقل البيانات:

gcloud run jobs create migrate \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --service-account $SERVICE_ACCOUNT \
  --command migrate

أنشئ وظيفة لإنشاء المستخدم:

gcloud run jobs create createuser \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --set-secrets DJANGO_SUPERUSER_PASSWORD=django_superuser_password:latest \
  --service-account $SERVICE_ACCOUNT \
  --command createuser

تنفيذ مهام Cloud Run

بعد ضبط إعدادات المهام، يمكنك تنفيذ عمليات نقل البيانات:

gcloud run jobs execute migrate --region $REGION --wait

تأكَّد من أنّ نتيجة هذا الأمر تشير إلى أنّ التنفيذ "انتهى بنجاح".

ستُجري هذا الأمر لاحقًا عند إجراء تعديلات على تطبيقك.

بعد إعداد قاعدة البيانات، أنشئ المستخدم باستخدام الوظيفة:

gcloud run jobs execute createuser --region $REGION --wait

تأكَّد من أنّ نتيجة هذا الأمر تشير إلى أنّ التنفيذ "اكتمل بنجاح".

ولن يكون عليك تنفيذ هذا الأمر مرة أخرى.

8. النشر على Cloud Run

بعد إنشاء الخدمات الأساسية وملؤها، يمكنك الآن إنشاء خدمة Cloud Run للوصول إليها.

يمكنك نشر الخدمة على Cloud Run باستخدام الصورة التي أنشأتها سابقًا باستخدام الأمر التالي:

gcloud run deploy django-cloudrun \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --service-account $SERVICE_ACCOUNT \
  --allow-unauthenticated

عند نجاح العملية، يعرض سطر الأوامر عنوان URL للخدمة:

Service [django-cloudrun] revision [django-cloudrun-00001-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://django-cloudrun-...run.app

يمكنك الآن الانتقال إلى الحاوية المنشورة من خلال فتح عنوان URL هذا في متصفّح ويب:

d2dfaf668baabfcc.png

9. الوصول إلى Django Admin

من الميزات الرئيسية في Django هي صفحة المشرف التفاعلية.

تعديل إعدادات CSRF

يتضمّن Django وسائل حماية من تزوير الطلبات من مواقع إلكترونية مختلفة (CSRF). في أي وقت يتم فيه إرسال نموذج على موقعك الإلكتروني المستنِد إلى Django، بما في ذلك تسجيل الدخول إلى صفحة Django admin (صفحة المشرف في Django)، يتم التحقّق من إعدادات Trusted Origins (المصادر الموثوق بها). وإذا لم يتطابق مع مصدر الطلب، يعرض Django رسالة خطأ.

في ملف mysite/settings.py، إذا تم تعريف متغيّر البيئة CLOUDRUN_SERVICE_URL، يتم استخدامه في إعدادات CSRF_TRUSTED_ORIGINS وALLOWED_HOSTS. على الرغم من أنّ تحديد ALLOWED_HOSTS ليس إلزاميًا، من الممارسات الجيدة إضافته لأنّه مطلوب في CSRF_TRUSTED_ORIGINS.

لا يمكن إضافة هذا الإعداد إلا بعد عملية النشر الأولى لأنّك بحاجة إلى عنوان URL لخدمتك.

عليك تعديل خدمتك لإضافة متغيّر البيئة هذا. ويمكن إضافته إلى مفتاح المرور application_settings أو إضافته مباشرةً كمتغيّر بيئة.

يستفيد الإجراء أدناه من تنسيق وescaping gcloud.

استرداد عناوين URL لخدماتك:

CLOUDRUN_SERVICE_URLS=$(gcloud run services describe django-cloudrun \
  --region $REGION  \
  --format "value(metadata.annotations[\"run.googleapis.com/urls\"])" | tr -d '"[]')
echo $CLOUDRUN_SERVICE_URLS

اضبط هذه القيمة كمتغيّر بيئة في خدمة Cloud Run:

gcloud run services update django-cloudrun \
  --region $REGION \
  --update-env-vars "^##^CLOUDRUN_SERVICE_URLS=$CLOUDRUN_SERVICE_URLS"

تسجيل الدخول إلى Django Admin

للوصول إلى واجهة Django الإدارية، أضِف /admin إلى عنوان URL لخدمتك.

سجِّل الدخول الآن باستخدام اسم المستخدم "admin" واسترِد كلمة المرور باستخدام الأمر التالي:

gcloud secrets versions access latest --secret django_superuser_password && echo ""

678cd382b7039769.png

de755ef7a1779dc6.png

10. تطوير تطبيقك

أثناء تطوير تطبيقك، ستحتاج إلى اختباره محليًا. لإجراء ذلك، عليك إما الاتصال بقاعدة بيانات Cloud SQL ("الإنتاج") أو قاعدة بيانات محلية ("اختبار").

الربط بقاعدة بيانات الإنتاج

يمكنك الاتصال بمثيلات Cloud SQL باستخدام الخادم الوكيل للمصادقة في Cloud SQL. ينشئ هذا التطبيق اتصالاً من جهازك بالقاعدة البيانات.

بعد تثبيت Cloud SQL Auth Proxy، اتّبِع الخطوات التالية:

# Create a virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

# Copy the application settings to your local machine
gcloud secrets versions access latest --secret application_settings > temp_settings

# Run the Cloud SQL Auth Proxy
./cloud-sql-proxy ${PROJECT_ID}:${REGION}:myinstance

# In a new tab, start the local web server using these new settings
USE_CLOUD_SQL_AUTH_PROXY=true APPLICATION_SETTINGS=$(cat temp_settings) python manage.py runserver

تأكَّد من إزالة ملف temp_settings بعد الانتهاء من عملك.

الاتصال بقاعدة بيانات SQLite على الجهاز

وبدلاً من ذلك، يمكنك استخدام قاعدة بيانات محلية عند تطوير تطبيقك. يتوافق Django مع قاعدتَي بيانات PostgreSQL وSQLite، وهناك بعض الميزات التي توفّرها قاعدة بيانات PostgreSQL ولا توفّرها قاعدة بيانات SQLite، ولكن في العديد من الحالات، تكون الوظائف متطابقة.

لإعداد SQLite، عليك تعديل إعدادات تطبيقك للإشارة إلى قاعدة بيانات محلية، ثم عليك تطبيق عمليات نقل المخططات.

لإعداد هذه الطريقة:

# Create a virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

# Copy the application settings to your local machine
gcloud secrets versions access latest --secret application_settings > temp_settings

# Edit the DATABASE_URL setting to use a local sqlite file. For example:
DATABASE_URL=sqlite:////tmp/my-tmp-sqlite.db

# Set the updated settings as an environment variable
APPLICATION_SETTINGS=$(cat temp_settings) 

# Apply migrations to the local database
python manage.py migrate

# Start the local web server
python manage.py runserver

تأكَّد من إزالة ملف temp_settings بعد الانتهاء من عملك.

إنشاء عمليات نقل البيانات

عند إجراء تغييرات على نماذج قاعدة البيانات، قد تحتاج إلى إنشاء ملفات نقل البيانات في Django من خلال تشغيل python manage.py makemigrations.

يمكنك تنفيذ هذا الأمر بعد إعداد اتصال قاعدة بيانات الإصدار العلني أو الاختبار. بدلاً من ذلك، يمكنك إنشاء ملفات نقل البيانات بدون قاعدة بيانات من خلال تقديم إعدادات فارغة:

SECRET_KEY="" DATABASE_URL="" GS_BUCKET_NAME="" python manage.py makemigrations

تطبيق تحديثات التطبيقات

لتطبيق التغييرات على طلبك، عليك إجراء ما يلي:

  • إنشاء صورة جديدة تتضمّن التغييرات
  • تطبيق أي عمليات نقل بيانات أو عمليات نقل بيانات ثابتة، ثم
  • تعديل خدمة Cloud Run لاستخدام الصورة الجديدة

لإنشاء صورتك:

gcloud builds submit --pack image=${ARTIFACT_REGISTRY}/myimage

إذا كانت لديك أي عمليات نقل بيانات تريد تطبيقها، يمكنك تنفيذ وظيفة Cloud Run باتّباع الخطوات التالية:

gcloud run jobs execute migrate --region $REGION --wait

لتعديل خدمتك باستخدام الصورة الجديدة:

gcloud run services update django-cloudrun \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage

11. تهانينا!

لقد أرسلت للتو مشروعًا معقّدًا إلى Cloud Run.

  • تعمل خدمة Cloud Run على زيادة حجم صورة الحاوية تلقائيًا وأفقيًا لمعالجة الطلبات الواردة، ثم تقلّل حجمها عندما ينخفض الطلب. ولا تدفع إلا مقابل وحدة المعالجة المركزية (CPU) والذاكرة والشبكة المستخدَمة أثناء معالجة الطلبات.
  • تتيح لك خدمة Cloud SQL توفير نسخة افتراضية مُدارة من PostgreSQL يتم الاحتفاظ بها تلقائيًا نيابةً عنك، ويتم دمجها بشكلٍ أصلي في العديد من أنظمة Google Cloud.
  • تتيح لك خدمة Cloud Storage الحصول على مساحة تخزين في السحابة الإلكترونية بطريقة يمكن الوصول إليها بسلاسة في Django.
  • يتيح لك Secret Manager تخزين الأسرار والسماح بوصول أجزاء معيّنة من Google Cloud إليها وليس غيرها.

التنظيف

لتجنُّب تحصيل رسوم من حسابك على Google Cloud Platform مقابل الموارد المستخدَمة في هذا الدليل التعليمي:

  • في Cloud Console، انتقِل إلى صفحة إدارة الموارد.
  • في قائمة المشاريع، اختَر مشروعك ثم انقر على حذف.
  • في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.

مزيد من المعلومات