পিছনে স্ল্যাশ ছাড়াই জ্যাঙ্গো ইউআরএলগুলি পুনঃনির্দেশিত হয় না


89

আমি দুটি পৃথক কম্পিউটারে দুটি অ্যাপ্লিকেশন পেয়েছি। কম্পিউটার এ তে, urls.pyফাইলে আমার নীচের মত একটি লাইন রয়েছে:

(r'^cast/$', 'mySite.simulate.views.cast')

এবং এই url উভয়ের জন্য কাজ করবে mySite.com/cast/এবং mySite.com/cast। কিন্তু কম্পিউটারে বিআইয়ের মতো লিখিত একটি অনুরূপ url রয়েছে:

(r'^login/$', 'mySite.myUser.views.login')

কম্পিউটার বি তে কিছু কারণে url mySite.com/login/ চলবে তবে mySite.com/loginস্তব্ধ হয়ে যাবে এবং mySite.com/login/কম্পিউটারে এটি পছন্দ করতে ফিরে আসবে না I এমন কিছু আছে যা আমি মিস করেছি? উভয় url.pyফাইলই আমার কাছে অভিন্ন দেখাচ্ছে।

উত্তর:


104

আপনার APPEND_SLASHসেটিংটি সেটিংস.পাই ফাইলটিতে পরীক্ষা করে দেখুন

জাঙ্গো ডক্সে আরও তথ্য


4
"সত্য হিসাবে সেট করা থাকলে, যদি অনুরোধ ইউআরএলটি ইউআরএলকনফের কোনও ধরণের সাথে মেলে না এবং এটি স্ল্যাশের মধ্যে শেষ না হয় তবে একটি এইচটিটিপি পুনঃনির্দেশ একই স্ল্যাশ সংযুক্ত যুক্ত জারি করা হবে Note দ্রষ্টব্য যে পুনর্নির্দেশের কারণ হতে পারে কোনও পোস্টে জমা দেওয়া কোনও ডেটা হারিয়ে যাওয়ার অনুরোধ। "অ্যাপ্লিকেশন END_SLASH সেটিংটি কেবল তখনই ব্যবহৃত হয় যদি কমনমিলডওয়ার ইনস্টল থাকে ..."। আমি একটি পরিষ্কার সমাধানের জন্য মাইকেল জেন্ডিনের উত্তরটিকে পছন্দ করি।
ওয়াটওয়ার

4
আপনি যদি আপনার urlpatterns এর শেষ প্রবেশের সময় অতিরিক্ত "সমস্ত ক্যাচ" url ব্যবহার করেন তবে এটি কাজ করে না। @ স্পিডপ্লেনের উত্তরগুলি সেই পরিস্থিতিতেও কাজ করবে। তবে অবশ্যই এটি সহজ এবং এটি যদি "সমস্ত ক্যাচ" urlpattern এন্ট্রি না থাকে তবে এটি ব্যবহার করা উচিত।
এনপি 8

195

অথবা আপনি আপনার ইউআরএল লিখতে পারেন:

(r'^login/?$', 'mySite.myUser.views.login')

পিছনের স্ল্যাশের পরে প্রশ্ন চিহ্নটি এটিকে রেজিপেক্সে alচ্ছিক করে তোলে। যদি কোনও কারণে আপনি APPEND_SLASH সেটিংস ব্যবহার করতে না চান তবে এটি ব্যবহার করুন।


12
আমাকে নিষ্পাপ বলুন - তবে কেন এই উত্তরটি মিলিয়ন উপার্জন এবং জ্যাঙ্গো ফ্যাক্সে প্রবেশ করল না?
ফারগাল মুরান

42
অত্যন্ত নিশ্চিত যে আপনি এসইও কারণে এটি করতে চান না - দুটি বৈধ ইউআরএল থাকার চেয়ে ক্যানোনিকাল URL এ পুনঃনির্দেশ করা ভাল।
ব্রায়ান ফ্রান্টজ

47
যদি আপনি জ্যাঙ্গো ব্যবহার করে একটি রেস্টস্টুল এপিআই তৈরি করেন তবে বিকাশকারীরা সরাসরি ইউআরএল URL এ ডেটা পোস্ট করলে এটি ভাল সমাধান হতে পারে। ব্যবহার করার সময় APPEND_SLASH, যদি তারা দুর্ঘটনাক্রমে এটিকে স্ল্যাশ অনুসরণ না করে প্রেরণ করে এবং আপনার urlconf একটি পিছনের স্ল্যাশের সাথে হয় তবে তারা POST অনুরোধগুলি পুনর্নির্দেশের সময় ডেটা হারানোর ব্যতিক্রম পাবে।
অরপো

4
এই সমাধানটির সমস্যাটি হ'ল আপনি একই পৃষ্ঠায় 2 টি ইউআরএল (ট্রেলিং সহ এবং এর বাইরে /) পরিবেশন করছেন - opালু, ক্রলারের পক্ষে খারাপ, বজায় রাখা শক্ত, একটি নতুন সিস্টেমে মাইগ্রেট করা কঠিন (যেহেতু এটি উপেক্ষা করা এত সহজ)
জিয়াআরও

4
লিল অফ টপিক (জ্যাঙ্গো / পাইথন) তবে কয়েক বছরের এসইওর অভিজ্ঞতার সাথে আমি আপনাকে বলতে পারি যে আপনি যদি সার্চ ইঞ্জিনগুলির জন্য অপ্টিমাইজ করতে চান তবে আপনি একই URL এর 2 টি সংস্করণ চান না want সাইট / ইউজারস সাইটটি / ইউজার্সের থেকে আলাদা ইউআরএল / যা আপনি এসইও-র জন্য চান তা নয়। আপনার url এবং সামগ্রীর মাত্র 1 সংস্করণ প্রয়োজন! মাত্র 1 সংস্করণ চয়ন করুন এবং নিশ্চিত করুন যে আপনি অন্যটি সঠিকভাবে পুনঃনির্দেশ করেছেন।
দানি

19

এটি @ মিশেল জেন্ডিনের উত্তরে উন্নতি হয়েছে। তার উত্তর দুটি পৃথক ইউআরএল সহ অভিন্ন পৃষ্ঠাতে পরিবেশন করে। loginস্বয়ংক্রিয়ভাবে পুনঃনির্দেশ করা ভাল login/, এবং তারপরে পরবর্তী পৃষ্ঠাটিকে মূল পৃষ্ঠা হিসাবে পরিবেশন করা ভাল :

from django.conf.urls import patterns
from django.views.generic import RedirectView

urlpatterns = patterns('',
    # Redirect login to login/
    (r'^login$', RedirectView.as_view(url = '/login/')),
    # Handle the page with the slash.
    (r'^login/', "views.my_handler"),
)

আপনার শেষে যখন ক্যাচ-অল ইউআরএল থাকে তখন খুব দরকারী।
thclark

এটি কীভাবে রেজিক্স সহ কাজ করতে পারে? যদি মূল ইউআরএল একটি ক্লায়েন্টের নামের সাথে একটি রেজেক্সের সাথে মিলে যায়
নিকোলা গ্যাসপারিনি

@ নিকোলোগ্যাস্পারিনি - জাজানোর নতুন সংস্করণগুলিতে একটি pattern_nameযুক্তি রয়েছে যা redirectমিলিত সমস্ত url আরগগুলির সাথে ব্যবহৃত হয় ।
টিম টিসডাল


1

পুনঃনির্দেশ ছাড়াই স্ল্যাশ যুক্ত করুন , সেটিংসে কমনমিলডওয়ারের পরিবর্তে এটি ব্যবহার করুন, জাজানো ২.১:

MIDDLEWARE = [
    ...
    # 'django.middleware.common.CommonMiddleware',
    'htx.middleware.CommonMiddlewareAppendSlashWithoutRedirect',
    ...
]

আপনার মূল অ্যাপ্লিকেশন ডিরেক্টরিতে মিডওয়ারওয়্যার যুক্ত করুন :

from django.http import HttpResponsePermanentRedirect, HttpRequest
from django.core.handlers.base import BaseHandler
from django.middleware.common import CommonMiddleware
from django.conf import settings


class HttpSmartRedirectResponse(HttpResponsePermanentRedirect):
    pass


class CommonMiddlewareAppendSlashWithoutRedirect(CommonMiddleware):
    """ This class converts HttpSmartRedirectResponse to the common response
        of Django view, without redirect.
    """
    response_redirect_class = HttpSmartRedirectResponse

    def __init__(self, *args, **kwargs):
        # create django request resolver
        self.handler = BaseHandler()

        # prevent recursive includes
        old = settings.MIDDLEWARE
        name = self.__module__ + '.' + self.__class__.__name__
        settings.MIDDLEWARE = [i for i in settings.MIDDLEWARE if i != name]

        self.handler.load_middleware()

        settings.MIDDLEWARE = old
        super(CommonMiddlewareAppendSlashWithoutRedirect, self).__init__(*args, **kwargs)

    def process_response(self, request, response):
        response = super(CommonMiddlewareAppendSlashWithoutRedirect, self).process_response(request, response)

        if isinstance(response, HttpSmartRedirectResponse):
            if not request.path.endswith('/'):
                request.path = request.path + '/'
            # we don't need query string in path_info because it's in request.GET already
            request.path_info = request.path
            response = self.handler.get_response(request)

        return response

0

আমারও একই সমস্যা ছিল আমার ক্ষেত্রে এটি স্ট্যাটিক ফাইলগুলির আগে থেকে urls.py এর কিছু পুরানো সংস্করণ থেকে বাসি বাকী ছিল:

url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'),
    'django.views.static.serve',
    kwargs={'document_root': settings.MEDIA_ROOT}),

MIDIA_URL খালি ছিল, তাই এই প্যাটার্নটি সমস্ত কিছুর সাথে মেলে।

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