জ্যাঙ্গো টেম্পলেট থেকে আমি কীভাবে আমার বর্তমান সাইটের ডোমেন নাম পাব? আমি ট্যাগ এবং ফিল্টারগুলি দেখার চেষ্টা করেছি কিন্তু সেখানে কিছুই নেই।
জ্যাঙ্গো টেম্পলেট থেকে আমি কীভাবে আমার বর্তমান সাইটের ডোমেন নাম পাব? আমি ট্যাগ এবং ফিল্টারগুলি দেখার চেষ্টা করেছি কিন্তু সেখানে কিছুই নেই।
উত্তর:
আমি মনে করি আপনি যা চান তা হ'ল অনুরোধ প্রসঙ্গে অ্যাক্সেস পাওয়া উচিত, অনুরোধকন্টেক্সট দেখুন।
Host:
কোনও পৃষ্ঠার কোথাও ছদ্মবেশী ডোমেনের সাথে শিরোনামটি স্পুফ করে এবং প্রতিক্রিয়া ফিরে পায় তবে কীভাবে এটি একটি সুরক্ষা গর্ত তৈরি করবে? আমি দেখতে পাচ্ছি না যে এটি কোনও ব্যবহারকারীর দ্বারা উত্পাদিত এইচটিএমএল গ্রহণ এবং নিজের ব্রাউজারে খাওয়ানোর আগে নিজেকে সংশোধন করা থেকে আলাদা।
আপনি যদি সত্যিকারের এইচটিটিপি হোস্ট শিরোনাম চান তবে @ ফিসিয়াওর উত্তরে ড্যানিয়েল রোজম্যানের মন্তব্য দেখুন। অন্য বিকল্পটি হ'ল যদি আপনি অবদানের সাইটগুলি কাঠামো ব্যবহার করছেন , আপনি ডাটাবেসের কোনও সাইটের জন্য একটি কমনীয় ডোমেন নাম সেট করতে পারেন (অনুরোধ ডোমেনটিকে একটি সেটিংস ফাইলে ম্যাপিং করে যথাযথ এসআইটিআইআইডি সহ কিছু করতে হবে যা আপনাকে নিজের মাধ্যমে করতে হবে ওয়েবসার্ভার সেটআপ)। সেক্ষেত্রে আপনি খুঁজছেন:
from django.contrib.sites.models import Site
current_site = Site.objects.get_current()
current_site.domain
আপনি যদি বর্তমান_সাইট অবজেক্টটি টেমপ্লেট প্রসঙ্গে নিজেকে ব্যবহার করতে চান তবে এটি ব্যবহার করতে হবে। আপনি যদি এটি পুরো জায়গা জুড়ে ব্যবহার করেন তবে আপনি এটি কোনও টেম্পলেট প্রসঙ্গ প্রসেসরে প্যাকেজ করতে পারেন।
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
আমি {{ request.get_host }}
পদ্ধতিটি আবিষ্কার করেছি ।
HTTP_X_FORWARDED_HOST
HTTP শিরোনামের অ্যাকাউন্টে লাগে এইচটিটিপি প্রক্সি বা লোড ব্যালান্সারের মাধ্যমে হোস্টটি পৌঁছে যায় ।
request.build_absolute_uri
( docs.djangoproject.com/en/dev/ref/request-response/... )
কার্ল মেয়ের পরিপূরক, আপনি এটির মতো একটি প্রসঙ্গ প্রসেসর তৈরি করতে পারেন:
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.
TEMPLATE_CONTEXT_PROCESSORS = (
...
"module.context_processors.site",
....
)
প্রসঙ্গত প্রসেসরে সাবডোমেনগুলি বা এসএসএল হ্যান্ডেল করতে চাইলে আপনি নিজের রটিন লিখতে পারেন।
আমি ব্যবহার করি প্রসঙ্গ প্রসেসরের বিভিন্নতা:
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()
এবং সুতরাং একটি এসকিউএল কোয়েরি চালাবে। মোড়ক নিশ্চিত করে যে পরিবর্তনশীলটি কেবলমাত্র টেমপ্লেটে ব্যবহৃত হলেই এটির মূল্যায়ন হয়।
SimpleLazyObject
ফাংশন, যা সত্যিই প্রয়োজন হয় না, যেহেতু এর reevaluation এড়াতে আছে Site
বস্তুর সংরক্ষিত করা হয়েছে।
from django.contrib.sites.shortcuts import get_current_site
আমি জানি এই প্রশ্নটি পুরানো, তবে আমি বর্তমান ডোমেনটি পাওয়ার জন্য অজগরিক উপায়ের সন্ধানে এটিকে হোঁচট খেয়েছি।
def myview(request):
domain = request.build_absolute_uri('/')[:-1]
# that will build the complete domain: http://foobar.com
build_absolute_uri
এখানে নথিভুক্ত করা হয় ।
দ্রুত এবং সহজ, তবে উত্পাদনের জন্য ভাল নয়:
(একটি দৃষ্টিতে)
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 এ যুক্ত হয়েছিল।
{{ 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 %}
আমি একটি কাস্টম টেম্পলেট ট্যাগ ব্যবহার করি। যেমন যোগ করুন <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 %}
get_current
: একটি নথিভুক্ত পদ্ধতি docs.djangoproject.com/en/dev/ref/contrib/sites/...
'http://%s'
https
সংযোগের ক্ষেত্রে সমস্যা হতে পারে ; এক্ষেত্রে স্কিমটি গতিশীল নয়।
পঞ্চিচরের ব্যবহারকারীর জবাবের মতো, আমি খুব সাধারণ ওয়েবসাইটে এটি করেছি। এটি কয়েকটি ভেরিয়েবল সরবরাহ করে এবং সেগুলি টেমপ্লেটে উপলব্ধ করে।
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 }}
জাজানো টেমপ্লেটে আপনি এটি করতে পারেন:
<a href="{{ request.scheme }}://{{ request.META.HTTP_HOST }}{{ request.path }}?{{ request.GET.urlencode }}" >link</a>
django.template.context_processors.request
এছাড়াও [এটি কীভাবে সাহায্য করতে হবে] ( সিম্পিসবেটের্থানকম্প্লেক্স.com
আপনি যদি "অনুরোধ" প্রসঙ্গ প্রসেসরটি ব্যবহার করেন এবং জ্যাঙ্গো সাইটগুলি কাঠামো ব্যবহার করছেন এবং সাইট মিডলওয়্যার ইনস্টল করেছেন (যেমন আপনার সেটিংস এগুলিকে অন্তর্ভুক্ত করে):
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}}
এই পদ্ধতির সম্পর্কে কী? আমার জন্য কাজ কর. এটি জাঙ্গো-নিবন্ধকরণেও ব্যবহৃত হয় ।
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
)। সুতরাং এখনও উন্নয়নের সময় এটি আদর্শ নয়।
from django.contrib.sites.models import Site
if Site._meta.installed:
site = Site.objects.get_current()
else:
site = RequestSite(request)
আপনি {{ protocol }}://{{ domain }}
নিজের ডোমেনের নাম পেতে আপনার টেম্পলেটগুলিতে ব্যবহার করতে পারেন ।
request.META['HTTP_HOST']
আপনাকে ডোমেন দেয়। এটি একটি টেমপ্লেটে হবে{{ request.META.HTTP_HOST }}
।