জ্যাঙ্গো টেমপ্লেটের মধ্যে কীভাবে আমি আমার সাইটের ডোমেন নাম পেতে পারি?


156

জ্যাঙ্গো টেম্পলেট থেকে আমি কীভাবে আমার বর্তমান সাইটের ডোমেন নাম পাব? আমি ট্যাগ এবং ফিল্টারগুলি দেখার চেষ্টা করেছি কিন্তু সেখানে কিছুই নেই।

উত্তর:


67

আমি মনে করি আপনি যা চান তা হ'ল অনুরোধ প্রসঙ্গে অ্যাক্সেস পাওয়া উচিত, অনুরোধকন্টেক্সট দেখুন।


140
request.META['HTTP_HOST']আপনাকে ডোমেন দেয়। এটি একটি টেমপ্লেটে হবে {{ request.META.HTTP_HOST }}
ড্যানিয়েল রোজম্যান

29
অনুরোধ মেটাডেটা ব্যবহারে সতর্ক থাকুন। এটি একটি ব্রাউজার থেকে আসছে এবং ছদ্মবেশী করা যায়। সাধারণভাবে, আপনি সম্ভবত নীচে @ কার্লমিয়ারের পরামর্শ দিয়েছিলেন যেতে চাইবেন।
জোশ

2
আমার উদ্দেশ্যে, এটির কোনও সুরক্ষা গর্ত নেই।
পল ড্রাগার

7
আমার ধারণা, অনুমতিপ্রাপ্ত হোস্টগুলি সেটিংস ব্যবহারের জন্য সেটিংসের সাথে জ্যাঙ্গো ০.১ docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
ড্যানিয়েল ব্যাকম্যান

8
"সুরক্ষা গর্ত" কী তা কেউ ব্যাখ্যা করতে পারেন? যদি ব্যবহারকারী Host:কোনও পৃষ্ঠার কোথাও ছদ্মবেশী ডোমেনের সাথে শিরোনামটি স্পুফ করে এবং প্রতিক্রিয়া ফিরে পায় তবে কীভাবে এটি একটি সুরক্ষা গর্ত তৈরি করবে? আমি দেখতে পাচ্ছি না যে এটি কোনও ব্যবহারকারীর দ্বারা উত্পাদিত এইচটিএমএল গ্রহণ এবং নিজের ব্রাউজারে খাওয়ানোর আগে নিজেকে সংশোধন করা থেকে আলাদা।
ব্যবহারকারী 193130

105

আপনি যদি সত্যিকারের এইচটিটিপি হোস্ট শিরোনাম চান তবে @ ফিসিয়াওর উত্তরে ড্যানিয়েল রোজম্যানের মন্তব্য দেখুন। অন্য বিকল্পটি হ'ল যদি আপনি অবদানের সাইটগুলি কাঠামো ব্যবহার করছেন , আপনি ডাটাবেসের কোনও সাইটের জন্য একটি কমনীয় ডোমেন নাম সেট করতে পারেন (অনুরোধ ডোমেনটিকে একটি সেটিংস ফাইলে ম্যাপিং করে যথাযথ এসআইটিআইআইডি সহ কিছু করতে হবে যা আপনাকে নিজের মাধ্যমে করতে হবে ওয়েবসার্ভার সেটআপ)। সেক্ষেত্রে আপনি খুঁজছেন:

from django.contrib.sites.models import Site

current_site = Site.objects.get_current()
current_site.domain

আপনি যদি বর্তমান_সাইট অবজেক্টটি টেমপ্লেট প্রসঙ্গে নিজেকে ব্যবহার করতে চান তবে এটি ব্যবহার করতে হবে। আপনি যদি এটি পুরো জায়গা জুড়ে ব্যবহার করেন তবে আপনি এটি কোনও টেম্পলেট প্রসঙ্গ প্রসেসরে প্যাকেজ করতে পারেন।


3
আমার মতো একই সমস্যা আছে এমন কারও জন্য স্পষ্ট করে বলতে: আপনার SITE_IDসেটিংসটি idসাইটের অ্যাপ্লিকেশনটিতে বর্তমান সাইটের বৈশিষ্ট্যের সমান (আপনি idসাইট অ্যাডমিন প্যানেলে সন্ধান করতে পারেন ) তা পরীক্ষা করে দেখুন। আপনি যখন কল করবেন get_current, জাজানো আপনার নেবে SITE_IDএবং Siteসেই আইডিটি দিয়ে ডাটাবেস থেকে অবজেক্টটি ফিরিয়ে দেয় ।
ডেনিস গোলোমাজভ

এগুলির কোনওোটাই আমার পক্ষে কাজ করে না। print("get_current_site: ", get_current_site(request)) print("absolute uri: ", request.build_absolute_uri()) print("HTTP_HOST: ", request.META['HTTP_HOST']) get_current_site: localhost:8001 absolute uri: http://localhost:8001/... HTTP_HOST: localhost:8001
ব্যবহারকারী 251242

86

আমি {{ request.get_host }}পদ্ধতিটি আবিষ্কার করেছি ।


11
দয়া করে মনে রাখবেন যে এই উত্তরের ড্যানিয়েল রোজম্যানের পদ্ধতির একই সমস্যা রয়েছে (এটি ছদ্মবেশী হতে পারে) তবে এটি সম্ভবত আরও সম্পূর্ণ যখন HTTP_X_FORWARDED_HOSTHTTP শিরোনামের অ্যাকাউন্টে লাগে এইচটিটিপি প্রক্সি বা লোড ব্যালান্সারের মাধ্যমে হোস্টটি পৌঁছে যায় ।
furins

4
ব্যবহার: "// {{request.get_host}} / অন্য কিছু / আপনি / চান" ... আপনার ALLOWED_HOSTS সেটিংটি পূরণ করতে ভুলবেন না ( ডক্টস.ডজ্যাঙ্গোপ্রজেক্ট /en / ১.৫ / রেফ / সেটিং / # বাতিল -হোস্টস )।
শেঠ

3
@Seth ব্যবহার ভাল request.build_absolute_uri( docs.djangoproject.com/en/dev/ref/request-response/... )
MrKsn

60

কার্ল মেয়ের পরিপূরক, আপনি এটির মতো একটি প্রসঙ্গ প্রসেসর তৈরি করতে পারেন:

module.context_processors.py

from django.conf import settings

def site(request):
    return {'SITE_URL': settings.SITE_URL}

স্থানীয় সেটিংস.পি

SITE_URL = 'http://google.com' # this will reduce the Sites framework db call.

settings.py

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    "module.context_processors.site",
    ....
 )

টেমপ্লেটগুলি প্রসঙ্গে ফিরে আসা url সাইটটি হ'ল site IT SITE_URL E_}

প্রসঙ্গত প্রসেসরে সাবডোমেনগুলি বা এসএসএল হ্যান্ডেল করতে চাইলে আপনি নিজের রটিন লিখতে পারেন।


আমি এই সমাধানটি চেষ্টা করেছিলাম তবে একই প্রয়োগের জন্য যদি আপনার বেশ কয়েকটি সাবডোমেন থাকে তবে এটি ব্যবহারিক নয়, ড্যানব্রেজে আমি উত্তরটি খুব দরকারী বলে খুঁজে পেয়েছি
জোসে লুইস লা লা রোজা

সেটিংসে.পি আপনাকে অবশ্যই আপনার প্রসঙ্গ প্রসেসরটি প্রসঙ্গ_প্রসেসরগুলি> বিকল্পগুলি>
টিমপ্লেটগুলি

24

আমি ব্যবহার করি প্রসঙ্গ প্রসেসরের বিভিন্নতা:

from django.contrib.sites.shortcuts import get_current_site
from django.utils.functional import SimpleLazyObject


def site(request):
    return {
        'site': SimpleLazyObject(lambda: get_current_site(request)),
    }

SimpleLazyObjectমোড়কের নিশ্চিত ডিবি কল শুধুমাত্র তখনই ঘটে যখন টেমপ্লেট আসলে ব্যবহার করে নির্মিত হয় siteঅবজেক্ট। এটি প্রশাসক পৃষ্ঠাগুলি থেকে ক্যোয়ারী সরিয়ে দেয়। এটি ফলাফলকেও ক্যাশে করে।

এবং সেটিংসে এটি অন্তর্ভুক্ত করুন:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    "module.context_processors.site",
    ....
)

টেমপ্লেটে, আপনি {{ site.domain }}বর্তমান ডোমেন নাম পেতে ব্যবহার করতে পারেন ।

সম্পাদনা: প্রোটোকল স্যুইচিং সমর্থন করতে, ব্যবহার করুন:

def site(request):
    site = SimpleLazyObject(lambda: get_current_site(request))
    protocol = 'https' if request.is_secure() else 'http'

    return {
        'site': site,
        'site_root': SimpleLazyObject(lambda: "{0}://{1}".format(protocol, site.domain)),
    }

আপনার SimpleLazyObjectএখানে ব্যবহার করার দরকার নেই, কারণ ল্যাম্বডা কোনওভাবেই 'সাইট' অ্যাক্সেস না করলে কল করা হবে না।
একরঙা

আপনি যদি অপসারণ করেন তবে SimpleLazyObjectপ্রত্যেকে RequestContextকল করবে get_current_site()এবং সুতরাং একটি এসকিউএল কোয়েরি চালাবে। মোড়ক নিশ্চিত করে যে পরিবর্তনশীলটি কেবলমাত্র টেমপ্লেটে ব্যবহৃত হলেই এটির মূল্যায়ন হয়।
vdboor

1
যেহেতু এটি একটি ফাংশন, তাই হোস্ট স্ট্রিংটি প্রক্রিয়া করা হবে না যতক্ষণ না এটি ব্যবহার করা হয়। সুতরাং, আপনি কেবল 'site_root' এ একটি ফাংশন বরাদ্দ করতে পারেন এবং আপনার সরললজিঅবজেক্টের প্রয়োজন নেই। জাঙ্গো যখন এটি ব্যবহার করবে তখন ফাংশনটি কল করবে। আপনি ইতিমধ্যে এখানে একটি ল্যাম্বডা দিয়ে প্রয়োজনীয় ফাংশন তৈরি করেছেন।
মনোক্রোম

হ্যাঁ, কেবল একটি ল্যাম্বডা কাজ করবে। SimpleLazyObjectফাংশন, যা সত্যিই প্রয়োজন হয় না, যেহেতু এর reevaluation এড়াতে আছে Siteবস্তুর সংরক্ষিত করা হয়েছে।
vdboor

আমদানি এখনfrom django.contrib.sites.shortcuts import get_current_site
হরবান

22

আমি জানি এই প্রশ্নটি পুরানো, তবে আমি বর্তমান ডোমেনটি পাওয়ার জন্য অজগরিক উপায়ের সন্ধানে এটিকে হোঁচট খেয়েছি।

def myview(request):
    domain = request.build_absolute_uri('/')[:-1]
    # that will build the complete domain: http://foobar.com

4
build_absolute_uriএখানে নথিভুক্ত করা হয়
ফিলিপ জেডলার

19

দ্রুত এবং সহজ, তবে উত্পাদনের জন্য ভাল নয়:

(একটি দৃষ্টিতে)

    request.scheme               # http or https
    request.META['HTTP_HOST']    # example.com
    request.path                 # /some/content/1/

(একটি টেমপ্লেটে)

{{ request.scheme }} :// {{ request.META.HTTP_HOST }} {{ request.path }}

একটি অনুরোধকন্টেক্সট ব্যবহার করার বিষয়ে নিশ্চিত হন , আপনি যদি রেন্ডার ব্যবহার করেন তবে এটিই হ'ল

request.META['HTTP_HOST']উত্পাদনে বিশ্বাস করবেন না : সেই তথ্যটি ব্রাউজার থেকে আসে। পরিবর্তে, @ কার্লমিয়ারের উত্তরটি ব্যবহার করুন


আমি এই উত্তরটি সমর্থন করছি তবে ব্যবহারের চেষ্টা করার সময় আমি একটি ত্রুটি পেয়েছি request.scheme। সম্ভবত শুধুমাত্র জাঙ্গোর নতুন সংস্করণগুলিতে উপলব্ধ।
ম্যাট ক্রিমেন্স

@ ম্যাটক্রিমেন্স request.schemeজ্যাঙ্গো ১.7 এ যুক্ত হয়েছিল।
এস। কি

16

{{ request.get_host }}ALLOWED_HOSTSসেটিংসের সাথে একসাথে ব্যবহার করার সময় এইচটিটিপি হোস্ট শিরোনাম আক্রমণ থেকে রক্ষা করা উচিত (জাজানো ১.৪.৪ এ যুক্ত)।

নোট যে {{ request.META.HTTP_HOST }}একই সুরক্ষা নেই। দস্তাবেজগুলি দেখুন :

ALLOWED_HOSTS

এই জ্যাঙ্গো সাইটটি পরিবেশন করতে পারে এমন হোস্ট / ডোমেনের নাম উপস্থাপন করে এমন স্ট্রিংয়ের একটি তালিকা। এটি HTTP হোস্ট শিরোনামের আক্রমণগুলি প্রতিরোধ করার জন্য একটি সুরক্ষা ব্যবস্থা , যা অনেকগুলি আপাতদৃষ্টিতে-নিরাপদ ওয়েব সার্ভার কনফিগারেশনের অধীনেও সম্ভব।

... যদি Hostহেডার (অথবা X-Forwarded-Hostযদি USE_X_FORWARDED_HOSTসক্ষম হয়) এই তালিকায় কোনো মান মেলে না, django.http.HttpRequest.get_host()পদ্ধতি তুলবে SuspiciousOperation

... এই বৈধতা কেবলমাত্র এর মাধ্যমে প্রযোজ্য get_host(); যদি আপনার কোডটি সরাসরি আপনার কাছ থেকে হোস্ট শিরোনাম অ্যাক্সেস করে তবে request.METAএই সুরক্ষা সুরক্ষাটিকে বাইপাস করছেন।


requestআপনার টেম্পলেটটিতে ব্যবহার করার জন্য , টেম্পলেট-উপস্থাপনা ফাংশন কলগুলি জাঙ্গো ১.৮ এ পরিবর্তিত হয়েছে , সুতরাং আপনাকে আর RequestContextসরাসরি হ্যান্ডেল করতে হবে না।

শর্টকাট ফাংশনটি ব্যবহার করে দেখার জন্য টেমপ্লেটটি কীভাবে রেন্ডার করতে হবে তা এখানে render():

from django.shortcuts import render

def my_view(request):
    ...
    return render(request, 'my_template.html', context)

ইমেলের জন্য কোনও টেম্পলেটটি কীভাবে রেন্ডার করবেন তা এখানে, যা আইএমও হ'ল হোস্টের মানটি আপনি দেখতে চান এমন সাধারণ বিষয়:

from django.template.loader import render_to_string

def my_view(request):
    ...
    email_body = render_to_string(
        'my_template.txt', context, request=request)

ইমেল টেমপ্লেটে একটি সম্পূর্ণ URL যুক্ত করার উদাহরণ এখানে; অনুরোধ.স্কিমটি পাওয়া উচিত httpবা httpsআপনি যা ব্যবহার করছেন তার উপর নির্ভর করে:

Thanks for registering! Here's your activation link:
{{ request.scheme }}://{{ request.get_host }}{% url 'registration_activate' activation_key %}

10

আমি একটি কাস্টম টেম্পলেট ট্যাগ ব্যবহার করি। যেমন যোগ করুন <your_app>/templatetags/site.py:

# -*- coding: utf-8 -*-
from django import template
from django.contrib.sites.models import Site

register = template.Library()

@register.simple_tag
def current_domain():
    return 'http://%s' % Site.objects.get_current().domain

এটি এই জাতীয় টেমপ্লেটে ব্যবহার করুন:

{% load site %}
{% current_domain %}

এই পদ্ধতির কোনও বিশেষ ক্ষতি আছে কি? প্রতিটি অনুরোধে সাইট ডিবি কল করা ছাড়াও।
kicker86

@ Kicker86 আমি কোন কিছুই জানি না। get_current: একটি নথিভুক্ত পদ্ধতি docs.djangoproject.com/en/dev/ref/contrib/sites/...
ডেনিস Golomazov

3
'http://%s'httpsসংযোগের ক্ষেত্রে সমস্যা হতে পারে ; এক্ষেত্রে স্কিমটি গতিশীল নয়।
অর্গানিক

4

পঞ্চিচরের ব্যবহারকারীর জবাবের মতো, আমি খুব সাধারণ ওয়েবসাইটে এটি করেছি। এটি কয়েকটি ভেরিয়েবল সরবরাহ করে এবং সেগুলি টেমপ্লেটে উপলব্ধ করে।

SITE_URLমত একটি মূল্য রাখা হবে example.com
SITE_PROTOCOLমত একটি মূল্য রাখা হবে http বা https
SITE_PROTOCOL_URLমত একটি মূল্য রাখা হবে http://example.comবা https://example.com
SITE_PROTOCOL_RELATIVE_URLমত একটি মূল্য রাখা হবে //example.com

মডিউল / context_processors.py

from django.conf import settings

def site(request):

    SITE_PROTOCOL_RELATIVE_URL = '//' + settings.SITE_URL

    SITE_PROTOCOL = 'http'
    if request.is_secure():
        SITE_PROTOCOL = 'https'

    SITE_PROTOCOL_URL = SITE_PROTOCOL + '://' + settings.SITE_URL

    return {
        'SITE_URL': settings.SITE_URL,
        'SITE_PROTOCOL': SITE_PROTOCOL,
        'SITE_PROTOCOL_URL': SITE_PROTOCOL_URL,
        'SITE_PROTOCOL_RELATIVE_URL': SITE_PROTOCOL_RELATIVE_URL
    }

settings.py

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    "module.context_processors.site",
    ....
 )

SITE_URL = 'example.com'

তারপর, আপনার টেমপ্লেটগুলি তাদের হিসাবে ব্যবহার {{ SITE_URL }}, {{ SITE_PROTOCOL }}, {{ SITE_PROTOCOL_URL }}এবং{{ SITE_PROTOCOL_RELATIVE_URL }}


2

জাজানো টেমপ্লেটে আপনি এটি করতে পারেন:

<a href="{{ request.scheme }}://{{ request.META.HTTP_HOST }}{{ request.path }}?{{ request.GET.urlencode }}" >link</a>

1
এটি আমার জন্য কাজ করে আপনাকে ধন্যবাদ। আমাকে টেমপ্লেটস, প্রসঙ্গ_প্রসেসরগুলিতে অনুরোধ সক্ষম করতে হয়েছিল: django.template.context_processors.requestএছাড়াও [এটি কীভাবে সাহায্য করতে হবে] ( সিম্পিসবেটের্থানকম্প্লেক্স.com
tips

সম্মত হন, ভিটার ফ্রেইটাস ব্লগ জাঙ্গো বিকাশকারীদের জন্য দুর্দান্ত উত্স! :)
ডস

2

আপনি যদি "অনুরোধ" প্রসঙ্গ প্রসেসরটি ব্যবহার করেন এবং জ্যাঙ্গো সাইটগুলি কাঠামো ব্যবহার করছেন এবং সাইট মিডলওয়্যার ইনস্টল করেছেন (যেমন আপনার সেটিংস এগুলিকে অন্তর্ভুক্ত করে):

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

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

TEMPLATES = [
    {
        ...
        "OPTIONS": {
            "context_processors": [
                ...
                "django.template.context_processors.request",
                ...
            ]
        }
    }
]

... তারপরে আপনার কাছে requestটেমপ্লেটগুলিতে অবজেক্টটি উপলব্ধ থাকবে এবং এতে Siteঅনুরোধের জন্য বর্তমানের একটি রেফারেন্স থাকবে request.site। তারপরে আপনি এর সাথে কোনও টেমপ্লেটে ডোমেনটি পুনরুদ্ধার করতে পারেন:

    {{request.site.domain}}

1

এই পদ্ধতির সম্পর্কে কী? আমার জন্য কাজ কর. এটি জাঙ্গো-নিবন্ধকরণেও ব্যবহৃত হয় ।

def get_request_root_url(self):
    scheme = 'https' if self.request.is_secure() else 'http'
    site = get_current_site(self.request)
    return '%s://%s' % (scheme, site)

তবে এটির সাথে চেষ্টা করলে localhostআপনি এমন একটি httpsস্কিম পাবেন (এটি সুরক্ষিত হিসাবে বিবেচিত) যা আপনার স্ট্যাটিক ইউআরএল পেয়ে থাকলে http://127.0.0.1তা কার্যকর হবে না (কেবলমাত্র বৈধ, নয় https://127.0.0.1)। সুতরাং এখনও উন্নয়নের সময় এটি আদর্শ নয়।
থিফি


-5

আপনি {{ protocol }}://{{ domain }}নিজের ডোমেনের নাম পেতে আপনার টেম্পলেটগুলিতে ব্যবহার করতে পারেন ।


আমি মনে করি না যে @ এরওয়ান লক্ষ্য করে যে এটি একটি মানক নয় এমন অনুরোধ প্রসঙ্গ প্রসেসরের উপর নির্ভর করে।
মনোক্রোম

আমি এই কাজটি করতে পারিনি, আপনি প্রোটোকল এবং ডোমেন কোথায় সংজ্ঞায়িত করবেন?
হোসে লুইস লা লা রোজা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.