সাইট মডিউল ব্যতীত আমিhttps://example.com/some/path জ্যাঙ্গোতে কীভাবে পূর্ণ / পরম URL (উদাহরণস্বরূপ ) পেতে পারি ? এটি কেবল নির্বোধ ... ইউআরএল ছিনিয়ে নেওয়ার জন্য আমার ডিবি-কে জিজ্ঞাসা করার দরকার নেই!
আমি এটি দিয়ে ব্যবহার করতে চাই reverse()।
সাইট মডিউল ব্যতীত আমিhttps://example.com/some/path জ্যাঙ্গোতে কীভাবে পূর্ণ / পরম URL (উদাহরণস্বরূপ ) পেতে পারি ? এটি কেবল নির্বোধ ... ইউআরএল ছিনিয়ে নেওয়ার জন্য আমার ডিবি-কে জিজ্ঞাসা করার দরকার নেই!
আমি এটি দিয়ে ব্যবহার করতে চাই reverse()।
উত্তর:
কুশলী ব্যবহার করুন request.build_absolute_uri () অনুরোধে পদ্ধতি, এটা আপেক্ষিক URL পাস করে যেতে এবং আপনি সম্পূর্ণ এক দেব।
ডিফল্টরূপে, এর জন্য নিখুঁত URL request.get_full_path()ফিরিয়ে দেওয়া হয়, তবে আপনি এটিকে পরম URL এ রূপান্তর করার জন্য প্রথম যুক্তি হিসাবে এটি কোনও আপেক্ষিক URL টি পাস করতে পারেন।
{{ request.build_absolute_uri }}{{ object.get_absolute_url }}- এবং হেইহো, সম্পূর্ণ ইউআরএল।
{% if request.is_secure %}https://{% else %}http://{% endif %}{{ request.get_host }}{{ object.get_absolute_url }}কারণ {{ request.build_absolute_uri }}একটি পিছনে স্ল্যাশ ছিল এবং {{ object.get_absolute_url }}URL এ ডাবল স্ল্যাশের ফলে স্ল্যাশ দিয়ে শুরু হয়েছিল।
আপনি যদি এটির সাথে এটি ব্যবহার করতে চান তবে আপনি এটি reverse()করতে পারেন:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))
url_nameপরিবর্তে বোঝাতে চেয়েছিলেন view_name)
def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
আপনি get_current_siteসাইট অ্যাপের অংশ হিসাবেও ব্যবহার করতে পারেন ( from django.contrib.sites.models import get_current_site)। এটি একটি অনুরোধের অবজেক্ট নেয় এবং আপনার সাথে কনফিগার করা সাইট অবজেক্টের ডিফল্ট হয়SITE_ID settings.py যদি অনুরোধ None। সাইটের ফ্রেমওয়ার্ক ব্যবহারের জন্য ডকুমেন্টেশনে আরও পড়ুন
যেমন
from django.contrib.sites.shortcuts import get_current_site
request = None
full_url = ''.join(['http://', get_current_site(request).domain, obj.get_absolute_url()])
এটি তেমন কমপ্যাক্ট / ঝরঝরে request.build_absolute_url()নয়, তবে যখন অনুরোধের জিনিসগুলি উপলভ্য থাকে না তখন এটি ব্যবহারযোগ্য এবং আপনার একটি ডিফল্ট সাইট ইউআরএল রয়েছে।
django.contrib.sitesআপনার INSTALLED_APPS, এটা সব সময়ে ডিবি আঘাত হবে না, এবং অনুরোধ বস্তুর উপর ভিত্তি করে তথ্য প্রদান (দেখুন get_current_site )
build_absolute_uriতবুও সহজ এবং ক্লিনার সমাধানের মতো দেখায়।
আপনি যদি অ্যাক্সেস পেতে না পারেন requestতবে আপনি get_current_site(request)এখানে কয়েকটি সমাধানে প্রস্তাবিত হিসাবে ব্যবহার করতে পারবেন না । আপনি নেটিভ সাইট ফ্রেমওয়ার্কের সংমিশ্রণটি ব্যবহার করতে পারেন এবং get_absolute_urlতার পরিবর্তে। প্রশাসনে কমপক্ষে একটি সাইট সেট আপ করুন , আপনার মডেলটির get_absolve_url () পদ্ধতি রয়েছে তা নিশ্চিত করুন , তারপরে:
>>> from django.contrib.sites.models import Site
>>> domain = Site.objects.get_current().domain
>>> obj = MyModel.objects.get(id=3)
>>> path = obj.get_absolute_url()
>>> url = 'http://{domain}{path}'.format(domain=domain, path=path)
>>> print(url)
'http://example.com/mymodel/objects/3/'
https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
requestকরতে Noneবা কল করতে পারেন get_current_site(None)।
আপনি যদি ডাটাবেসটিকে আঘাত করতে না চান তবে আপনি সেটিংস দিয়ে এটি করতে পারেন। তারপরে, প্রতিটি টেমপ্লেটে এটি যুক্ত করতে একটি প্রসঙ্গ প্রসেসর ব্যবহার করুন:
# settings.py (Django < 1.9)
...
BASE_URL = 'http://example.com'
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.extra_context',
)
# settings.py (Django >= 1.9)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
# Additional
'myapp.context_processors.extra_context',
],
},
},
]
# myapp/context_processors.py
from django.conf import settings
def extra_context(request):
return {'base_url': settings.BASE_URL}
# my_template.html
<p>Base url is {{ base_url }}.</p>
django-fullurlআপনি যদি একটি জ্যাঙ্গো টেমপ্লেটে এই কাজ করার চেষ্টা করছেন তবে, আমি একটি ছোট PyPI প্যাকেজ মুক্তি থাকেন django-fullurlতোমাদের স্থলাভিষিক্ত যাক urlএবং staticসঙ্গে টেমপ্লেট ট্যাগ fullurlএবং fullstatic, এভাবে:
{% load fullurl %}
Absolute URL is: {% fullurl "foo:bar" %}
Another absolute URL is: {% fullstatic "kitten.jpg" %}
এই ব্যাজগুলি আশা করা যায় যে স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে আপ টু ডেট থাকবে:
একটি দর্শন হিসাবে, আপনি অবশ্যই request.build_absolute_uriপরিবর্তে ব্যবহার করতে পারেন ।
requestডোমেন নামটি পাওয়ার কোনও আপত্তি নেই । সেক্ষেত্রে আপনার sitesপরিবর্তে ফ্রেমওয়ার্কটি ব্যবহার করা উচিত , যা ডাটাবেস থেকে ডোমেন নাম পায়। দেখুন django-absoluteuri, এই পিপিআই প্যাকেজের README এর "আরও দেখুন" বিভাগে উল্লিখিত।
কোনও টেমপ্লেট থেকে অন্য পৃষ্ঠায় একটি সম্পূর্ণ লিঙ্ক তৈরি করতে, আপনি এটি ব্যবহার করতে পারেন:
{{ request.META.HTTP_HOST }}{% url 'views.my_view' my_arg %}
অনুরোধ.মেটা.এইচটিটিপি_হোস্ট হোস্টের নাম দেয় এবং ইউআরএল আপেক্ষিক নাম দেয়। টেমপ্লেট ইঞ্জিন তারপরে একটি সম্পূর্ণ url এ সম্মিলিত করে।
httpএই প্রসঙ্গে) এবং ://URL এর কিছু অনুপস্থিত রয়েছে , সুতরাং এটি সম্পূর্ণ url সরবরাহ করবে না ।
তবুও অন্য উপায়। আপনি নিজেরটি ব্যবহার build_absolute_uri()করতে view.pyএবং এটি টেমপ্লেটে পাস করতে পারেন।
view.py
def index(request):
baseurl = request.build_absolute_uri()
return render_to_response('your-template.html', { 'baseurl': baseurl })
আপনার-template.html
{{ baseurl }}
HttpRequest.build_absolute_uri(request)সমান request.build_absolute_uri()তাই না?
Request.METAযে অভিধানটি আসে তা পরীক্ষা করে দেখুন I আমার মনে হয় এটিতে সার্ভারের নাম এবং সার্ভার পোর্ট রয়েছে।
এটি আমার টেমপ্লেটে আমার জন্য কাজ করেছে:
{{ request.scheme }}:{{ request.META.HTTP_HOST }}{% url 'equipos:marca_filter' %}
এটি একটি জেএস আনার ফাংশনে পাস করার জন্য আমার পুরো url দরকার। আমি আশা করি এটি আপনাকে সাহায্য করবে
আমি জানি এটি একটি পুরানো প্রশ্ন। তবে আমি মনে করি লোকেরা এখনও এটিকে অনেক কিছু করে।
সেখানে বেশ কয়েকটি গ্রন্থাগার রয়েছে যা ডিফল্ট জাজানো কার্যকারিতা পরিপূরক করে। আমি কয়েক চেষ্টা করেছি। বিপরীত রেফারেন্সিং পরম ইউআরএলগুলি যখন আমি নিম্নলিখিত লাইব্রেরি পছন্দ করি:
https://github.com/fusionbox/django-absoluteuri
আমি পছন্দ করি অন্যটি কারণ আপনি সহজেই একটি ডোমেন, প্রোটোকল এবং পথ একসাথে রাখতে পারেন:
https://github.com/RRMoelker/django-full-url
এই গ্রন্থাগারটি আপনাকে নিজের টেম্পলেটটিতে যা চান তা কেবল লিখতে দেয়, যেমন:
{{url_parts.domain}}
আপনি যদি জ্যাঙ্গো আরএসটি ফ্রেমওয়ার্ক ব্যবহার করছেন তবে আপনি এ থেকে বিপরীত ফাংশনটি ব্যবহার করতে পারেন rest_framework.reverse। django.core.urlresolvers.reverseসম্পূর্ণ ইউআরএল তৈরি করতে এটি অনুরোধ প্যারামিটার ব্যবহার করে, এর মতো একই আচরণ করে ।
from rest_framework.reverse import reverse
# returns the full url
url = reverse('view_name', args=(obj.pk,), request=request)
# returns only the relative url
url = reverse('view_name', args=(obj.pk,))
কেবলমাত্র REST ফ্রেমওয়ার্কে প্রাপ্যতা উল্লেখ করার জন্য সম্পাদিত
request=request। অনুরোধটি এখানে ডকুমেন্ট হিসাবে আছে বলে মনে হয় না ডকস.ড্যাঞ্জোপ্রজেক্ট /en/1.9/ref/urlresolvers/#reverse
আমি বুঝতে পেরেছি:
wsgiref.util.request_uri(request.META)
স্কিমা, হোস্ট, পোর্ট পাথ এবং ক্যোয়ারির সাথে পূর্ণ uri পান।
এছাড়াও একটি সেটিং হিসাবে উপলব্ধ ABSOLUTE_URL_OVERRIDES
https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides
তবে সেই get_absolve_url () কে ওভাররাইড করে, যা পছন্দসই নয়।
অনুরোধের বস্তুর উপর নির্ভর করে কেবল এখানে এর জন্য সাইটের ফ্রেমওয়ার্কটি ইনস্টল করা বা এখানে উল্লিখিত অন্যান্য কিছু জিনিস করার পরিবর্তে, আমি মডেল.পি-তে এটি রাখাই সবচেয়ে ভাল সমাধান বলে মনে করি py
সেটিংস.পি-তে BASE_URL সংজ্ঞায়িত করুন, তারপরে এটি মডেলগুলিতে আমদানি করুন এবং একটি বিমূর্ত শ্রেণি তৈরি করুন (বা এটি ইতিমধ্যে আপনি ব্যবহার করছেন এমন একটিতে যুক্ত করুন) যা get_t بيشڪ_absolve_url () সংজ্ঞায়িত করে। এটি এতটা সহজ হতে পারে:
def get_truly_absolute_url(self):
return BASE_URL + self.get_absolute_url()
এটি সাবক্লাস করুন এবং এখন আপনি এটি যে কোনও জায়গায় ব্যবহার করতে পারেন।
অন্যান্য উত্তরে উল্লিখিত হিসাবে, request.build_absolute_uri()যদি আপনার অ্যাক্সেস থাকে তবে তা নিখুঁত requestandsites যতক্ষণ না বিভিন্ন ইউআরএল বিভিন্ন ডাটাবেসগুলিতে নির্দেশ করে ততক্ষণ ফ্রেমওয়ার্ক দুর্দান্ত।
তবে আমার ব্যবহারের বিষয়টি কিছুটা আলাদা ছিল। আমার স্টেজিং সার্ভার এবং প্রোডাকশন সার্ভার একই ডেটাবেস অ্যাক্সেস করে তবে get_current_siteউভয়ই siteডাটাবেসে প্রথম ফিরে আসে । এটি সমাধান করার জন্য, আপনাকে কিছু ধরণের পরিবেশ পরিবর্তনশীল ব্যবহার করতে হবে। আপনি হয় 1) এনভায়রনমেন্ট ভেরিয়েবল (যেমন কিছু os.environ.get('SITE_URL', 'localhost:8000')) বা 2) SITE_IDবিভিন্ন সার্ভার এবং বিভিন্ন সেটিংসের জন্য পৃথক s.py ব্যবহার করতে পারেন ।
আশা করি কেউ এই দরকারী খুঁজে পাবেন!
আমি এই থ্রেডটি পেরিয়ে এসেছি কারণ আমি একটি সাফল্যের পৃষ্ঠার জন্য নিখুঁত ইউআরআই তৈরি করতে চাইছিলাম। request.build_absolute_uri()আমার বর্তমান দর্শনের জন্য আমাকে একটি ইউআরআই দিয়েছে তবে আমার সাফল্যের দৃশ্যের জন্য ইউআরআই পেতে আমি নিম্নলিখিতটি ব্যবহার করেছি ...
request.build_absolute_uri (রিভার্স ( 'success_view_name'))
আপনি এটি ব্যবহার করতে পারেন:
import socket
socket.gethostname()
এটি আমার পক্ষে ভাল কাজ করছে,
এটি কীভাবে কাজ করে তা আমি পুরোপুরি নিশ্চিত নই। আমি বিশ্বাস করি এটি কিছুটা নিচু স্তর এবং এটি আপনার সার্ভারের হোস্টনামটি ফিরিয়ে দেবে যা আপনার পৃষ্ঠায় পৌঁছানোর জন্য আপনার ব্যবহারকারীর দ্বারা ব্যবহৃত হোস্টনামের চেয়ে আলাদা হতে পারে।