Amer Abdallah نشر 20 سبتمبر 2021 أرسل تقرير نشر 20 سبتمبر 2021 كيف أحصل على اسم المجال/النطاق Domain لموقعي الحالي من داخل قالب في جانغو Django؟ لقد حاولت البحث في وسوم tags أوالمرشحات filters تقوم بهذا الأمر لكنني لم أتوصل إلى شيء. هل يجب أن أحصل على meta data من الطلب الذي يرسله المتصفح أم أن هناك طرق أخرى؟ 4 اقتباس
1 سامح أشرف نشر 20 سبتمبر 2021 أرسل تقرير نشر 20 سبتمبر 2021 يأتي جانغو Django مع إطار عمل "sites" اختياري. وهي عبارة عن وسيلة ربط الكائنات والوظائف بمواقع ويب معينة، ويمكن من خلاله أن تقوم بإستخراج نطاق الموقع Domain كالتالي: from django.contrib.sites.models import Site site = Site.objects.get_current() site.domain كما يوفر جانغو Django طرق أخرى لكي يتم إحضارت نطاق الموقع، مثل التابع get_host في الكائن HttpRequest والذي يقوم بإستخراج النطاق من رأس الطلب request headers، وبالتحديد من الترويسة HTTP_X_FORWARDED_HOST (يجب أن يكون USE_X_FORWARDED_HOST مفعلًا True في ملف الإعدادات settings.py) أو من خلال HTTP_HOST (على الترتيب). ملاحظة: يمكن إستخدام الترويسة HTTP_HOST بشكل مباشر من خلال الكائن request كما في الكود التالي: request.META['HTTP_HOST'] لكن لا يجب الإعتماد على هذه الطريقة لأنها تعتمد في الأساس على الطلب الذي يرسله العميل، والذي يمكنه التلاعب به بعدة طرق، وبالتالي يستطيع تغير قيمة الترويسة HTTP_HOST بأي شيء يريده. أما إن كان نطاق الموقع ثابت وتريد إستخدامه في أكثر من مكان فيمكنك أن تقوم بتخزينه في ملف settings.py وتستدعيه في أي مكان كما ترغب، على النحو التالي: # settings.py SITE_URL = 'http://example.com' ثم يمكنك إستعمال هذا المتغير كالتالي: from django.conf import settings def site(request): return {'SITE_URL': settings.SITE_URL} طريقة أخيرة يوفرها جانغو Django وهي إستخدام التابع build_absolute_uri والذي يعيد عنوان URI بالكامل (متضمنًا على نطاق الموقع): domain = request.build_absolute_uri('/')[:-1] # https://example.com 1 اقتباس
0 Ali Haidar Ahmad نشر 20 سبتمبر 2021 أرسل تقرير نشر 20 سبتمبر 2021 (معدل) كما يمكنك القيام بذلك بالشكل التالي (هذه الطريقة ليست جيدة للانتاج): #view ضمن ال request.scheme # http or https request.META['HTTP_HOST'] # example.com request.path # /some/content/1/ #template ضمن ال {{ request.scheme }} :// {{ request.META.HTTP_HOST }} {{ request.path }} حل آخر: يتأكد SimpleLazyObject من أن استدعاء قاعدة البيانات سيحدث فقط عندما يستخدم القالب بالفعل كائن الموقع. يؤدي ذلك إلى إزالة الاستعلام من صفحات المسؤول. كما أنه يخزن النتيجة مؤقتاً: from django.utils.functional import SimpleLazyObject from django.contrib.sites.shortcuts import get_current_site def site(request): return {'site': SimpleLazyObject(lambda: get_current_site(request)),} وقم بتضمينه في الإعدادات: TEMPLATE_CONTEXT_PROCESSORS = ( "module.context_processors.site", .... ) وفي القالب يمكنك استخدام {{site.domain}} للحصول على المجال الحالي. تم التعديل في 20 سبتمبر 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
0 محمد أبو عواد نشر 20 سبتمبر 2021 أرسل تقرير نشر 20 سبتمبر 2021 إذا كنت تستخدم معالج السياق "request" وقمت بتثبيت البرنامج الوسيط site فإنك تستطيع فعل ذلك في ملف الاعدادات INSTALLED_APPS = [ ... "django.contrib.sites", ... ] MIDDLEWARE = [ ... "django.contrib.sites.middleware.CurrentSiteMiddleware", ... ] الآن سيكون لديك كائن request متاحا في القوالب ويمكنك استخدامه، وأيضا سيحتوي على مرجع للموقع الحالي, يمكنك الحصول على domain في القالب باستخدام {{request.site.domain}} كما يمكنك الحصول على اسم الموقع كالتالي {{request.site.name}} 1 اقتباس
السؤال
Amer Abdallah
كيف أحصل على اسم المجال/النطاق Domain لموقعي الحالي من داخل قالب في جانغو Django؟ لقد حاولت البحث في وسوم tags أوالمرشحات filters تقوم بهذا الأمر لكنني لم أتوصل إلى شيء.
هل يجب أن أحصل على meta data من الطلب الذي يرسله المتصفح أم أن هناك طرق أخرى؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.