Django / أساس الطلب والبيانات / الدرس 4
القوالب والسياق والهروب النصي
اعرض HTML ذات معنى بسياق ضيق واحفظ الفرق بين هروب النص والثقة في سياقات أخرى.
في هذه الصفحة
أهداف الدرس
- تصف القوالب العرض
- إبقاء السلاسل غير الموثوقة نصا
- مراجعة الناتج صفحة ميسرة كاملة
تصف القوالب العرض
يختار العرض البيانات والنتيجة ويصف القالب ظهور المعتمد. أبعد الاستعلام المكلف وقرار الإذن والكتابة عن العرض البصري. لغة القالب مقيدة لا Python اعتباطية. مرر اللازم لا كل الطلب والنموذج. تنظم الأسماء والمجلدات ويشارك التوارث القالب العام، لكنه لا يضمن العناوين والتسميات؛ راجع HTML النهائية كاملة. ويجب أن يظل السياق محددا بمتطلبات الصفحة، لأن تمرير كائن كبير بلا مراجعة قد يكشف حقولا لم يكن من المقصود إدراجها في الناتج.
العثور على القوالب بإعداد صريح
تحدد المحركات والمحملات البحث بالاسم، وقد يستخدم المشروع مجلداته وقوالب التطبيقات. ضع نطاق مجلد للتطبيق لتجنب الأسماء العامة. قد يعني الخطأ اسما أو مجلدا أو تطبيقا أو محركا خاطئا لا استيرادا. افحص محاولات البحث بأمان. تستخدم البرامج Engine في الذاكرة دون ادعاء ملفات؛ وتحتاج المقاطع ملفاتها وإعدادها. وقد يوجد الملف فعلا في القرص لكن لا يبحث عنه المحرك المختار في ذلك الموضع، ولذلك يكون دليل المحمل أهم من تخمين مكان الملف.
إبقاء السلاسل غير الموثوقة نصا
يدخل المثال نصا يبدو ترميزا في فقرة فينتج أقواسا مهربة لا عنصر تأكيد. يفيد ذلك نص HTML العادي وليس تعقيما عاما للسكربت وCSS والعنوان والسمة العشوائية. لا تستخدم safe أو تعطل الهروب لأن المصدر قاعدتك؛ فقد كتبه مستخدم. فضل بنية حول البيانات وحدا مراجعا للمحتوى الغني عند الحاجة، وافصل الهروب والإذن. ولا يغير حفظ المحتوى في قاعدة التطبيق درجة الثقة بمؤلفه؛ فالنص الذي كتبه مستخدم يبقى محتاجا إلى المعالجة المناسبة عند إخراجه.
from django.conf import settings
settings.configure(
SECRET_KEY="synthetic-course-key",
USE_I18N=False, USE_TZ=True,
INSTALLED_APPS=[],
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
DEFAULT_AUTO_FIELD="django.db.models.AutoField",
ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()
from django.template import Engine, Context
template = Engine().from_string("<p>{{ label }}</p>")
print(template.render(Context({"label": "<em>Draft</em>"})))
<p><em>Draft</em></p>
يحفظ الهروب السلسلة نصا داخل الفقرة المعروفة دون منفذ HTML خام.
عرض المجموعات بفراغ صريح
يعرض المثال قائمة وبديل فراغ، وتوضح البنية التجميع وتميز الرسالة عدم النتائج الناجح من الخطأ المخفي. لا تحول فشل القاعدة لقائمة نجاح. قد يثير الوصول الكسول استعلامات، فجهز العلاقات والحدود قبل العرض. تستخدم العينة قواميس وتثبت الفرع لا خطة قاعدة أو كلفتها. ولهذا ينبغي أن تكون رسالة الفراغ نتيجة استعلام ناجح بلا عناصر، لا ستارا لمشكلة اتصال أو استثناء أُخفي عن طبقة الإبلاغ.
from django.conf import settings
settings.configure(
SECRET_KEY="synthetic-course-key",
USE_I18N=False, USE_TZ=True,
INSTALLED_APPS=[],
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
DEFAULT_AUTO_FIELD="django.db.models.AutoField",
ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()
from django.template import Engine, Context
template = Engine().from_string("<ul>{% for item in items %}<li>{{ item.title }}</li>{% empty %}<li>No courses</li>{% endfor %}</ul>")
print(template.render(Context({"items": [{"title": "Django"}, {"title": "Python"}]})))
print(template.render(Context({"items": []})))
<ul><li>Django</li><li>Python</li></ul>
<ul><li>No courses</li></ul>
للقالب ناتج عادي وفراغ ناجح مختلفان والمدخل قواميس محلية.
مراجعة الناتج صفحة ميسرة كاملة
افحص HTML النهائية ومعرفاتها وروابطها وعناوينها وتسمياتها بعد الدمج، وحدد المحلية والاتجاه دون عكس النص. تكمل مراجعة المتصفح والمفاتيح اختبارات القالب، ولا يثبت وجود عبارة ظهورها أو ارتباطها بالحقل. احذر تخزين الأجزاء والرؤية المرتبطة بالإذن كي لا تخلط المحتوى الخاص بين المستخدمين. ويحتاج التخزين المؤقت للأجزاء المخصصة حسب المستخدم مراجعة مستقلة، حتى لا تتشارك هويتان ناتجا واحدا يتضمن تفاصيل لا يسمح لهما بقراءتها.
الأخطاء الشائعة وإصلاحها
تصير السلسلة ترميزا غير مقصود
- لماذا يحدث؟
- تجاوز الهروب دون عقد.
- كيف تصلحه؟
- استخدم النص أو حدا مراجعا.
- كيف تتجنب تكراره؟
- اجعل safe استثناء مختبرا.
لا يوجد القالب بعد النقل
- لماذا يحدث؟
- اختلف المحمل أو إعداد التطبيق.
- كيف تصلحه؟
- افحص الاسم ومواضع البحث.
- كيف تتجنب تكراره؟
- استخدم نطاقا واختبر الحل.
ينفذ العرض استعلامات زائدة
- لماذا يحدث؟
- قرئت علاقات كسولة.
- كيف تصلحه؟
- جهز الرسم قبل العرض.
- كيف تتجنب تكراره؟
- قس طلبا متعدد الصفوف.
اختبر فهمك
1. لماذا تخطر safe لنص من قاعدة التطبيق؟
اعرض الحل المشروح
لا يثبت التخزين مصدرا موثوقا أو ترميزا آمنا. أبق الهروب أو عقّم الغني المدعوم بحد ضيق، ولا تحول ضمان القراءة لضمان تنفيذ HTML.
2. ماذا تضيف لاختبار وجود كلمة «البريد»؟
اعرض الحل المشروح
تحقق من علاقة التسمية بالحقل وفرادة المعرف والشرح والخطأ والمفاتيح، فقد تكون الكلمة بفقرة أخرى والحقل بلا اسم.
أهم ما تعلمته
- اجعل السياق مقصودا محدودا.
- يحمي الهروب سياقا محددا.
- افحص HTML المركبة وسلوكها.