Skip to content

Commit 78338e1

Browse files
committed
Make the root middleware only act on resolver 404s
1 parent bea2c63 commit 78338e1

File tree

4 files changed

+23
-1
lines changed

4 files changed

+23
-1
lines changed

CHANGELOG.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ Change log
88

99
.. _Next version: https://github.com/matthiask/feincms3/compare/3.2...main
1010

11+
- Changed the root middleware to not act on 404 responses generated by views,
12+
only on 404 responses generated by resolver failures.
13+
1114

1215
`3.2`_ (2022-03-01)
1316
~~~~~~~~~~~~~~~~~~~

feincms3/root/middleware.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def handler(request, page):
4040
from functools import wraps
4141

4242
from django.http import HttpResponseRedirect
43+
from django.urls import is_valid_path
4344

4445

4546
def create_page_if_404_middleware(*, queryset, handler, language_code_redirect=False):
@@ -69,7 +70,7 @@ def create_page_if_404_middleware(*, queryset, handler, language_code_redirect=F
6970
def outer(get_response):
7071
def inner(request):
7172
response = get_response(request)
72-
if response.status_code != 404:
73+
if response.status_code != 404 or is_valid_path(request.path_info):
7374
return response
7475
qs = queryset(request) if callable(queryset) else queryset._clone()
7576
if page := qs.filter(path=request.path_info).first():

tests/testapp/test_feincms3.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,3 +1334,20 @@ def test_404_language_code_redirect_deeper(self):
13341334

13351335
response = self.client.get("/", HTTP_ACCEPT_LANGUAGE="en")
13361336
self.assertEqual(response.status_code, 404)
1337+
1338+
def test_404_for_resolvable_path(self):
1339+
"""404s from resolvable paths are not handled by the middleware"""
1340+
1341+
Page.objects.create(
1342+
title="test",
1343+
slug="test",
1344+
path="/not-found/",
1345+
static_path=True,
1346+
language_code="en",
1347+
is_active=True,
1348+
)
1349+
1350+
# 404 from view is forwarded; middleware only acts on non-resolvable
1351+
# paths
1352+
response = self.client.get("/not-found/")
1353+
self.assertEqual(response.status_code, 404)

tests/testapp/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ def not_found(request):
1212
path("i18n/", lambda request: HttpResponse(request.LANGUAGE_CODE))
1313
) + [
1414
path("admin/", admin.site.urls),
15+
path("not-found/", not_found),
1516
]

0 commit comments

Comments
 (0)