После обновления до Django 1.11 append_slash больше не работает.

В Django 1.9 (и Python 3.4) по умолчанию APPEND_SLASH работал правильно, т. е. я мог ввести «localhost: 8000/ideatree/videos», и косая черта была бы добавлена.

После обновления до Django 1.11 (и Python 3.6) APPEND_SLASH больше не работает.

Я искал уведомления об устаревании, но пока не нашел ничего подходящего. (побочный вопрос: как снова включить «громкие предупреждения об устаревании», как это было в предыдущих версиях?)

Вот мой основной urls.py:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [   url(r'^(?i)ideatree/', include('ideatree.urls'),
 name='home'),
]

и urls.py из включенного app_space:

from django.conf.urls import url
from . import views

app_name = 'ideatree'
urlpatterns = [
   url(r'^$', views.index,name='index'),
   url(r'^(?i)features/$', views.features, name='features'),
   url(r'^(?i)videos/$', views.videos, name='videos')
]

Оба этих файла url.py не изменились, за исключением того, что в Django 1.9 у меня было

from django.conf.urls import patterns, include, url

в основном urls.py, но «шаблоны» теперь устарели и выдают предупреждение.

Как и прежде, я не установил APPEND_SLASH в settings.py, полагаясь на его значение по умолчанию True, хотя я пытался явно установить его на True с тем же результатом.

Вот мое промежуточное ПО:

MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Вот ошибка:

Page not found (404)
Request Method: GET
Request URL:    http://localhost:8000/ideatree/videos

Using the URLconf defined in mysite.urls, Django tried these URL patterns, in this order:
^(?i)ideatree/ ^$ [name='index']
^(?i)ideatree/ ^(?i)features/$ [name='features']
^(?i)ideatree/ videos/$ [name='videos']

Я также попытался очистить кеш браузера и использовать другой браузер на случай, если кеш все еще не будет очищен.

Регистрация в файл на уровне DEBUG или INFO ничего не показывает, пустой файл (предупреждение: мои настройки регистрации не проверены).

Должно быть что-то, что я упускаю из виду.


person Ron    schedule 29.09.2017    source источник
comment
Работает ли перенаправление, если вы удалите (?i) из ваших регулярных выражений в вашем основном URL-адресе и URL-адресе приложения?   -  person Alasdair    schedule 30.09.2017
comment
Это не работает, если (?i) удалено из регулярных выражений в обоих URL-адресах. Я также удалил app_name на всякий случай. Тот же результат.   -  person Ron    schedule 01.10.2017
comment
Я удивлен, что шаблоны в сообщении об ошибке не всегда содержат ^(?i). Вы публикуете свой точный код и сообщение об ошибке?   -  person Alasdair    schedule 01.10.2017
comment
У вас есть MIDDLEWARE в настройках (добавлено в Django 1.10)?   -  person Alasdair    schedule 01.10.2017
comment
О да. Я должен использовать промежуточное ПО Django 1.9. Это работает после 1) изменения MIDDLEWARE_CLASSES на MIDDLEWARE, 2) импорта MiddlewareMixin для переполнения стекаstackoverflow.com/questions/40876355/ и 3) удаление SessionAuthenticationMiddleware, поскольку оно больше не отображается в документах Django 1.10. Мне придется просмотреть документы, чтобы убедиться, что функциональность промежуточного программного обеспечения все еще завершена. @Alasdair, можете ли вы опубликовать ответ, чтобы я мог принять? Большое спасибо, никогда бы не нашел это без вашей помощи.   -  person Ron    schedule 02.10.2017


Ответы (1)


Django представила новое промежуточное ПО в Django 1.10. Вам следует использовать параметр MIDDLEWARE, если вы используете промежуточное ПО нового стиля. и MIDDLEWARE_CLASSES, если вы используете промежуточное ПО старого стиля.

Если вы используете Django 1.10 или 1.11, старый параметр MIDDLEWARE_CLASSES по-прежнему поддерживается, поэтому Django следует продолжать перенаправлять с добавленной косой чертой.

Однако, как только вы обновитесь до Django 2.0, параметр MIDDLEWARE_CLASSES будет проигнорирован, и вам придется переключиться на MIDDLEWARE.

Когда вы переключаетесь на MIDDLEWARE, вы должны удалить SessionAuthenticationMiddleware, так как он не действует в 1.10 и 1.11 и полностью удален в Django 2.0.

person Alasdair    schedule 02.10.2017
comment
Может быть, это также было взаимодействие между классами MIDDLEWARE_CLASSES и SessionAuthenticationMiddleware, которые не появляются в документах Django 1.11, поскольку они не работали, пока они не были удалены? - person Ron; 03.10.2017
comment
Нет, SessionAuthenticationMiddleware проблем быть не должно. В Django 1.11 это класс-заглушка из соображений обратной совместимости. Это не имеет никакого эффекта, но вам не нужно удалять его из MIDDLEWARE_CLASSES. - person Alasdair; 03.10.2017
comment
Если я не прокомментирую SessionAuthenticationMiddleware, я получаю сообщение ImportError: Module django.contrib.auth.middleware не определяет атрибут/класс SessionAuthenticationMiddleware. И промежуточное ПО, которое я использую, это список прямо из документации https://docs.djangoproject.com/en/1.11/topics/http/middleware/#activating-middleware. - person Ron; 03.10.2017
comment
Вы не должны получить эту ошибку, если включите SessionAuthenticationMiddleware в MIDDLEWARE_CLASSES — промежуточное ПО все еще существует в Django 1.11. Если вам не нужна обратная совместимость с другими версиями Django, рекомендуется удалить ее. Я хотел сказать, что SessionAuthenticationMiddleware не объясняет вашу первоначальную проблему. - person Alasdair; 03.10.2017
comment
Да, add_slash теперь работает даже без импорта MiddlewareMixin для обновления промежуточного ПО с 1.9 до 1.11, если я не использую SessionAuthenticationMiddleware. Происходит что-то еще. Я подозреваю что-то с регулярным выражением (?i), как вы упоминали ранее. - person Ron; 03.10.2017
comment
Все классы промежуточного программного обеспечения, которые вы используете, поставляются с Django. Они уже используют MiddlewareMixin в Django 1.11. Вам нужно только MiddlewareMixin, если вы пишете собственное промежуточное программное обеспечение, которое вы хотите быть совместимым с MIDDLEWARE_CLASSES и MIDDLEWARE. - person Alasdair; 03.10.2017
comment
Вы уверены, что используете Django 1.11.X? Сообщение ImportError: Module django.contrib.auth.middleware не определяет атрибут/класс SessionAuthenticationMiddleware — это то, что я ожидал в Django 2.0. Может у вас установлена ​​альфа 2.0? - person Alasdair; 03.10.2017
comment
Обидно, но правда. Это была альфа-версия Django 2.0. В Django 1.11 все работает, как и ожидалось. Это настоящий ответ. Еще раз спасибо @Alasdair - person Ron; 03.10.2017
comment
Да, обновление до Django 2.0 объясняет ошибки, которые вы видели. В Django 2.0 параметр MIDDLEWARE_CLASSES будет игнорироваться, MIDDLEWARE по умолчанию будет равен None, если он не определен в ваших настройках, а перенаправление перестанет работать, поскольку общее промежуточное ПО больше не будет включено. - person Alasdair; 03.10.2017