مجموعة أدوات مطور جانغو: نصائح وحيل يجب معرفتها

في هذا الدليل المتقدم، سنتعمق في الميزات والتقنيات غير المعروفة ولكنها قوية للغاية والتي يمكن أن ترفع خبرتك في Django إلى آفاق جديدة. سواء كنت محترفًا متمرسًا في Django أو مطورًا متوسطًا تتطلع إلى الارتقاء إلى المستوى الأعلى، فإن هذه المقالة تعدك بتقديم شيء ذي قيمة.

تذكر أن جانغو وحش متعدد الاستخدامات، ويتطلب ترويضه فهمًا عميقًا لزواياه الأقل شهرة. إذا كنت متحمسًا لكشف لغز Django معي، تابعني هنا على مدونة بايثون العربي حتى لا تفوت أي مقالات مستقبلية.

1 حيل ORM غير التقليدية

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

  • التعبيرات الشرطية: تتيح لك التعبيرات الشرطية في Django ORM استخدام منطق if…elif…else في استعلاماتك. يمكن لفئتي  Case و  When إنشاء عبارات حالة SQL قوية. دعونا نرى مثالا:
from django.db.models import Case, When, Value, CharField
from .models import Product

products = Product.objects.annotate(
    product_type=Case(
        When(product_code__startswith='1', then=Value('ELECTRONIC')),
        When(product_code__startswith='2', then=Value('FURNITURE')),
        default=Value('OTHER'),
        output_field=CharField(),
    )
)

في المثال أعلاه، نقوم بتصنيف المنتجات إلى أنواع مختلفة بناءً على رقم البداية لرمز المنتج الخاص بها. يتم تنفيذ هذه العملية على مستوى قاعدة البيانات باستخدام عبارة SQL CASE، وذلك بفضل التعبيرات الشرطية لـ Django ORM.

  • تعبيرات F(): تسمح لك تعبيرات F() بالإشارة إلى قيم حقل النموذج وتنفيذ عمليات قاعدة البيانات باستخدامها. يمكن أن تكون مفيدة بشكل خاص لإجراء التحديثات الذرية. مثال:
from django.db.models import F
from .models import Product

Product.objects.update(stock=F('stock') - 1)

في هذا المثال، يتم استخدام التعبير F() لتقليل مخزون جميع المنتجات بمقدار منتج واحد مباشرةً في قاعدة البيانات، وهو أكثر كفاءة وأمانًا ضد ظروف السباق.

  • كائنات الجلب المسبق: تعد دالةprefetch_related() بمثابة هبة من السماء عندما يتعلق الأمر بتحسين وتقليل عدد زيارات قاعدة البيانات. لكن السحر الحقيقي يحدث عندما تستخدمه مع كائنات الجلب المسبق لتخصيص الجلب المسبق للكائنات ذات الصلة بشكل أكبر:
from django.db.models import Prefetch
from .models import Author, Book

authors = Author.objects.prefetch_related(
    Prefetch('books', queryset=Book.objects.filter(title__contains='Django'))
)

في المثال أعلاه، لكل مؤلف في  authors، يتم جلب الكتب ذات الصلة مسبقًا من قاعدة البيانات، ولكن فقط إذا كان عنوانها يحتوي على “Django”. يمكن أن يؤدي ذلك إلى تحسين استعلامات قاعدة البيانات بشكل ملحوظ عند التعامل مع الكائنات ذات الصلة.

من خلال الاستفادة من حيل ORM غير التقليدية هذه، يمكنك تحسين تطبيقات Django، وجعلها أكثر كفاءة وقابلية للصيانة، مع عرض خبرتك أيضًا في Django ORM.

2 التنميط باستخدام شريط أدوات تصحيح جانغو

عندما يتعلق الأمر بتصحيح الأخطاء وضبط الأداء، يقدم Django أداة قوية تسمى Django Debug Toolbar. تمتد مجموعة الأدوات القوية هذه إلى ما هو أبعد من دورها الافتراضي المتمثل في كونها مجرد مساعد تصحيح الأخطاء؛ إنه بمثابة ملف تعريف فعال يساعد على تحسين وتسريع تطبيقات Django. في هذا القسم، دعونا نلقي نظرة على كيفية تحقيق أقصى استفادة من مجموعة الأدوات هذه.

يعد تثبيت شريط أدوات Django Debug أمرًا بسيطًا. يمكنك إضافته إلى مشروعك عن طريق تشغيل pip install django-debug-toolbar، ثم إضافته إلى إعدادات INSTALLED_APPS و MIDDLEWARE. لكن دعنا نتجاوز الأساسيات، ونتحدث عن كيف يمكن أن يغير قواعد اللعبة لمشروع Django.

  1. تحسين SQL: إحدى الميزات الرئيسية لشريط أدوات التصحيح هي قدرته على إظهار كافة استعلامات SQL التي يتم إجراؤها أثناء الطلب. هذه الميزة ليست مفيدة فقط لتصحيح الأخطاء ولكن أيضًا لتحديد المجالات التي يمكنك من خلالها تحسين استفساراتك. يقوم شريط الأدوات بتقسيم الاستعلامات، ليظهر لك بالضبط متى وأين تم تنفيذ كل استعلام، والمدة التي استغرقها. يوفر هذا فرصة لاكتشاف الاستعلامات المتكررة، أو مشكلات N+1، أو الزيارات غير الفعالة لقاعدة البيانات التي يمكن تحسينها باستخدام ميزات Django ORM المتقدمة مثل select_related أو prefetch_related.
  2. كفاءة ذاكرة التخزين المؤقت: يوفر شريط أدوات Django Debug أيضًا رؤى حول استخدام ذاكرة التخزين المؤقت. إذا كان مشروعك يستخدم إطار عمل التخزين المؤقت الخاص بـ Django، فيمكن لشريط أدوات التصحيح أن يوضح لك أجزاء الصفحة التي تم تخزينها مؤقتًا، ومدى فعالية ذاكرة التخزين المؤقت، وأين يمكن العثور على مكاسب الأداء المحتملة.
  3. دوال عرض ملفات التعريف: بالإضافة إلى اللوحات القياسية، يمكن توسيع شريط أدوات Django Debug بلوحات خارجية. إحدى هذه اللوحات هي لوحة التوصيف، والتي يمكن أن تكون أداة رائعة لتحديد الاختناقات في دوال العرض. بمجرد تثبيته، يمكن أن يوفر تفصيلاً للوقت المستغرق في كل وظيفة أثناء الطلب، مما يساعدك على تحديد المناطق التي تحتاج إلى التحسين.
pip install django-devserver

بعد التثبيت، أضف devserver إلى INSTALLED_APPS، و devserver.middleware.DevServerMiddleware إلى MIDDLEWARE. يجب أن تكون لوحة ملفات التعريف متاحة الآن في شريط أدوات التصحيح.

من خلال إتقان شريط أدوات Django Debug وملحقاته، فإنك لا تقوم فقط بسحق الأخطاء، بل تعمل بشكل فعال على تحسين سرعة وكفاءة التطبيق. يُترجم هذا إلى تجربة مستخدم أفضل، وتعليمات برمجية أكثر قابلية للإدارة، ومجموعة جديدة من المهارات في مجموعة أدوات Django.

3 تقنيات البرمجيات الوسيطة المتقدمة لجانغو

تعد البرامج الوسيطة في Django أداة قوية، حيث تعمل كسلسلة من الخطافات في عملية الطلب/الاستجابة في Django. فهي تسمح لنا بتطبيق التغييرات أو التأثيرات على الطلبات والاستجابات عالميًا، عبر عروض متعددة. ربما تكون على دراية بالفعل ببعض البرامج الوسيطة المضمنة التي يقدمها Django مثل AuthenticationMiddleware أو SessionMiddleware. ولكن هل تعلم أنه يمكنك إنشاء برامج وسيطة خاصة بك لإنشاء مكونات قابلة لإعادة الاستخدام أو برامج وسيطة خاصة بالسياق؟ دعونا نتعمق في تقنيات البرامج الوسيطة المتقدمة هذه.

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

فيما يلي مثال لمكون وسيط بسيط:

class TermsOfServiceMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Before the view (and other middleware) are called.
        if not request.user.is_anonymous and not request.user.has_accepted_tos:
            return redirect('terms-of-service')

        response = self.get_response(request)

        # After the view is called.
        return response

مع إضافة هذه البرامج الوسيطة إلى إعدادات MIDDLEWARE، سيضمن Django أن كل مستخدم مصادق عليه قد قبل شروط الخدمة، قبل الوصول إلى أي عرض.

البرامج الوسيطة الخاصة بالسياق: ليس من الضروري دائمًا تطبيق البرامج الوسيطة على كل طلب على حدة. في بعض الأحيان، قد ترغب في تطبيق البرامج الوسيطة على عروض معينة فقط، أو بناءً على بعض الشروط في الطلب.

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

وإليك كيف يمكنك استخدام هذا:

from django.utils.deprecation import MiddlewareMixin

class SpecialCaseMiddleware(MiddlewareMixin):
    def process_view(self, request, view_func, view_args, view_kwargs):
        # If this is a view we're interested in...
        if view_func.__name__ == 'special_case_view':
            # Do some processing...
            request.special_case = 'This is a special case!'

@SpecialCaseMiddleware
def special_case_view(request):

يقدم هذا مستوى آخر من المرونة لمشاريع Django، مما يتيح لك التحكم بدقة في تدفق الطلبات والاستجابات. كما أنه يبقي وجهات نظرك أكثر تركيزًا على مهامهم الرئيسية، وهو ما يعد فوزًا لقابلية صيانة التعليمات البرمجية. سيقدم لنا القسم التالي مزيدًا من الأفكار حول النصائح والحيل الأخرى التي يجب معرفتها الخاصة بـ Django. دعونا نستمر في رحلة التعلم.

4 استغلال قنوات جانغو للعمليات غير المتزامنة

تعد Django Channels أداة رائعة تعمل على توسيع Django للتعامل مع WebSockets وHTTP طويل الاستقصاء والبروتوكولات غير المتزامنة الأخرى. على الرغم من أنها ترتبط عادةً بميزات الاتصال في الوقت الفعلي، مثل تطبيقات الدردشة، إلا أنه يمكن أيضًا الاستفادة من القنوات لإدارة المهام غير المتزامنة في تطبيق Django. دعونا نلقي نظرة على كيفية استغلال هذه الميزة القوية.

تشغيل المهام غير المتزامنة: تستخدم قنوات Django بنية تعتمد على الأحداث مدعومة من ASGI (واجهة بوابة الخادم غير المتزامنة). وهذا يجعلها أداة رائعة لإدارة المهام التي يمكن أن تستفيد من التنفيذ غير المتزامن. على سبيل المثال، إذا كانت لديك مهمة كثيفة الاستخدام للموارد ولا تريد حظر استجابة الخادم الخاص بك، فيمكنك إلغاء تحميل هذه المهمة إلى قنوات Django.

from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync

channel_layer = get_channel_layer()

def expensive_view(request):
    # Offload the expensive task to the channel layer
    async_to_sync(channel_layer.send)('expensive_task', {'type': 'expensive.task'})
    return HttpResponse("Task is being processed!")

في المستهلك:

class ExpensiveConsumer(AsyncConsumer):
    async def expensive_task(self, event):
        # Your expensive task here
        pass

سيسمح هذا للعرض الخاص بك بالاستجابة بسرعة للمستخدم أثناء معالجة المهمة في الخلفية.

استغلال WebSockets: إلى جانب المهام غير المتزامنة، تفتح قنوات Django قوة WebSockets. تقوم WebSockets بإنشاء اتصال مستمر بين العميل والخادم، مما يسمح بالاتصال ثنائي الاتجاه في الوقت الفعلي. يعد هذا أمرًا رائعًا بالنسبة للميزات التي تحتاج إلى إرسال التحديثات إلى العميل، مثل نظام الإشعارات.

فيما يلي مثال بسيط لكيفية إعداد المستهلك للتعامل مع اتصالات WebSocket:

from channels.generic.websocket import AsyncWebsocketConsumer
import json

class NotificationConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()

    async def disconnect(self, close_code):
        pass

    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        # Send message to WebSocket
        await self.send(text_data=json.dumps({
            'message': message
        }))

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

5 أسرار محرك القوالب

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

وراثة القالب: يعد وراثة القالب أداة قوية تسمح لك بإنشاء قالب أساسي يحتوي على جميع العناصر المشتركة لموقعك ويحدد الكتل التي يمكن للقوالب الفرعية تجاوزها. يساعد في إعادة استخدام التعليمات البرمجية والحفاظ على تنظيم القوالب.

لنفكر في قالب أساسي (base.html):

<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>

قد يبدو القالب الفرعي بهذا الشكل (child.html):

{% extends "base.html" %}

{% block title %}My Amazing Site{% endblock %}

{% block content %}
<!-- Your content here -->
{% endblock %}

باستخدام العلامة {% Extends %}، نخبر Django أن Child.html هو تابع لـ base.html وسيرث بنيته.

علامات القالب المخصصة: تغطي علامات القالب المضمنة في Django، مثل {% if %} و {% for %} وما إلى ذلك، نطاقًا واسعًا من حالات الاستخدام، ولكن في بعض الأحيان تحتاج إلى تنفيذ عمليات فريدة لمشروعك. هذا هو المكان الذي تأتي فيه علامات القالب المخصصة.

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

# myapp/templatetags/my_custom_tags.py

from django import template

register = template.Library()

@register.filter
def lower(value):  # Converts a string into all lowercase
    return value.lower()

في القالب الخاص بك، يمكنك تحميل العلامات المخصصة ثم استخدامها:

{% load my_custom_tags %}

<p>{{ my_string|lower }}</p>

معالجات سياق القالب: معالج السياق هو إحدى دوال Python التي تأخذ كائن الطلب كوسيطة وترجع قاموسًا لإضافته إلى السياق. يتم تحديدها باستخدام إعداد TEMPLATE_CONTEXT_PROCESSORS وهي طريقة رائعة للتأكد من توفر بيانات معينة لجميع القوالب الخاصة بك.

لنقم بإنشاء معالج سياق يضيف العام الحالي إلى كل قالب:

# myapp/context_processors.py

from datetime import datetime

def current_year(request):
    return {'current_year': datetime.now().year}

تأكد من إضافة معالج السياق إلى settings.py:

TEMPLATES = [
    {
        # ...
        'OPTIONS': {
            'context_processors': [
                # ...
                'myapp.context_processors.current_year',
            ],
        },
    },
]

الآن، يمكنك الوصول إلى السنة الحالية في القوالب الخاصة بك:

<footer>
    &copy; {{ current_year }} My Amazing Site
</footer>

تسمح لك هذه الميزات الخاصة بمحرك القوالب Django بصياغة قوالب أكثر ديناميكية وقابلية للتكيف وقابلة للصيانة. من خلال إتقان هذه التقنيات، فإنك تتخذ خطوة أخرى نحو أن تصبح مستخدمًا قويًا لـ Django.

6 زيادة مستوى الأمان باستخدام وسائل الحماية الأقل شهرة من Django

في عالم تطوير الويب المتطور باستمرار، يعد الأمان أمرًا بالغ الأهمية. يأتي Django مزودًا بمجموعة غنية من ميزات الأمان التي، عند استخدامها بشكل صحيح، يمكن أن تساعدك في إنشاء تطبيقات ويب قوية وآمنة. في هذا القسم، سنكشف عن بعض ميزات أمان Django الأقل شهرة، ولكنها شديدة التأثير، بما في ذلك الحماية من النقرات، والتحقق من صحة رأس المضيف، وإعداد SECURE_PROXY_SSL_HEADER.

حماية Clickjacking: Clickjacking هي تقنية ضارة حيث يخدع المهاجم المستخدم للنقر على شيء مختلف عما يراه، مما قد يؤدي إلى إجراءات غير مرغوب فيها. يوفر Django برنامجًا وسيطًا للحماية من النقرات عن طريق تعيين رأس X-Frame-Options في استجابات HTTP. لتنشيط هذه الحماية، أضف “django.middleware.clickjacking.XFrameOptionsMiddleware” إلى إعدادات MIDDLEWARE:

MIDDLEWARE = [
    # ...
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # ...
]

افتراضيًا، يتم تعيين الرأس على DENY، مما يعني أنه لا يمكن عرض الصفحة في إطار. يمكنك ضبط هذا باستخدام الإعداد X_FRAME_OPTIONS.

التحقق من صحة رأس المضيف: يستخدم Django رأس المضيف في طلب HTTP الوارد لإنشاء عناوين URL في حالات معينة. ومع ذلك، قد يؤدي رأس المضيف الذي تم تصميمه بشكل ضار إلى حدوث ثغرات أمنية. يقوم Django بالتحقق من صحة رأس المضيف مقابل إعداد ALLOWED_HOSTS ويعيد استجابة طلب سيئة 400 إذا كان رأس المضيف لا يتطابق مع أي نمط في القائمة.

ALLOWED_HOSTS = ['mywebsite.com', 'www.mywebsite.com']

من المهم الحفاظ على تحديث هذا الإعداد مع نمو مشروعك أو تغيير البيئات.

إعداد SECURE_PROXY_SSL_HEADER: إذا كان تطبيق Django خلف وكيل يخدم HTTPS، يحتاج Django إلى معرفة متى يكون الطلب آمنًا حتى يتمكن من إنشاء عناوين URL المناسبة وتجنب حلقات إعادة التوجيه. في هذا السيناريو، يمكنك استخدام الإعداد SECURE_PROXY_SSL_HEADER. هذا صف يمثل زوج الرأس/القيمة الذي يحدده الوكيل عند معالجة طلبات HTTPS:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

كن حذرًا مع هذا الإعداد؛ استخدمه فقط عندما تتحكم في كل من تطبيق Django والخادم الوكيل، حيث قد يؤدي ذلك إلى مشكلات أمنية إذا تمت تهيئته بشكل خاطئ.

تشكل ميزات الأمان هذه جزءًا لا يتجزأ من ترسانة Django المدمجة ضد تهديدات الويب الشائعة. على الرغم من أنها قد لا تتم مناقشتها بشكل شائع مثل عمليات حماية CSRF أو XSS، إلا أن تطبيقها الصحيح يمكن أن يوفر تعزيزًا كبيرًا لأمان تطبيقك. تذكر دائمًا أن التطبيق الآمن هو تطبيق جدير بالثقة!

7 إتقان إشارات جانغو

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

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

from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(post_save, sender=MyModel)
def mymodel_saved(sender, **kwargs):
    print("A MyModel instance was saved!")

في هذا المثال، سيتم استدعاء الدالة mymodel_saved في كل مرة يتم فيها حفظ مثيل MyModel.

منع الإشارات المكررة: إذا كان تطبيقك يعمل في عمليات متعددة (على سبيل المثال، عمليات عاملة متعددة في خادم WSGI)، فقد تجد أنه يتم تنفيذ إشاراتك أكثر من مرة لحدث واحد. وذلك لأن كل عملية لها مساحة ذاكرة خاصة بها، وبالتالي معالجات الإشارة الخاصة بها. لمنع ذلك، تأكد من توصيل إشاراتك في وحدة نمطية محملة على مستوى الوحدة (كما هو الحال في models.py أو بطريقة جاهزة لـ AppConfig).

استخدام إشارات مخصصة للحصول على كود أنظف: يتضمن Django مجموعة من الإشارات المضمنة التي تسمح لمرسلين معينين بإخطار مجموعة من المستقبلين عند حدوث إجراءات محددة. ولكن يمكنك أيضًا إنشاء إشاراتك الخاصة. تساعد الإشارات المخصصة على فصل التطبيقات ويمكن أن تجعل التعليمات البرمجية أكثر وضوحًا:

from django.dispatch import Signal

# Defining a custom signal
my_signal = Signal(providing_args=["arg1", "arg2"])

# Elsewhere in your code...
my_signal.send(sender=this_module, arg1='Hello', arg2='World')

هنا، my_signal هي إشارة مخصصة. يمكن إرسالها من أي مكان في الكود باستخدام التابعsend() وسيستقبلها أي مستقبل متصل بهذه الإشارة.

من خلال الفهم الكامل واستخدام إشارات Django، يمكنك كتابة المزيد من التعليمات البرمجية المنفصلة والقابلة للصيانة والنظيفة.

لقد غطينا الكثير من الأمور، لكن رحلتنا عبر ميزات Django المتقدمة لم تنته بعد.

8 أسرار نظام المصادقة في جانغو

نظام المصادقة المدمج في Django قوي وآمن ومرن للغاية. من المحتمل أنك تستخدمه بالفعل لإدارة حسابات المستخدمين وتسجيلات الدخول والأذونات. ولكن دعونا نتعمق قليلاً ونكتشف بعض الميزات القوية والأقل استخدامًا، مثل نماذج المستخدم المخصصة، والمصادقة الخلفية، وغيرها من الميزات المخفية.

نماذج المستخدم المخصصة: على الرغم من أن نموذج المستخدم الافتراضي في Django شامل، إلا أنه قد لا يناسب احتياجاتك تمامًا. يتيح لك Django استبدال نموذج المستخدم الافتراضي بنموذج مخصص. يعد هذا مفيدًا عندما تريد إضافة حقول إضافية، مثل السيرة الذاتية أو رقم الهاتف، أو إذا كنت تريد أن يكون حقل “اسم المستخدم” بريدًا إلكترونيًا.

فيما يلي مثال بسيط لنموذج مستخدم مخصص:

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=20)
    bio = models.TextField(blank=True)

لإخبار Django باستخدام هذا النموذج كنموذج للمستخدم، يمكنك إضافة ما يلي إلى ملف الإعدادات:

AUTH_USER_MODEL = 'myapp.CustomUser'

مصادقة الواجهة الخلفية: نظام مصادقة Django مدعوم ببنية خلفية قابلة للتوصيل. وهذا يعني أنه يمكنك إضافة طرق مصادقة متعددة، أو حتى كتابة طرق مصادقة خاصة بك. على سبيل المثال، قد يكون لديك مستخدمين في نظام قديم تحتاج إلى المصادقة عليه، أو ربما تريد مصادقة المستخدمين استنادًا إلى رمز OAuth المميز.

فيما يلي مثال على الواجهة الخلفية للمصادقة البسيطة:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None

        if user.check_password(password):
            return user

    def get_user(self, user_id):
        UserModel = get_user_model()
        try:
            return UserModel.objects.get(pk=user_id)
        except UserModel.DoesNotExist:
            return None

تقوم هذه الواجهة الخلفية بمصادقة المستخدم بناءً على بريده الإلكتروني وكلمة المرور. لاستخدامه، يمكنك إضافة ما يلي إلى ملف الإعدادات:

AUTHENTICATION_BACKENDS = ['path.to.EmailBackend']

من خلال توسيع وتخصيص نظام مصادقة Django، يمكنك دمج Django بشكل أكثر إحكامًا مع حالة الاستخدام المحددة الخاصة بك، مع الاستمرار في الاستفادة من إطار المصادقة القوي والآمن لـ Django.

9 تحسين Django باستخدام أدوات أقل شهرة

يعد تحسين الأداء أحد الجوانب التي يتم تجاهلها غالبًا في تطوير Django، ولكنه يمكن أن يؤدي إلى تحسينات كبيرة في سرعة التطبيق وكفاءته. ولحسن الحظ، فإن نظام Django يعج بالأدوات القوية التي يمكن أن تساعدك على تحسين أداء تطبيقك. دعنا نستكشف ثلاث أدوات أقل شيوعًا يمكنك استخدامها لتحسين جانغو: Django DevServer، وSilk، وDjango-Test-Without-Migrations.

Django DevServer: هذا بديل مباشر لخادم التطوير المدمج في Django. فهو يوفر ميزات إضافية مثل تسجيل استعلام SQL، واستخدام ذاكرة التخزين المؤقت، ومراقبة حمل وحدة المعالجة المركزية والذاكرة، مما يساعدك على تحديد اختناقات الأداء.

لاستخدام Django DevServer، عليك أولاً تثبيته:

pip install git+https://github.com/dcramer/django-devserver.git

ثم تقوم بإضافته إلى قائمة INSTALLED_APPS في settings.py:

INSTALLED_APPS = [
    ...,
    'devserver',
    ...
]

Silk: هي أداة تحليل وفحص مباشرة لـ Django. فهو يعترض ويخزن طلبات HTTP واستعلامات قاعدة البيانات قبل تقديمها في واجهة سهلة الاستخدام. يمكنك تصور المكان الذي يقضي فيه تطبيقك الوقت، مما يسمح لك بتحسين استعلامات قاعدة البيانات وعرض تتبعات المكدس والتحقق من مشكلات الأداء.

لتثبيته:

pip install django-silk

بعد ذلك، يمكنك إضافته إلى البرامج الوسيطة والتطبيقات المثبتة:

MIDDLEWARE = [
    ...,
    'silk.middleware.SilkyMiddleware',
    ...
]

INSTALLED_APPS = [
    ...,
    'silk',
    ...
]

Django-Test-Without-Migrations: على الرغم من أن هذه الأداة ليست تحسينًا لأداء تطبيقك المباشر، إلا أنها يمكنها تسريع مجموعة الاختبار بشكل كبير عن طريق تخطي عمليات الترحيل. إنه مفيد بشكل خاص إذا كان لديك عدد كبير من عمليات الترحيل التي تؤدي إلى إبطاء اختباراتك.

لتثبيت Django-Test-Without-Migrations:

pip install django-test-without-migrations

بعد ذلك، يمكنك إجراء اختباراتك بدون عمليات ترحيل باستخدام أمر test_without_migrations:

python manage.py test_without_migrations

يمكن لهذه الأدوات تسليط الضوء على الجوانب المظلمة لأداء تطبيق Django، وتوجيهك نحو تطبيق أسرع وأكثر كفاءة.

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


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading