জাজানোতে আমি কীভাবে পূর্ণ / পরম URL (ডোমেন সহ) পেতে পারি?


379

সাইট মডিউল ব্যতীত আমিhttps://example.com/some/path জ্যাঙ্গোতে কীভাবে পূর্ণ / পরম URL (উদাহরণস্বরূপ ) পেতে পারি ? এটি কেবল নির্বোধ ... ইউআরএল ছিনিয়ে নেওয়ার জন্য আমার ডিবি-কে জিজ্ঞাসা করার দরকার নেই!

আমি এটি দিয়ে ব্যবহার করতে চাই reverse()


11
ঠিক একদিকে যেমন: সাইটের মডিউলটি প্রথমে সাইটের নামটির প্রয়োজন পরে ডিবিটিকে হিট করে, ফলাফলটি মডিউল পরিবর্তনশীল (SITE_CACHE) এ ক্যাশে হয় যা মডিউলটির পুনরায় সংকলন বা সাইটম্যানেজার.ক্রিয়ার_ক্যাচ () অবধি স্থির থাকবে) পদ্ধতি বলা হয়। দেখুন: কোড. djangoproject.com/svn/django/tags/relayss/1.3/django/…
কর্নেল

উত্তর:


512

কুশলী ব্যবহার করুন request.build_absolute_uri () অনুরোধে পদ্ধতি, এটা আপেক্ষিক URL পাস করে যেতে এবং আপনি সম্পূর্ণ এক দেব।

ডিফল্টরূপে, এর জন্য নিখুঁত URL request.get_full_path()ফিরিয়ে দেওয়া হয়, তবে আপনি এটিকে পরম URL এ রূপান্তর করার জন্য প্রথম যুক্তি হিসাবে এটি কোনও আপেক্ষিক URL টি পাস করতে পারেন।


3
ইউআরএল সম্পর্কে কী ? লোকালহোস্ট / হোম / # / পরীক্ষা ? আমি কেবল লোকালহোস্ট / হোম দেখতে পাচ্ছি । আমি ধারালো পরে অংশ দেখতে পারেন ?
sergzach

41
# এর পরে সমস্ত কিছু সার্ভারে দেওয়া হয় নি, এটি ব্রাউজারের কেবল বৈশিষ্ট্য
দিমিত্রি শেভচেঙ্কো

69
কোনও টেমপ্লেটে (যেখানে আপনি প্যারামিটার দিতে পারবেন না) আপনি কেবল এটি করতে পারেন: {{ request.build_absolute_uri }}{{ object.get_absolute_url }}- এবং হেইহো, সম্পূর্ণ ইউআরএল।
ওডিনহো - ভেলমন্ট

17
এবং যদি আমার কাছে অনুরোধের অ্যাক্সেস না থাকে? জ্যাঙ্গো-রেস্ট-ফ্রেমওয়ার্কের সিরিয়ালাইজারদের মতো?
মাইন্ডার

15
আমাকে ব্যবহার করতে হয়েছিল {% if request.is_secure %}https://{% else %}http://{% endif %}{{ request.get_host }}{{ object.get_absolute_url }}কারণ {{ request.build_absolute_uri }}একটি পিছনে স্ল্যাশ ছিল এবং {{ object.get_absolute_url }}URL এ ডাবল স্ল্যাশের ফলে স্ল্যাশ দিয়ে শুরু হয়েছিল।
অক্টোবরানোফিলিস্ট

96

আপনি যদি এটির সাথে এটি ব্যবহার করতে চান তবে আপনি এটি reverse()করতে পারেন:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))


3
সহায়ক উত্তরের জন্য ধন্যবাদ। কোডের চেয়ে ভাল আর কিছু নয়। (এছাড়াও, আপনি সম্ভবত এর url_nameপরিবর্তে বোঝাতে চেয়েছিলেন view_name)
অনুপম

3
@ অনুপম বিপরীত () হিসাবে সংজ্ঞায়িত করা হয়েছে:def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
মাটিয়াস এলগার্ট

57

আপনি 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()নয়, তবে যখন অনুরোধের জিনিসগুলি উপলভ্য থাকে না তখন এটি ব্যবহারযোগ্য এবং আপনার একটি ডিফল্ট সাইট ইউআরএল রয়েছে।


4
আমি বিশ্বাস করি যে আমার প্রশ্নটি বিশেষত "সাইট মডিউল ব্যতীত" বলেছিল। এটি কি ডিবিতে আঘাত করে?
এমপিএন

1
সাইট মডিউলটি মডিউল স্তরের ক্যাচিং (যেমন আপনার ক্যাশে কাঠামোর প্রয়োজন হয় না) ব্যবহার করে সাইট অবজেক্টগুলিকে ক্যাশে লিখিত হয়েছে, সুতরাং কোনও ওয়েব প্রক্রিয়া দ্বারা কোনও সাইট পুনরুদ্ধার করার পরে ডিবি কেবলমাত্র আঘাত পেতে পারে। আপনি না থাকে তাহলে django.contrib.sitesআপনার INSTALLED_APPS, এটা সব সময়ে ডিবি আঘাত হবে না, এবং অনুরোধ বস্তুর উপর ভিত্তি করে তথ্য প্রদান (দেখুন get_current_site )
Darb

1
ঠিক আছে তবে আপনার কাছে একটি +1 থাকতে পারে তবে build_absolute_uriতবুও সহজ এবং ক্লিনার সমাধানের মতো দেখায়।
এমপেন

1
আপনি যদি ইমেলগুলি প্রেরণের জন্য সিগন্যালে URL গুলি তৈরি করার চেষ্টা করছেন তবে এটি একটি সঠিক উত্তর।
ক্রিস

2
আপনি যদি https ব্যবহার করেন তবে কাজ করে না। হ্যাঁ, আপনি গুলি যোগ করতে পারেন, তবে আপনি কি স্থানীয়ভাবে https এর সাথে বিকাশ করতে পারেন? এবং আপনি কি সর্বদা জানেন, যদি আপনার https থাকে তবে কখনও কখনও না ...?
tjati

55

আপনি যদি অ্যাক্সেস পেতে না পারেন 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


7
আপনি যখন HTTPRequest অবজেক্টে অ্যাক্সেস না পান তখন এটি সত্যিই সহজ। যেমন কার্যাদি, সিগন্যাল ইত্যাদিতে
আরশাম

6
এটি ব্যবহারের আগে আপনার সাইটের ফ্রেমওয়ার্ক কাঠামো সক্ষম করা উচিত ডকসড.ড্যাঞ্জোপ্রজেক্ট
en/

উদাহরণ.কমকে কিছুতে পরিবর্তিত করার জন্য: সাইট.objects.all () [0] 'example.com' প্রদান করে এবং id = 1 রয়েছে, যা সেটিংস.পিটিতে উল্লেখ করেছে। কেবলমাত্র সাইট.ওবজ্যাকস.ক্রিয়েট করুন (নাম = 'উত্পাদন', ডোমেন = 'প্রোডসাইট.কম') এবং সেটিংস.পাইতে SITE_ID = 2 সেট করুন। এখন সাইট.ওবজেক্ট.জেট_কন্টেনার ()। ডোমেন 'প্রোডসাইট.কম' প্রদান করে।
gek

আপনি সেট requestকরতে Noneবা কল করতে পারেন get_current_site(None)
ববোর্ট

20

আপনি যদি ডাটাবেসটিকে আঘাত করতে না চান তবে আপনি সেটিংস দিয়ে এটি করতে পারেন। তারপরে, প্রতিটি টেমপ্লেটে এটি যুক্ত করতে একটি প্রসঙ্গ প্রসেসর ব্যবহার করুন:

# 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>

17

আপনার দৃষ্টিতে, কেবল এটি করুন:

base_url =  "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)

14

django-fullurl

আপনি যদি একটি জ্যাঙ্গো টেমপ্লেটে এই কাজ করার চেষ্টা করছেন তবে, আমি একটি ছোট PyPI প্যাকেজ মুক্তি থাকেন django-fullurlতোমাদের স্থলাভিষিক্ত যাক urlএবং staticসঙ্গে টেমপ্লেট ট্যাগ fullurlএবং fullstatic, এভাবে:

{% load fullurl %}

Absolute URL is: {% fullurl "foo:bar" %}

Another absolute URL is: {% fullstatic "kitten.jpg" %}

এই ব্যাজগুলি আশা করা যায় যে স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে আপ টু ডেট থাকবে:

PyPI ট্র্যাভিস সিআই

একটি দর্শন হিসাবে, আপনি অবশ্যই request.build_absolute_uriপরিবর্তে ব্যবহার করতে পারেন ।


লজ্জা এটি 2.0 সঙ্গে কাজ করে না। একটি পিআর আপ প্রয়োজন হতে পারে।
স্টিভেন চার্চ

@ স্টিভেনচর্চ এটি কাজ করা উচিত। আমি সমর্থিত হিসাবে জ্যাঙ্গো ২.০ চিহ্নিত করেছি না, তবে বিদ্যমান সংস্করণটি কাজ করা উচিত।
ফ্লিম করুন

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

@ স্টিভেনচর্চ আমি মনে করি ইমেলগুলি তৈরি করার সময় সমস্যাটি হ'ল requestডোমেন নামটি পাওয়ার কোনও আপত্তি নেই । সেক্ষেত্রে আপনার sitesপরিবর্তে ফ্রেমওয়ার্কটি ব্যবহার করা উচিত , যা ডাটাবেস থেকে ডোমেন নাম পায়। দেখুন django-absoluteuri, এই পিপিআই প্যাকেজের README এর "আরও দেখুন" বিভাগে উল্লিখিত।
14:38

8

কোনও টেমপ্লেট থেকে অন্য পৃষ্ঠায় একটি সম্পূর্ণ লিঙ্ক তৈরি করতে, আপনি এটি ব্যবহার করতে পারেন:

{{ request.META.HTTP_HOST }}{% url 'views.my_view' my_arg %}

অনুরোধ.মেটা.এইচটিটিপি_হোস্ট হোস্টের নাম দেয় এবং ইউআরএল আপেক্ষিক নাম দেয়। টেমপ্লেট ইঞ্জিন তারপরে একটি সম্পূর্ণ url এ সম্মিলিত করে।


2
উত্তরটিতে প্রোটোকল ( httpএই প্রসঙ্গে) এবং ://URL এর কিছু অনুপস্থিত রয়েছে , সুতরাং এটি সম্পূর্ণ url সরবরাহ করবে না ।
ব্যবহারকারী272735

2
অনুরোধ অবজেক্টটির এতে একটি হোস্ট রয়েছে। সরাসরি মেটা পরীক্ষা করবেন না: docs.djangoproject.com/en/1.8/ref/request-response/…
কিট সুন্দে

8

তবুও অন্য উপায়। আপনি নিজেরটি ব্যবহার 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()তাই না?
এমপেন 16'15

7

Request.METAযে অভিধানটি আসে তা পরীক্ষা করে দেখুন I আমার মনে হয় এটিতে সার্ভারের নাম এবং সার্ভার পোর্ট রয়েছে।


2
অনুরোধটি ব্যবহার করুন ETমেটা ['HTTP_HOST']
অ্যান্টনি

4
অনুরোধ অবজেক্টটির এতে একটি হোস্ট রয়েছে। সরাসরি মেটা পরীক্ষা করবেন না: docs.djangoproject.com/en/1.8/ref/request-response/…
কিট সুন্দে

7

নিম্নলিখিত কোড ব্যবহার করে দেখুন:

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

এটি কেবল পথ এবং কোয়েরি স্ট্রিং ছাড়াই ডোমেনটি দেবে, না?
এমপেন

6

এটি আমার টেমপ্লেটে আমার জন্য কাজ করেছে:

{{ request.scheme }}:{{ request.META.HTTP_HOST }}{% url  'equipos:marca_filter' %}

এটি একটি জেএস আনার ফাংশনে পাস করার জন্য আমার পুরো url দরকার। আমি আশা করি এটি আপনাকে সাহায্য করবে


5

আমি জানি এটি একটি পুরানো প্রশ্ন। তবে আমি মনে করি লোকেরা এখনও এটিকে অনেক কিছু করে।

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

https://github.com/fusionbox/django-absoluteuri

আমি পছন্দ করি অন্যটি কারণ আপনি সহজেই একটি ডোমেন, প্রোটোকল এবং পথ একসাথে রাখতে পারেন:

https://github.com/RRMoelker/django-full-url

এই গ্রন্থাগারটি আপনাকে নিজের টেম্পলেটটিতে যা চান তা কেবল লিখতে দেয়, যেমন:

{{url_parts.domain}}

4

আপনি যদি জ্যাঙ্গো আরএসটি ফ্রেমওয়ার্ক ব্যবহার করছেন তবে আপনি এ থেকে বিপরীত ফাংশনটি ব্যবহার করতে পারেন rest_framework.reversedjango.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
রায়ান আমোস

আমি উল্লেখ করতে ভুলে গেছি আপনি কেবল বিশ্রাম কাঠামো ব্যবহার করছেন তবেই এটি উপলব্ধ। ভাল ধরা, আমি আমার উত্তর আপডেট করেছি।
জনজি

হ্যাঁ আপনাকে ধন্যবাদ
জ্যাঙ্গো আরআরএস


0

এছাড়াও একটি সেটিং হিসাবে উপলব্ধ 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()

এটি সাবক্লাস করুন এবং এখন আপনি এটি যে কোনও জায়গায় ব্যবহার করতে পারেন।


0

অন্যান্য উত্তরে উল্লিখিত হিসাবে, request.build_absolute_uri()যদি আপনার অ্যাক্সেস থাকে তবে তা নিখুঁত requestandsites যতক্ষণ না বিভিন্ন ইউআরএল বিভিন্ন ডাটাবেসগুলিতে নির্দেশ করে ততক্ষণ ফ্রেমওয়ার্ক দুর্দান্ত।

তবে আমার ব্যবহারের বিষয়টি কিছুটা আলাদা ছিল। আমার স্টেজিং সার্ভার এবং প্রোডাকশন সার্ভার একই ডেটাবেস অ্যাক্সেস করে তবে get_current_siteউভয়ই siteডাটাবেসে প্রথম ফিরে আসে । এটি সমাধান করার জন্য, আপনাকে কিছু ধরণের পরিবেশ পরিবর্তনশীল ব্যবহার করতে হবে। আপনি হয় 1) এনভায়রনমেন্ট ভেরিয়েবল (যেমন কিছু os.environ.get('SITE_URL', 'localhost:8000')) বা 2) SITE_IDবিভিন্ন সার্ভার এবং বিভিন্ন সেটিংসের জন্য পৃথক s.py ব্যবহার করতে পারেন ।

আশা করি কেউ এই দরকারী খুঁজে পাবেন!


0

আমি এই থ্রেডটি পেরিয়ে এসেছি কারণ আমি একটি সাফল্যের পৃষ্ঠার জন্য নিখুঁত ইউআরআই তৈরি করতে চাইছিলাম। request.build_absolute_uri()আমার বর্তমান দর্শনের জন্য আমাকে একটি ইউআরআই দিয়েছে তবে আমার সাফল্যের দৃশ্যের জন্য ইউআরআই পেতে আমি নিম্নলিখিতটি ব্যবহার করেছি ...

request.build_absolute_uri (রিভার্স ( 'success_view_name'))



-5

আপনি এটি ব্যবহার করতে পারেন:

import socket
socket.gethostname()

এটি আমার পক্ষে ভাল কাজ করছে,

এটি কীভাবে কাজ করে তা আমি পুরোপুরি নিশ্চিত নই। আমি বিশ্বাস করি এটি কিছুটা নিচু স্তর এবং এটি আপনার সার্ভারের হোস্টনামটি ফিরিয়ে দেবে যা আপনার পৃষ্ঠায় পৌঁছানোর জন্য আপনার ব্যবহারকারীর দ্বারা ব্যবহৃত হোস্টনামের চেয়ে আলাদা হতে পারে।


হ্যাঁ ... আপনি সমস্যাটি নির্দেশ করেছেন। হোস্ট-নেম ডোমেন নামের মত একই নয়।
এমপেন

এটি একটি খুব আলাদা সমস্যা সমাধান করে। একাধিক ওয়েবসাইটের সাথে ভাগ করা হোস্টিং সার্ভারটি বিবেচনা করুন - উপরের কোডটি ব্যবহার করে, URL তৈরির সমস্ত সাইটগুলিতে হোস্ট মেশিনের দিকে ইঙ্গিত করে এমন সমস্ত URL থাকবে, যা সম্ভবত চলমান কোনও ওয়েবসাইট নয় websites
tbm

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