دليل لبناء تطبيق URL Shortener باستخدام Django
نشرت: 2021-05-09أفضل طريقة لتعلم Django ، أو أي مهارة أخرى ، هي من خلال تطبيق المعرفة التي لديك من خلال إنشاء مشاريع وظيفية.
يعد Django أكثر إطار عمل تطوير ويب Python استخدامًا. جعلت ميزاته المضمنة والكم الهائل من حزم الجهات الخارجية منه أحد أكثر أطر عمل الويب المحبوبة في جميع أنحاء العالم.
إنه سريع وموثوق ويحتوي على الكثير من الميزات المضمنة. على سبيل المثال ، نظام مصادقة ثقب يسمح لك بالتركيز على الميزات الرئيسية لتطبيقك. يمكنك أيضًا تثبيت حزم خارجية لإنجاز مهام أكثر تعقيدًا ، مثل Django-allauth ، والذي يسمح لك بتسجيل المستخدمين بحساباتهم الاجتماعية.
لكن دعونا نكشف بعض الحقائق. يعد Django إطار عمل ضخمًا يصعب في بعض الأحيان البدء به.
لذلك اليوم ستقوم ببناء تطبيق Django عملي بالكامل من الصفر.
بنهاية هذا البرنامج التعليمي ، سوف:
- قمت بكتابة تطبيق URL Shortener
- افهم نمط Django MVT
- تعلمت سير العمل لإنشاء مشروع
متطلبات مبدئية
جميع المتطلبات التالية اختيارية وستساعدك على متابعة البرنامج التعليمي. ولكن إذا لم تكن لديك خبرة في أي من هؤلاء ، فلا داعي للقلق. الخطوة الأكثر أهمية هي الأولى.
- الفهم الأساسي لأوامر UNIX (ls ، cd ، rm ، touch)
- الفهم الأساسي لفئات ووظائف بايثون
- تم تثبيت Python على جهاز الكمبيوتر الخاص بك (ربما يكون واضحًا ولكن كان عليّ تضمينه)
- سيكون رائعًا إذا كنت قد بنيت بالفعل شيئًا مع Django
ستكون جميع رموز العمل متاحة في Github repo.
الآن بعد أن أصبحت لديك المفاهيم السابقة واضحة تمامًا ، دعنا ندخل في الأمر.
بيان المشروع
في هذا البرنامج التعليمي ، ستقوم بإنشاء أداة تقصير لعناوين URL. بشكل أساسي ، أداة تقصير عناوين URL هي خدمة تأخذ عنوان URL طويلًا وتحولها إلى خدمة مضغوطة.
على سبيل المثال ، إذا كنت ترغب في مشاركة تغريدة وتريد تضمين رابط إلى موقع الويب الخاص بك ، لكنك تواجه الحد الأقصى لعدد الأحرف ، يمكنك استخدام أداة تقصير عناوين URL.
دعونا نرى ذلك مع الرسم.

كما ترى ، تحصل أداة تقصير عناوين URL على عنوان URL طويل وتقوم بإرجاع عنوان قصير. هذا هو بالضبط ما ستبنيه اليوم.
مع هذا المشروع ، سوف تتدرب على استخدام نمط MVT ، وتتعلم أساسيات تصميم قاعدة البيانات مع نماذج Django ، وتتعلم كيفية إظهار المعلومات للمستخدم من خلال طرق العرض ، وعناوين URL ، والقوالب.
هيكل مشروع Django
أساسًا ، موقع Django مبني على مشروع واحد وتطبيقات متعددة منفصلة. يحتوي كل تطبيق من هذه التطبيقات على وظائف محددة ويمكنه العمل بمفرده.
لنتخيل تطبيق ويب معقدًا مثل Stackoverflow. تعتمد وظيفتها على جانبين رئيسيين.
- إدارة المستخدمين: تسجيل الدخول ، تسجيل الخروج ، السمعة ، الأذونات
- المنتدى: أسئلة ، إجابات ، علامات ، فلاتر
لذلك باتباع بنية موقع ويب Django ، سيتم تسمية المشروع StackOverflow الذي يحتوي على تطبيقين رئيسيين. تطبيق المستخدمين وتطبيق المنتدى .
يحتوي كل تطبيق من هذه التطبيقات على وظائف قائمة بذاتها. هذا يعني أن كلاهما يحتوي على جميع التعليمات البرمجية التي يحتاجون إليها للعمل بشكل صحيح.
يتضمن ذلك النماذج (بنية قاعدة البيانات) وطرق العرض (الطلبات والاستجابات) وأنماط URL المحددة وبالطبع القوالب والملفات الثابتة (الصور و CSS و JavaScript). هذا يعني أنه يمكن إعادة استخدام أي تطبيق Django لأنهم قادرون على العمل بمفردهم.
اختصار ، يشير المشروع إلى مجموعة من التكوينات والتطبيقات التي تهدف إلى إنشاء تطبيق ويب. من ناحية أخرى ، يعد تطبيق Django جزءًا من مشروع قائم بذاته (يحتوي على كل ما يحتاجه للعمل) ، والغرض منه هو إجراء عملية محددة.
قم بإعداد مشروع Django
في هذا القسم ، ستنشئ مشروع Django. لهذا الغرض ، ستستخدم أدوات مختلفة مثل البيئة الافتراضية لتنظيم تبعيات Python وأهم نصوص Django. Django-admin and management.py
بيئة افتراضية
أوصي دائمًا بالعمل مع البيئات الافتراضية عند إنشاء تطبيقات باستخدام Django. إنها الطريقة الأكثر فاعلية للحفاظ على مجموعة معينة من التبعيات. لكن الغرض الرئيسي منه هو عزل حزم التطوير عن الحزم العالمية.
لذلك دعونا ننشئ بيئة افتراضية باستخدام python أمر النموذج المدمج.
ملاحظة: تتطلب هذه الطريقة عمل Python 3.6 أو أحدث الإصدارات.
python -m venv .venvيستخدم هذا الأمر الأمر python -m أو python –mod . في الأساس ، يتم تشغيل وحدة نمطية أو مكتبة ، كنص. وفقًا لمعنى هذا الأمر ، فإن venv هي المكتبة التي نقوم بتشغيلها ، ويشير .venv إلى اسم البيئة الافتراضية التي نريد إنشاءها.
لذلك بلغة واضحة ، هذا الأمر يعني.
مرحبًا Python ، قم بتشغيل مكتبة venv المضمنة كبرنامج نصي وإنشاء اسم virtualenv
حان الوقت الآن لتنشيط البيئة الافتراضية التي أنشأناها للتو ، بالأمر التالي.
source .venv/bin/activateللتأكيد على أن لديك حزم صفرية مثبتة في venv الجديد ، عليك تشغيل.
pip freezeإذا قمت بتنشيط البيئة الافتراضية بشكل صحيح ، فلن تحصل على أي إخراج. هذا لأننا لم نقم بتثبيت أي شيء بعد.
دعنا ندخل إلى Django
من أجل إنشاء تطبيق اختصار الروابط الخاص بنا ، سنبدأ بتثبيت حزمة Django. Django هي حزمة تابعة لجهة خارجية ، لذلك نحتاج إلى تثبيتها باستخدام Pip (حزم تثبيت Pip).
$ pip install django Collecting django Downloading Django-3.2.1-py3-none-any.whl (7.9 MB) |████████████████████████████████| 7.9 MB 344 kB/s Collecting asgiref<4,>=3.3.2 Using cached asgiref-3.3.4-py3-none-any.whl (22 kB) Collecting sqlparse>=0.2.2 Using cached sqlparse-0.4.1-py3-none-any.whl (42 kB) Collecting pytz Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB) Installing collected packages: asgiref, sqlparse, pytz, django Successfully installed asgiref-3.3.4 django-3.2.1 pytz-2021.1 sqlparse-0.4.1ملاحظة: تذكر أن $ ليس سوى رمز صدفة.
للتحقق مما إذا كان التثبيت قد تم بشكل صحيح ، نتحقق مرة أخرى من الحزم المثبتة لبرنامج venv الخاص بنا.
$ pip freeze asgiref==3.3.4 Django==3.2.1 pytz==2021.1 sqlparse==0.4.1لا تقلق إذا كانت الإصدارات التي تحصل عليها مختلفة عن نسختي. إذا استمر Django في الإصدار 3.x ، فيمكنك المتابعة دون أي مشكلة.
بدء مشروع Django
بمجرد تثبيت Django ، حان الوقت لإنشاء هيكل موقع تقصير عناوين URL. هل تتذكر ما هو مشروع Django؟ لنقم بإنشاء واحد عن طريق تشغيل الأمر التالي.
django-admin startproject config لشرح كل شيء عن هذا الأمر ، فإن django-admin هو أداة مساعدة لسطر الأوامر تقوم بتنفيذ جميع المهام المطلوبة لإنشاء مشروع Django. جزء "startproject" هو الأمر الذي تديره الأداة المساعدة Django-admin ، والتكوين هو اسم المشروع الذي سننشئه.
من المهم التأكيد على أن التكوين يمكن أن يكون أي اسم تريده. السبب في أنني استخدم config كاسم لهذا المشروع هو فقط بسبب الراحة. من الجيد التبديل بين المشاريع ولا يزال لديك نفس اصطلاح التسمية. لذلك لا تخف من استخدام أسماء مشاريع أخرى وقتما تشاء.
كما قد تلاحظ الآن أن لديك مجلد config / وداخله ، هناك العديد من الملفات. سنرى لاحقًا بنية ملف المشروع. في الوقت الحالي ، دعنا ندخل إلى دليل المشروع ونشغل الخادم المحلي.
cd config/أهم ملف ستستخدمه هو البرنامج النصي manager.py . لديه نفس وظائف django-admin ، لكن الميزة الرئيسية لاستخدامه هي أنه يتيح لك إدارة الإعدادات عند تشغيل المشروع.
الآن دعنا نرى ما إذا كان كل شيء يعمل بشكل صحيح.
python manage.py runserver 
إنشاء تطبيق Url Shortener
حان الوقت لإنشاء التطبيق الرئيسي للمشروع. ستستخدم ملف management.py لإنجاز هذه المهمة.
python manage.py startapp urlshortenerيؤدي هذا إلى إنشاء تطبيق Django باسم urlshortener . إذا قمت بتشغيل أمر الشجرة ، فستحصل على شيء مثل هذا.
. ├── config │ ├── asgi.py │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py └── urlshortener ├── admin.py ├── apps.py ├── __init__.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py └── views.py دعنا نوضح الملفات المختلفة التي تم إنشاؤها حتى هذه اللحظة. "config" هو اسم مشروعنا وسمي بهذا الاسم فقط من أجل الاتفاقية. داخل config ، تحصل على settings.py ، وهو الملف الذي تحدد فيه جميع إعدادات مشروعك. urls.py هو التكوين العام لعناوين URL داخل المشروع. يحدد مسارات URL لجميع التطبيقات داخل المشروع.
لا تقلق كثيرا عن asgi.py و wsgi.py الملفات. تتيح لك هذه الملفات تكوين تطبيقك أثناء النشر.
manage.py هو manage.py الذي يتيح لك تشغيل جميع الأوامر المتاحة لمشرف Django.
إلقاء نظرة داخل urlshortener وهو اسم التطبيق الذي أنشأته للتو ، قد تلاحظ وجود مجلد غريب يسمى "migrations /" وبعض الملفات الأخرى التي تعتبر بالغة الأهمية لمنطق أي تطبيق.
apps.py هو المكان الذي تعيش فيه تهيئة التطبيق. عادة ، لا تعبث به ، إلا أنك تقوم بأشياء متقدمة جدًا.
admin.py هو المكان الذي تسجيل النماذج الخاصة بك لجعلها مرئية داخل لوحة الادارة جانغو.
models.py هو الأهم. داخل هذه الوحدة ، يجب تحديد النماذج ، والتي (تقول بشكل غامض) هي الطريقة التي يتم بها تخزين البيانات. ستسمع المزيد عن الطرز لاحقًا.
migrations/ هو المجلد حيث يتم تخزين تهجيرات Django. سنلقي نظرة متعمقة في وقت لاحق.
tests.py هو الملف الذي يتم تخزين الاختبارات فيه. لن نغطي الاختبار في هذا البرنامج التعليمي.
views.py هو الملف الذي يخزن المشاهدات. تحدد بشكل أساسي كيف سيتفاعل المستخدم مع جميع جوانب تطبيقك.
تثبيت تطبيق Django
قبل المتابعة ، افتح ملف settings.py وعدّل المتغير INSTALLED_APPS عن طريق إضافة تطبيق urlshortener.
# Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # Custom apps 'urlshortener', ]هذه عملية روتينية عند إنشاء تطبيق. لذلك في كل مرة تفعل ذلك ، لا تنس تثبيته على إعدادات المشروع.
فهم نمط MVT
نموذج النموذج ، العرض ، القالب هو نمط تصميم البرنامج الذي يستخدمه مطورو Django لإنشاء تطبيقات الويب.

يعتمد على 3 مفاهيم رئيسية. النموذج (البيانات) ، العرض (تفاعل المستخدم مع البيانات) ، القالب (كيف يرى المستخدمون البيانات).
النماذج هي فئات Python ، والتي تحدد جميع الحقول وسلوك البيانات التي ترغب في تخزينها. عادة يشير كل نموذج إلى جدول فريد في قاعدة البيانات
المشاهدات في أبسط تعبير لها هي عناصر قابلة للاستدعاء تأخذ طلبًا من المستخدم وتولد استجابة. بين تلك العملية يحدث منطق الأعمال. أعلم أن "منطق العمل" مفهوم غامض للغاية ، لذا دعني أوضح ما هو بالضبط. منطق العمل هو الطريقة التي يتم بها إنشاء البيانات وتخزينها وحذفها ، هذا كل شيء.
أخيرًا ، القوالب عبارة عن مستندات نصية (عادةً Html) يتم عرضها للمستخدمين. والغرض منه هو تقديم البيانات نظيفة قدر الإمكان. يدمج Django لغة مصغرة تسمى لغة قالب Django (DTL) والتي تتيح لك دمج بعض من قوة الثعبان في المستندات النصية.
قم بإنشاء نموذج Shortener
بمجرد فهمك سريعًا لنمط MVT ، دعنا نبدأ في إنشاء أداة تقصير عناوين URL لـ Django من البداية.
بادئ ذي بدء ، دعنا نحدد نموذج models.py داخل ملف models.py .
''' Url shortener model ''' from django.db import models # Create your models here. class Shortener(models.Model): ''' Creates a short url based on the long one created -> Hour and date a shortener was created times_followed -> Times the shortened link has been followed long_url -> The original link short_url -> shortened link https://domain/(short_url) ''' created = models.DateTimeField(auto_now_add=True) times_followed = models.PositiveIntegerField(default=0) long_url = models.URLField() short_url = models.CharField(max_length=15, unique=True, blank=True) class Meta: ordering = ["-created"] def __str__(self): return f'{self.long_url} to {self.short_url}'أنا أعرف. إنه فصل ضخم جدًا ، مع وجود الكثير من الأشياء الغريبة ، لكن لا تيأس. سأذهب خطوة بخطوة في كل شيء مهم.
شرح النموذج
بادئ ذي بدء ، نقوم باستيراد وحدة models . تحتوي هذه الوحدة على جميع الوظائف التي نحتاجها لإنشاء نموذج Django.
بإلقاء نظرة على نموذج "Shortener" ، فإن أول شيء يجب ملاحظته هو أنه يوسع models.Model . في الواقع ، أي نموذج في أي تطبيق Django يجب أن يكون فئة فرعية من النماذج.
ثم نحدد جميع الحقول التي سيحتويها النموذج في قاعدة البيانات. حقل "الإنشاء" هو تاريخ ووقت إنشاء الرابط المختصر ، لذلك نستخدم DateTimeField لإنشاء هذا النوع من الوظائف. نستخدم الوسيطة auto_now_add = True لأننا نريد تغيير الحقل فقط عند إنشاء المثيل.
يشير الحقل times_followed الثاني إلى الأوقات التي تم فيها استخدام عنوان URL المختصر. إنه حقل PositiveIntegerField ونحدد القيمة الافتراضية للصفر. هذا يعني أنه في كل مرة يقوم فيها مثيل بإنشاء الحقل times_followed ، سيقوم Django بملء هذا الحقل بـ 0.
من ناحية أخرى ، يشير long_url إلى عنوان URL الذي long_url المستخدم. إنه حقل URL ، لأننا نريد فقط من المستخدم إدخال أحرف النموذج: http://yoursite.com .
الحقل الأخير هو short_url ، ويحتوي على تفاصيل مثيرة للاهتمام. نحدد أنه يمكن أن يكون طوله 15 حرفًا فقط ، ويجب أن يكون فريدًا ، مما يعني أنه لا يمكن تكرار العناصر في هذا الحقل. أخيرًا ، نشير إلى أنه يمكن تركه فارغًا ، مما يعني أنه عند العمل مع النماذج ، لن يحتاج المستخدمون إلى كتابة التعليمات البرمجية المختصرة الخاصة بهم.
أخبرنا عن فئة Meta الداخلية ، كيف يجب أن يتصرف الفصل ، وقمنا بتعيين ترتيب (استدعاء Shortener.objects.all () ) للكائنات المختصرة بواسطة أحدث الكائنات.
__str__ الطريقة __str__ كيف يجب طباعة النموذج. لذلك إذا كان لدينا كائن مع long_url = “https://geekflare.com/” والجزء المختصر “123456” ، وقمنا بطباعته.
https://geekflare.com/ to 123456حان الوقت الآن للبحث عن طريقة لحفظ الارتباط القصير بطريقة عشوائية.
إنشاء وظيفة تقصير
سنقوم بإنشاء وظيفتين مخصصتين. الأول سينشئ رمزًا عشوائيًا والثاني سيمنع الحصول على رموز عشوائية متكررة من نموذج Shortener. للقيام بذلك ، قم بإنشاء ملف utils.py داخل تطبيق "urlshortener".
touch utils.pyداخل هذا الملف ، سنستخدم وظيفة الاختيار من الوحدة المدمجة العشوائية. هذا يسهل مهمة اختيار الأحرف العشوائية لإنشاء الكود.
''' Utilities for Shortener ''' from django.conf import settings from random import choice from string import ascii_letters, digits # Try to get the value from the settings module SIZE = getattr(settings, "MAXIMUM_URL_CHARS", 7) AVAIABLE_CHARS = ascii_letters + digits def create_random_code(chars=AVAIABLE_CHARS): """ Creates a random string with the predetermined size """ return "".join( [choice(chars) for _ in range(SIZE)] )كما ترى ، تقوم هذه الوظيفة بإرجاع سلسلة عشوائية من الطول المحدد في ملف الإعدادات أو 7 افتراضيًا. أنت تستخدم دالة getattr للحصول على متغير من وحدة الإعدادات ، ولكن دون حدوث خطأ إذا لم يتم تحديد المتغير.
لنقم ببعض الرياضيات. إذا كان لدينا 7 أماكن حيث يمكن أن يكون هناك ما يصل إلى 62 حرفًا متاحًا لكل مكان ، فإن التبديلات الممكنة هي:

بناءً على هذه الحسابات السريعة ، يمكن ملء الجزء المختصر بما يصل إلى 2.5 تريليون رمز مختلف. لذلك يمكننا أن ننسى الخروج من عناوين URL المختصرة العشوائية.
على الرغم من إمكانية وجود الكثير من التقليب ، إلا أن هناك احتمالًا ضئيلًا للحصول على أجزاء مختصرة متكررة. هذه مشكلة لأننا أنشأنا حقل عنوان shortened_url ليكون فريدًا. هذا هو السبب في أن الوظيفة التالية مفيدة للغاية.
def create_shortened_url(model_instance): random_code = create_random_code() # Gets the model class model_class = model_instance.__class__ if model_class.objects.filter(short_url=random_code).exists(): # Run the function again return create_shortened_url(model_instance) return random_code دعنا نرى ما يحدث هنا. تأخذ الوظيفة مثال نموذج "Shortener" كوسيطة. أولاً ، تُنشئ الوظيفة رمزًا عشوائيًا باستخدام create_random_code . ثم تحصل على فئة النموذج short_url إذا كان هناك أي كائن آخر له نفس short_url . إذا تم تشغيله بنفسه مرة أخرى ، ولكن إذا كان كل شيء على ما يرام ، فإنه يقوم بإرجاع الرمز العشوائي.

ستتفاعل لاحقًا مع الغلاف لإلقاء نظرة على هذه الوظيفة عن كثب.
بعد إنشاء وظيفة الأداة المساعدة ، دعنا نستخدمها لإنشاء أكواد عشوائية في نموذج الاختصار.
تعديل طريقة الحفظ
في نهاية فئة "Shortener" ، ستقوم بتعديل طريقة حفظ النموذج. يتم استدعاء طريقة الحفظ في كل مرة يتم فيها حفظ كائن في قاعدة البيانات ، لذلك سنرى كيفية استخدامها هنا.
# Import the function used to create random codes from .utils import create_shortened_url # At the end of the Shortener model def save(self, *args, **kwargs): # If the short url wasn't specified if not self.short_url: # We pass the model instance that is being saved self.short_url = create_shortened_url(self) super().save(*args, **kwargs) تمت الكتابة فوق طريقة الحفظ ، مما يعني أنك تقدم وظيفة جديدة لطريقة أصل موجودة مسبقًا. إنها تخبر Django بشكل أساسي أنه في كل مرة يتم فيها حفظ كائن "Shortener" ولم يتم تحديد short_url ، يجب ملؤه برمز عشوائي.
تشغيل الهجرات
حان الوقت الآن لإجراء عمليات الترحيل الخاصة بنموذج Shortener وتشغيلها. للقيام بذلك ، قم بتشغيل الأوامر التالية في مجلد المشروع الجذر.
$ python manage.py makemigrations Migrations for 'urlshortener': urlshortener/migrations/0001_initial.py - Create model Shortener $ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions, urlshortener Running migrations: ...... # Apply the URL shortener migrations Applying urlshortener.0001_initial... OKفي الوقت الحالي ، لا داعي للقلق بشأن ماهية الهجرات. فقط ضع في اعتبارك أنه عند تشغيل هذين الأمرين ، يقوم Django بإنشاء ملف قاعدة بيانات db.sqlite ، بناءً على النماذج التي حددتها.
لنقم بإنشاء بعض الكائنات باستخدام صدفة Django.
$ python manage.py shell >>> from urlshortener.models import Shortener >>> s = Shortener(long_url="https://geekflare.com") >>> s.short_url '' >>> s.save() >>> s.short_url 'kdWFVIc' >>> s.long_url 'https://geekflare.com' >>> print(s) https://geekflare.com to kdWFVIcهذا إلى حد كبير كيف ستعمل جميع كائنات الاختصار.
آراء الكتابة
كما قلت من قبل ، العرض هو وظيفة بسيطة تأخذ طلبًا وترجع ردًا. لذلك دعونا نرى كيفية إنشاء منظر للعالم مرحبًا.
استجابة النموذج الأساسي
داخل ملف “urlshortener / views.py” أنشئ دالة home_view . أأ
''' Shortener views ''' from django.shortcuts import render, get_object_or_404 # We will use it later from django.http import HttpResponse # Create your views here. def home_view(request): return HttpResponse("Hello world")يقوم بإرجاع رسالة بسيطة "Hello world". في وقت لاحق سترى كيف يبدو في المتصفح. الآن قم بإنشاء "urls.py" ، سيكون هناك جميع أنماط URL للتطبيق.
touch urls.py
أضف الكود التالي.
''' Urls for shortener app urlshortener/urls.py ''' from django.urls import path # Import the home view from .views import home_view appname = "shortener" urlpatterns = [ # Home view path("", home_view, name="home") ]يعلن متغير appname (كما يوحي اسمه) مسافة أسماء تطبيق urlshortener.
شرح سريعًا أننا نستورد وظيفة المسار ، والتي تُرجع عنصرًا لتضمينه في أنماط عنوان url للتطبيق. سمة الاسم هي مساحة اسم المسار ، والتي يمكن استدعاؤها داخل القوالب إذا لزم الأمر.
الآن ، دعنا نعدل عناوين URL الإجمالية للمشروع.
# config/urls.py from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # Shortener Urls path('', include('urlshortener.urls')) ]لنقم الآن بتشغيل الخادم مرة أخرى.
python manage.py runserverإذا قمت بتشغيل الخادم ، فستتلقى رسالة "Hello world" بسيطة. هذا لأنك تقوم بتضمين أنماط url من تطبيق URL Shortener في المشروع ككل.

هذه مجرد نقطة انطلاق. حان الوقت الآن لإنشاء نموذج للسماح للمستخدم بإنشاء عناوين URL مختصرة بأنفسهم.
خلق النماذج
في Django ، النموذج عبارة عن فئة بسيطة تسمح بالحصول على مدخلات من المستخدم.
ستقوم بإنشاء ملف Forms.py. إنها اتفاقية لتخزين جميع أشكال التطبيق في هذا الملف.
cd urlshortener/ touch forms.pyداخل هذا الملف ، ستقوم بإنشاء فئة “ShortenerForm” التي تمتد من “ModelForm”.
''' Shortener Forms urlshortener/forms.py ''' from django import forms from .models import Shortener class ShortenerForm(forms.ModelForm): long_url = forms.URLField(widget=forms.URLInput( attrs={"class": "form-control form-control-lg", "placeholder": "Your URL to shorten"})) class Meta: model = Shortener fields = ('long_url',)إنه نموذج نموذج لأن الغرض منه هو إنشاء كائن نموذج من إدخال المستخدم. نستخدم أيضًا وسيطة عنصر واجهة المستخدم ، والتي تتيح لنا تحديد سمة "class" (الفئة في CSS ، وليس python). هذا لأننا سنقوم بتصميم التطبيق باستخدام bootstrap لاحقًا.
الانتهاء من الآراء
بعد بناء النماذج ، حان الوقت لإنشاء منطق الأعمال النهائي للتطبيق.
انتقل إلى ملف views.py داخل تطبيق Shortener ، وقم بتعديل طريقة عرض home_view . يمكنك التحقق من Github repo في هذه اللحظة للحصول على فكرة عن شكل هيكل المشروع.
هناك نوعان من طرق العرض لتطبيق URL Shortener:
- عرض الصفحة الرئيسية: يعرض هذا نموذج الاختصار وعنوان URL الجديد إذا كان النموذج قد تم إرساله بالفعل.
- عرض إعادة التوجيه: هذا يعيد التوجيه إلى عنوان URL الطويل ويضيف 1 إلى الأوقات المتبعة.
لنبدأ بمنظر المنزل الأكثر تعقيدًا. ستحتاج إلى استيراد نموذج وشكل Shortener. أنت لا تزال تستخدم وظيفة لأنني أريدك أن تفهم كل تدفق البيانات في العرض. أيضًا ، ستستخدم المسار لقالب (لم يتم إنشاؤه بعد).
عرض الصفحة الرئيسية
''' Shortener views ''' from django.shortcuts import render # We will use it later from django.http import HttpResponse, Http404, HttpResponseRedirect # Model from .models import Shortener # Custom form from .forms import ShortenerForm # Create your views here. def home_view(request): template = 'urlshortener/home.html' context = {} # Empty form context['form'] = ShortenerForm() if request.method == 'GET': return render(request, template, context) elif request.method == 'POST': used_form = ShortenerForm(request.POST) if used_form.is_valid(): shortened_object = used_form.save() new_url = request.build_absolute_uri('/') + shortened_object.short_url long_url = shortened_object.long_url context['new_url'] = new_url context['long_url'] = long_url return render(request, template, context) context['errors'] = used_form.errors return render(request, template, context)يقوم الرأي على شرطين:
- عندما تكون طريقة HTTP تساوي GET: نحن نمرر فقط كسياق ، وهو نموذج Shortener المستخدم لإنشاء كائنات Shortener.
- عندما تساوي طريقة HTTP POST: ما زلنا نمرر النموذج في السياق لأننا نريد أن يكون المستخدم قادرًا على إدخال عنوان URL آخر. لكننا نقوم بتمرير طلب النشر إلى نموذج آخر يسمى used_form.
تتمثل إحدى الطرق الصعبة للحصول على عنوان URL الكامل للموقع ديناميكيًا في استخدام أسلوب كائن الطلب build_absolute_uri .
>>> print(request.build_absolute_uri('/')) 'https://localhost:8080/'كطريقة آمنة لمعالجة طلب خاطئ (لم يقم المستخدم بإدخال عنوان URL صالح) ، نحصل على أخطاء النموذج ونمررها كسياق ونعرض النموذج كالمعتاد. سترى لاحقًا كيفية تنفيذ عرض الخطأ في القالب.
إعادة توجيه العرض
إن redirect_url_view أبسط قليلاً. إنها طريقة عرض تفصيلية مما يعني أن العرض يعمل فقط مع كائن ما.
تأخذ هذه الوظيفة كمعلمات وطلب المستخدم والجزء المختصر من عنوان URL. ليس من الضروري تأكيد نوع الطلب الذي نتلقاه ، لأننا لا نعمل مع النماذج في هذا العرض.
def redirect_url_view(request, shortened_part): try: shortener = Shortener.objects.get(short_url=shortened_part) shortener.times_followed += 1 shortener.save() return HttpResponseRedirect(shortener.long_url) except: raise Http404('Sorry this link is broken :(') نحن نحمي العرض بعبارة try / except ، في حالة عدم العثور على الجزء المختصر في قاعدة البيانات. إذا تم العثور على الكائن ، فإنه يضيف 1 إلى الحقل times_followed ويعيد التوجيه باستخدام وظيفة HttpResponseRedirect إلى عنوان URL الخاص بالموقع المقابل للرمز العشوائي.
تحديث عناوين المواقع
بمجرد إنشاء طريقتي عرض التطبيق ، حان الوقت لإنشاء أنماط عنوان URL النهائي من خلال تضمين المسار إلى redirect_url_view .
كما هو الحال دائمًا ، تبدأ باستيراد طرق العرض ، ثم إنشاء وظيفة مسار وتمريرها كوسائط:
- مسار URL
- وجهة النظر التي تشير إلى المسار
- اسم المسار
''' Urls for shortener app urlshortener/urls.py ''' from django.urls import path # Import the home view from .views import home_view, redirect_url_view appname = "shortener" urlpatterns = [ # Home view path('', home_view, name='home'), path('<str:shortened_part>', redirect_url_view, name='redirect'), ]باستخدام إعداد عنوان URL هذا ، يبدو توجيه التطبيق على هذا النحو.
-
localhost:8000/: عرض الصفحة الرئيسية -
localhost:8000/URL-code: إعادة التوجيه إلى عنوان URL الطويل
إنشاء القوالب
كدت تصل. الشيء الوحيد الذي يفصلك عن إنشاء هذا التطبيق هو واجهة المستخدم. لذلك ، نستخدم قوالب Django.
تُستخدم القوالب لتقديم واجهة نظيفة لمستخدم التطبيق. يتم إنشاء هذه الملفات داخل التطبيق في هيكل مجلد مزدوج بالشكل: "قوالب / اسم التطبيق"
# urlshortener directory mkdir -p templates/urlshortener/ملاحظة: هيكل المجلد المزدوج ولغة قالب Django خارج نطاق هذا البرنامج التعليمي ولكن يمكنك القراءة عنها في الوثائق الرسمية.
نموذج أساسي
يسمح Django بميراث القالب. هذا يعني أنه يمكننا الحصول على قالب أساسي وتوسيعه بغرض اتباع مبدأ DRY (لا تكرر نفسك).
cd templates/urlshortener touch base.htmlيعد ملف base.html اصطلاحًا ويعني أن كل قالب آخر في التطبيق ، يجب أن يكون امتدادًا لهذا النموذج.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Django Url shortener</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0" crossorigin="anonymous" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous" /> </head> <body> {% block body %} {% endblock body %} <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8" crossorigin="anonymous" ></script> </body> </html>سنستخدم bootstrap CDN ، لإنشاء واجهة سريعة وجميلة دون الحاجة إلى ملفات CSS أو javascript.
إذا كنت تريد التعرف بعمق على علامات DTL ، فيمكنك القيام بذلك باستخدام المستندات الرسمية.
نموذج الصفحة الرئيسية
قالب الصفحة الرئيسية ، موروث من ملف base.html. هذا يعني أن هذا القالب يتضمن كل HTML من الملف الأصل.
{% extends 'urlshortener/base.html' %} {% block body %} <div class="container"> <div class="card mt-5"> <div class="card-header text-center py-3"> <h1>URL Shortner Application <i class="fas fa-link px-2"></i></h1> </div> <div class="px-3 py-4"> <form action="" method="POST"> {% csrf_token %} <div class="row g-1"> <div class="col-10">{{form.long_url}}</div> <div class="col-2"> <button class="btn btn-success btn-lg w-100" type="submit"> Shorten </button> </div> </div> </form> </div> </div> {% if errors %} <div class="alert alert-danger mt-4" role="alert"> <p>{{errors}}</p> </div> {% endif %} {% if new_url %} <div class="mx-auto text-center mt-5"> <h2 class="text-danger">Your shortened Url</h2> <p>You can copy the Link below and share it with your friends</p> <p class="">{{new_url}}</p> <p><span class="text-danger">Previous URL:</span> {{long_url}}</p> </div> {% endif %} </div> {% endblock body %}سأشرح بسرعة تدفق البيانات لهذا النموذج:
- يتم عرض نموذج الأقصر. في الداخل ، يتم تعيين رمز crsf المميز (أسباب أمنية) ، ولا يظهر سوى حقل URL الطويل للنموذج. تذكر أن هذا الحقل يحتوي على فئة CSS ، "form-control form-control-lg" ، لأننا قمنا بتعيين ذلك في النموذج.
- إذا تم العثور على أي أخطاء ، فقم بإظهارها
- إذا نجحت عملية POST ، فسيتم عرض عنوان URL الجديد.
التطبيق النهائي
تهانينا! . لقد قمت بإنشاء تطبيق وظيفي كامل لتقصير عناوين URL باستخدام Django.
فيما يلي بعض لقطات الشاشة لكيفية ظهور التطبيق.
احصل فقط على:

خطأ في تقصير URL:

URL مختصر ناجح:

عنوان URL المعاد توجيهه:

ما رأيك في عرض عرض توضيحي لتطبيق تقصير عناوين URL هذا لشخص ما؟ تحقق من كيفية عرض تطبيق Django Demo على الإنترنت.
تحدي
إذا كنت تشعر بالراحة مع مهاراتك في Django ، فلماذا لا تتدرب مع التحدي؟
استنساخ رمز هذا التطبيق وإنشاء نظام مصادقة ، حيث يمكن للمستخدمين المسجلين فقط تقصير عناوين URL الخاصة بهم.
عند الانتهاء ، أرسل طلب سحب وقم باختبار اتصالي على Twitter لعرض إنجازاتك.
تغليف
لقد وصلت إلى نهاية هذا البرنامج التعليمي. صدق أو لا تصدق ، لقد استعرضت للتو جميع الجوانب الرئيسية لإنشاء مشروع Django. أتمنى أن تكون قد وجدتها مفيدة للغاية.
في هذا البرنامج التعليمي أنت:
- تعرفت على سير عمل إنشاء تطبيق Django.
- بناء مشروع سيرة ذاتية
- فهم الاختلافات وهيكل مشاريع Django وتطبيقات Django.
- اكتشف نمط MVT.
- تم إنشاء طرق عرض قاعدة الوظيفة
- استخدم Django ORM (مخطط علاقة الكائن) لإنشاء نماذج بسيطة
هذا كل شيء ، هناك الكثير لتغطيته مع إطار عمل ويب Django ، لذا ابق على اتصال لمزيد من البرامج التعليمية المذهلة.
