كيفية دمج واجهات Google البرمجية مع Python وDjango لبناء تطبيق خرائط وعناوين ذكي
مقدمة عملية حول دمج خدمات Google داخل مشاريع Django
يحتاج كثير من مطوري الويب إلى ربط تطبيقاتهم بخدمات Google مثل الخرائط، التوجيهات، البحث عن العناوين، والتحقق من النماذج. لكن تنفيذ ذلك داخل مشروع مبني باستخدام Python وDjango قد يبدو معقدًا في البداية، خصوصًا عند التعامل مع أكثر من واجهة برمجية في الوقت نفسه.
في هذا الدليل التقني، ستتعرف على طريقة بناء تطبيق Django يستخدم عدة خدمات من Google APIs بشكل مترابط، بدءًا من تفعيل المفاتيح وإنشاء المشروع، مرورًا ببناء الواجهة الخلفية والواجهة الأمامية، وصولًا إلى الاختبار النهائي للتطبيق.

الفكرة الأساسية في التطبيق هي:
- إنشاء حسابات مستخدمين مع حماية النموذج عبر
reCAPTCHA v3. - إتاحة إدخال عنوان المستخدم باستخدام الإكمال التلقائي عبر
Google Places API. - إنشاء مسارات بين عدة نقاط مع عرض الخريطة والاتجاهات التفصيلية.
- دمج
JavaScriptوAjaxمعDjangoللحصول على تجربة استخدام سلسة.
ما واجهات Google المستخدمة في هذا المشروع؟
يعتمد هذا التطبيق على أكثر من خدمة، وكل خدمة تؤدي دورًا محددًا داخل النظام:
Google reCAPTCHA v3لحماية نماذج التسجيل من الإرسال الآلي أو الضار.Google Places APIلتوقع العناوين أثناء الكتابة.Google Directions APIلحساب المسارات بين عدة نقاط.Google Distance Matrix APIلاستخراج المسافات والمدد الزمنية.Geocoding APIلتحويل العنوان إلى إحداثياتlongitudeوlatitude.Maps JavaScript APIلعرض الخرائط مباشرة داخل الواجهة.
خطوات إعداد مفاتيح Google API
إعداد reCAPTCHA v3
لحماية نموذج التسجيل، يجب أولًا إنشاء إعداد جديد في لوحة Google reCAPTCHA. اختر الإصدار v3 لأنه يعتمد على تقييم سلوك المستخدم بدلًا من اختبارات الصور التقليدية.
- سجّل الدخول بحساب
Google. - انتقل إلى صفحة إدارة
reCAPTCHA. - أنشئ موقعًا جديدًا.
- اختر
reCAPTCHA v3. - أضف النطاق
localhostأثناء التطوير. - احفظ
Site KeyوSecret Key.
من الأفضل التعامل مع Site Key باعتباره معرفًا عامًا للتطبيق، بينما يجب حفظ Secret Key بسرية تامة لأنه يستخدم في التحقق على الخادم.
إنشاء مشروع داخل Google Cloud
بعد ذلك، أنشئ مشروعًا جديدًا داخل Google Cloud Console، ثم أنشئ مفتاح API Key خاصًا به. هذا المفتاح سيستخدم لتفعيل بقية الخدمات المطلوبة.
- افتح
cloud.google.com. - أنشئ مشروعًا جديدًا باسم مناسب.
- انتقل إلى قسم
APIs & Services. - اختر
Credentials. - أنشئ
API Key. - فعّل الواجهات المطلوبة واحدة تلو الأخرى.
الواجهات التي يجب تفعيلها
Places APIDirections APIDistance Matrix APIGeocoding APIMaps JavaScript API
يفضل أيضًا تقييد المفتاح حسب النطاقات أو عناوين IP عند الانتقال إلى بيئة الإنتاج، لتقليل مخاطر إساءة الاستخدام.
تهيئة بيئة العمل باستخدام Python وDjango
تثبيت الأدوات الأساسية
قبل بدء البرمجة، تحتاج إلى تثبيت:
PythonDjango- بيئة افتراضية مثل
virtualenvأوvirtualenvwrapper
استخدام البيئة الافتراضية مهم جدًا لعزل الحزم الخاصة بالمشروع عن بقية المشاريع على الجهاز.
إنشاء البيئة الافتراضية وتثبيت Django
بعد فتح الطرفية، يمكن إنشاء البيئة ثم تثبيت Django:
mkvirtualenv django-google-api-tutorial
pip install django
بعد ذلك أنشئ المشروع والتطبيق الأساسي:
django-admin startproject django_google_api_tutorial
cd django_google_api_tutorial
python manage.py startapp main
ضبط إعدادات مشروع Django
بعد إنشاء المشروع، ستحتاج إلى تعديل ملف settings.py ليتعرف على التطبيق الجديد ويخدم الملفات الثابتة والمفاتيح المطلوبة.
إضافة التطبيق إلى INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'main',
]
إعداد الملفات الثابتة
لأن المشروع يستخدم ملفات CSS وJavaScript وصورًا، يجب تعريف مسارات static files داخل الإعدادات.
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'static-cdn')
حفظ مفاتيح الواجهات داخل الإعدادات
GOOGLE_API_KEY = 'your_google_api_key'
RECAPTCHA_PUBLIC_KEY = 'your_recaptcha_site_key'
RECAPTCHA_PRIVATE_KEY = 'your_recaptcha_secret_key'
BASE_COUNTRY = 'gb'
في المشاريع الحقيقية، لا يُنصح بوضع هذه القيم مباشرة داخل الملف، بل يفضل تحميلها من متغيرات البيئة باستخدام أدوات مثل django-environ أو python-decouple.
إعداد المسارات داخل Django
الخطوة التالية هي تعريف مسارات التطبيق داخل ملف urls.py الرئيسي:
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('', include('main.urls', namespace='main')),
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
ثم أنشئ ملف urls.py داخل تطبيق main مع قائمة urlpatterns الأساسية.
بناء الواجهة الخلفية: النماذج، النماذج المرتبطة، والإشارات
إنشاء تطبيق خاص بالمستخدمين
لأن المشروع يعتمد على التسجيل وتسجيل الدخول وإدارة الملف الشخصي، من الأفضل إنشاء تطبيق مستقل للمستخدمين:
python manage.py startapp users
ثم أضفه إلى INSTALLED_APPS.
نموذج الملف الشخصي UserProfile
بدلًا من تعديل نموذج المستخدم الافتراضي مباشرة، يتم إنشاء نموذج إضافي مرتبط به بعلاقة OneToOneField. هذه الطريقة مرنة وتحافظ على بنية المشروع.
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
timestamp = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
address = models.CharField(max_length=100, null=True, blank=True)
town = models.CharField(max_length=100, null=True, blank=True)
county = models.CharField(max_length=100, null=True, blank=True)
postcode = models.CharField(max_length=30, null=True, blank=True)
country = models.CharField(max_length=100, null=True, blank=True)
longitude = models.FloatField(null=True, blank=True)
latitude = models.FloatField(null=True, blank=True)
captcha_score = models.FloatField(default=0.0)
has_profile = models.BooleanField(default=False)
active = models.BooleanField(default=True)
def __str__(self):
return f'{self.user}'
هذا النموذج يخزن بيانات الموقع الجغرافي للمستخدم، إضافة إلى نتيجة التحقق من reCAPTCHA.
إنشاء الملف الشخصي تلقائيًا باستخدام signals
حتى لا تضطر لإنشاء سجل الملف الشخصي يدويًا بعد كل تسجيل، يمكن الاستفادة من signals في Django.
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import UserProfile
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
بهذه الطريقة، كلما أُنشئ مستخدم جديد، يُنشأ له ملف شخصي تلقائيًا.
إنشاء النماذج Forms داخل Django
يستخدم المشروع ثلاثة نماذج رئيسية:
- نموذج التسجيل بالاعتماد على
UserCreationForm. - نموذج تسجيل الدخول بالاعتماد على
AuthenticationForm. - نموذج تحديث الملف الشخصي بالاعتماد على
ModelForm.
ميزة هذا الأسلوب أنه يختصر منطقًا كبيرًا كان سيتطلب كتابة يدوية، خصوصًا في التعامل مع كلمات المرور والتحقق من صحة المدخلات.
مثال على نموذج الملف الشخصي
from django.forms import ModelForm
from django import forms
from .models import UserProfile
class UserProfileForm(ModelForm):
address = forms.CharField(required=True, widget=forms.HiddenInput())
town = forms.CharField(required=True, widget=forms.HiddenInput())
county = forms.CharField(required=True, widget=forms.HiddenInput())
postcode = forms.CharField(required=True, widget=forms.HiddenInput())
country = forms.CharField(required=True, widget=forms.HiddenInput())
longitude = forms.FloatField(required=True, widget=forms.HiddenInput())
latitude = forms.FloatField(required=True, widget=forms.HiddenInput())
class Meta:
model = UserProfile
fields = (
'address', 'town', 'county', 'postcode',
'country', 'longitude', 'latitude'
)
استخدام الحقول المخفية هنا مقصود، لأن القيم تُملأ تلقائيًا من Google Places API بعد اختيار العنوان.
إنشاء وظائف مساعدة للتكامل مع Google APIs
التحقق من reCAPTCHA
من الأفضل فصل استدعاءات الواجهات الخارجية داخل دوال أو ملفات مساعدة مستقلة، حتى تبقى الشيفرة أوضح وأسهل للصيانة.
import requests
from django.conf import settings
def recaptcha_validation(token):
result = requests.post(
'https://www.google.com/recaptcha/api/siteverify',
data={
'secret': settings.RECAPTCHA_PRIVATE_KEY,
'response': token,
}
)
return result.json()
إنشاء دالة لحساب المسارات
يمكن كذلك بناء دالة تتعامل مع Directions API وتعيد بيانات المسافة والمدة وخطوات المسار في شكل مناسب للعرض.
هذه الخطوة مفيدة لأنها تمنع تكرار المنطق داخل views، وتساعد على إبقاء المعالجة الخارجية معزولة في طبقة مستقلة.
بناء العروض Views ومعالجة النماذج
تسجيل المستخدم الجديد
عند إرسال نموذج التسجيل:
- يُلتقط رمز
tokenمنreCAPTCHA. - يُرسل إلى الخادم للتحقق منه.
- إذا كانت النتيجة ناجحة، يُنشأ المستخدم.
- يُحفَظ البريد الإلكتروني داخل حقل
username. - تُخزن درجة
captcha scoreفي ملف المستخدم. - يتم تسجيل دخوله مباشرة.
هذا التسلسل يمنح التطبيق أمانًا أفضل دون التأثير على تجربة الاستخدام.
تحديث العنوان باستخدام Google Places API
بعد تسجيل الدخول، يمكن للمستخدم إضافة عنوانه. أثناء الكتابة في حقل العنوان، يقترح Google عناوين مطابقة. وعند اختيار العنوان المناسب، يتم تلقائيًا:
- تعبئة العنوان الكامل.
- استخراج المدينة والمنطقة والرمز البريدي.
- إضافة الدولة.
- تحديد
longitudeوlatitude.
ثم يرسل النموذج عبر Ajax لتحديث الملف الشخصي دون إعادة تحميل الصفحة كاملة.
بناء الواجهة الأمامية باستخدام HTML وJavaScript
القالب الأساسي base.html
في المشاريع المنظمة، يفضل إنشاء قالب أساسي يحتوي على:
- ملف
CSSالرئيسي. - مكتبة
jQuery. - مكتبة التنبيهات مثل
Toastr. - أقسام قابلة للتمديد باستخدام كتل
{% block %}.
بهذا الأسلوب، ترث الصفحات مثل التسجيل، تسجيل الدخول، الملف الشخصي، والخريطة نفس الهيكل العام.
استخدام Ajax لتحسين تجربة المستخدم
بدل إرسال النماذج بالطريقة التقليدية، يستفيد التطبيق من Ajax لتنفيذ الإرسال في الخلفية. النتيجة:
- لا حاجة لإعادة تحميل الصفحة بعد كل عملية.
- يمكن عرض رسائل نجاح أو خطأ مباشرة.
- تبدو الواجهة أسرع وأكثر احترافية.
كما يمكن استخدام دوال مساعدة لتبديل حالة الأزرار أثناء الإرسال، مثل إظهار مؤشر تحميل ثم إعادة النص الأصلي للزر بعد اكتمال العملية.
دمج Google Places API مع حقل العنوان
عند تحميل الصفحة الخاصة بالملف الشخصي، يتم استدعاء مكتبة الخرائط بهذا الشكل:
$.getScript('https://maps.googleapis.com/maps/api/js?key=' + googleApiKey + '&libraries=places', function () {
google.maps.event.addDomListener(window, 'load', initAutocomplete);
});
بعد ذلك، تُربط ميزة الإكمال التلقائي بالحقل المخصص للعناوين. وعند اختيار عنوان معين، يتم تحليل مكونات العنوان وإسنادها إلى الحقول المخفية داخل النموذج.
هذه الآلية ممتازة لأنها تقلل أخطاء الإدخال اليدوي، وتضمن حفظ بيانات جغرافية متناسقة يمكن الاعتماد عليها لاحقًا في المسارات والخرائط.
إنشاء مسار بين عدة نقاط باستخدام Google Maps
كيف يعمل نموذج المسارات؟
يوفر التطبيق نموذجًا يتيح إدخال:
- نقطة البداية.
- نقطة توقف أولى.
- نقطة توقف ثانية.
- الوجهة النهائية.
كل حقل يستفيد من Places Autocomplete أيضًا. وبعد اكتمال جميع الحقول، تُجمع الإحداثيات في سلسلة معاملات query string، ثم يُعاد توجيه المستخدم إلى صفحة الخريطة.
عرض الخريطة والاتجاهات
في صفحة الخريطة، تُقرأ القيم من الرابط ثم تُمرر إلى Directions API. إذا كانت البيانات مكتملة وصحيحة، تظهر النتيجة على شكل:
- الخريطة المرئية.
- المسافة الكلية.
- المدة الزمنية التقديرية.
- خطوات التنقل بالتفصيل.
يمكن كذلك إظهار أو إخفاء التعليمات التفصيلية عبر زر أو رابط تفاعلي باستخدام JavaScript.
اختبار المشروع وتشغيله محليًا
تثبيت الحزم الإضافية وإنشاء قاعدة البيانات
قبل تشغيل الخادم المحلي، قد تحتاج إلى تثبيت حزم إضافية يعتمد عليها المشروع، مثل requests أو humanfriendly إن كانت مستخدمة ضمن تنسيق المدة الزمنية.
pip install requests
pip install humanfriendly
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
ماذا تختبر بعد التشغيل؟
- انتقال الزائر غير المسجل إلى صفحة تسجيل الدخول تلقائيًا.
- عمل نموذج التسجيل وربطه مع
reCAPTCHA v3. - إنشاء المستخدم وتسجيل دخوله.
- إمكانية إضافة العنوان عبر
Places API. - حفظ الإحداثيات والبيانات الجغرافية داخل الملف الشخصي.
- إدخال 4 نقاط وإنشاء مسار ناجح بينها.
- ظهور الخريطة وخطوات الاتجاهات بشكل صحيح.
أفضل ممارسات لتحسين المشروع قبل النشر
حماية المفاتيح السرية
لا تترك قيم API Key وSecret Key داخل المستودع البرمجي. استخدم متغيرات البيئة، وفعّل قيود الاستخدام من لوحة Google Cloud.
فصل البيئات
اجعل إعدادات التطوير مختلفة عن الإنتاج. على سبيل المثال، يمكن استخدام ملف إعدادات مستقل أو نظام تحميل ديناميكي للإعدادات حسب البيئة.
تقييد المفاتيح والفوترة
بعض خدمات Google Maps Platform تتطلب تفعيل الفوترة. كما يجب تقييد المفاتيح حسب النطاقات أو التطبيقات المسموح لها باستخدامها حتى لا تتعرض لاستهلاك غير متوقع.
تحسين تجربة المستخدم
- أضف رسائل خطأ واضحة عند فشل جلب العنوان أو المسار.
- وفّر حالة تحميل مرئية أثناء انتظار رد
API. - عالج الحالات الناقصة مثل عدم اكتمال جميع نقاط المسار.
لماذا هذا النوع من المشاريع مفيد في السيو وAdSense؟
المحتوى البرمجي العملي الذي يشرح كيفية بناء تطبيق حقيقي يقدم قيمة مرتفعة للقراء، خصوصًا إذا كان:
- يعالج مشكلة واضحة.
- يشرح خطوات التنفيذ بتسلسل منطقي.
- يعرض أمثلة واقعية قابلة للتطوير.
- يتجنب النسخ الحرفي والحشو.
ومن منظور جودة المحتوى، فإن المقالات التي تقدم فهمًا حقيقيًا بدل تلخيص سطحي تكون أفضل من حيث تجربة المستخدم، وتنسجم أكثر مع معايير القبول في Google AdSense.
الخلاصة التقنية
دمج Google APIs مع Python وDjango ليس مجرد إضافة خدمة خارجية، بل هو بناء طبقة ذكية تجمع بين الأمان، البيانات الجغرافية، والتفاعل اللحظي داخل التطبيق. أفضل نهج هنا هو توزيع المسؤوليات بوضوح: Django يدير المنطق والخادم، وJavaScript يتولى التفاعل المباشر مع الخرائط والعناوين، بينما تقوم واجهات Google بتوفير البيانات والخدمات الدقيقة. هذا النمط من البناء مناسب جدًا للتطبيقات الخدمية واللوجستية وتطبيقات الحجز والتوصيل، ويمكن تطويره لاحقًا ليشمل تتبعًا مباشرًا، حساب تكاليف، أو تحسينًا متقدمًا للمسارات.