اذهب إلى المحتوى

السؤال

نشر

كيف أحصل على اسم المجال/النطاق Domain لموقعي الحالي من داخل قالب في جانغو Django؟ لقد حاولت البحث في وسوم tags أوالمرشحات filters تقوم بهذا الأمر لكنني لم أتوصل إلى شيء.

هل يجب أن أحصل على meta data من الطلب الذي يرسله المتصفح أم أن هناك طرق أخرى؟

Recommended Posts

  • 1
نشر

يأتي جانغو 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

 

  • 0
نشر (معدل)

كما يمكنك القيام بذلك بالشكل التالي (هذه الطريقة ليست جيدة للانتاج):

#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}} للحصول على المجال الحالي.

تم التعديل في بواسطة Ali Haidar Ahmad
  • 0
نشر

إذا كنت تستخدم معالج السياق "request" وقمت بتثبيت البرنامج الوسيط site فإنك تستطيع فعل ذلك في ملف الاعدادات 

INSTALLED_APPS = [
    ...
    "django.contrib.sites",
    ...
]

MIDDLEWARE = [
    ...
     "django.contrib.sites.middleware.CurrentSiteMiddleware",
    ...
]

الآن سيكون لديك كائن request متاحا في القوالب ويمكنك استخدامه، وأيضا سيحتوي على مرجع للموقع الحالي, يمكنك الحصول على domain في القالب باستخدام

{{request.site.domain}}

كما يمكنك الحصول على اسم الموقع كالتالي

{{request.site.name}}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...