96

我有两个应用程序位于两台不同的计算机上。在计算机 A 上,在urls.py文件中我有如下一行:

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

该网址适用于mySite.com/cast/mySite.com/cast。但是在计算机 BI 上有一个类似的 url,如下所示:

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

出于某种原因,在计算机 B 上url mySite.com/login/ 会工作,但mySite.com/login会挂起并且不会mySite.com/login/像计算机 A 上那样直接返回。我错过了什么吗?这两个url.py文件看起来和我一模一样。

4

6 回答 6

211

或者你可以这样写你的网址:

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

斜杠后的问号使其在正则表达式中是可选的。如果出于某些原因不想使用 APPEND_SLASH 设置,请使用它。

于 2012-07-27T14:44:14.147 回答
113

检查APPEND_SLASHsettings.py 文件中的设置

django 文档中的更多信息

于 2009-10-20T18:49:39.500 回答
23

这改进了@Michael Gendin 的回答。他的回答为具有两个单独 URL 的相同页面提供服务。最好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"),
)
于 2016-06-02T23:11:40.523 回答
3

我也有同样的问题。我的解决方案是在正则表达式的最后一行之前放置一个 (|/)。

url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),

于 2015-08-18T17:30:07.590 回答
1

在没有重定向的情况下附加斜杠,在设置中使用它而不是 CommonMiddleware,Django 2.1:

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

添加到您的主应用程序目录middleware.py

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
于 2019-05-07T20:19:43.207 回答
0

我有同样的问题。在我的情况下,它是 urls.py 中一些旧版本的陈旧遗留物,来自静态文件之前:

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

MEDIA_URL 为空,因此此模式匹配所有内容。

于 2015-06-09T15:23:42.217 回答