gpt4 book ai didi

python - Django 的重定向应用程序不适用于 URL 参数

转载 作者:太空狗 更新时间:2023-10-30 01:05:40 27 4
gpt4 key购买 nike

我最近安装了 Django 的 default redirects app在我的网站上使用指定的确切说明:

  1. 确保安装了 django.contrib.sites 框架。
  2. 将“django.contrib.redirects”添加到 INSTALLED_APPS。
  3. 将“django.contrib.redirects.middleware.RedirectFallbackMiddleware”添加到 MIDDLEWARE。
  4. 使用 manage.py migrate 迁移数据库。

当我的 URL 干净时,该应用程序运行良好,如下所示:

Redirect setting: /page/ to /redirect/

When I visit https://www.example.com/page/ => redirects to https://www.example.com/redirect/

但是,当 URL 参数附加到我的 URL 末尾时,重定向不起作用,如下所示:

Redirect setting: /page/ to /redirect/

When I visit https://www.example.com/page/?url_parameter=true => throws Http404 error (page not found)

理想情况下,我希望我的重定向保留 URL 参数,如下所示:

Redirect setting: /page/ to /redirect/

When I visit https://www.example.com/page/?url_parameter=true => redirects to https://www.example.com/redirect/?url_parameter=true

有没有办法强制重定向应用程序按照上述保留 URL 参数?

最佳答案

1.需要自己写CustomRedirectFallbackMiddleware通过子类 django.contrib.redirects.middleware.RedirectFallbackMiddleware 并覆盖 django.contrib.redirects.middleware.RedirectFallbackMiddlewareprocess_response 方法。

自定义重定向中间件.py

import urlparse

from django import http
from django.conf import settings
from django.contrib.redirects.models import Redirect
from django.contrib.sites.shortcuts import get_current_site
from django.contrib.redirects.middleware import RedirectFallbackMiddleware


class CustomRedirectFallbackMiddleware(RedirectFallbackMiddleware):
response_gone_class = http.HttpResponseGone
response_redirect_class = http.HttpResponsePermanentRedirect

def process_response(self, request, response):
if response.status_code != 404:
return response

full_path = request.get_full_path()
"""
Seperate query parameters and url if full absolute path contains
query parameters using python urlparse library
"""
parsed_url = None
if "?" in full_path:
parsed_url = urlparse.urlparse(full_path)
# Now full path contains no query parameters
full_path = parsed_url.path

current_site = get_current_site(request)

r = None
try:
r = Redirect.objects.get(site=current_site, old_path=full_path)
except Redirect.DoesNotExist:
pass
if r is None and settings.APPEND_SLASH and not request.path.endswith('/'):
try:
if parsed_url is not None:
r = Redirect.objects.get(
site=current_site,
old_path= full_path + '/',
)
else:
r = Redirect.objects.get(
site=current_site,
old_path=request.get_full_path(force_append_slash=True),
)
except Redirect.DoesNotExist:
pass

if r is not None:
if r.new_path == '':
return self.response_gone_class()

#Adding back the query parameters to redirecting path
if parsed_url is not None:
new_path_with_query_params = r.new_path + "?" + parsed_url.query
return self.response_redirect_class(new_path_with_query_params)

#Handles redirections for urls without query parameters
return self.response_redirect_class(r.new_path)

return response

在这个CustomRedirectFallbackMiddleware

i. Simply separated URL parameters from full_absolute_path.

ii. Next got exact redirect_path of separated full_absolute_path form django.contrib.redirects database.

iii. Then appended the URL parameters which separated from full_absolute_path is to redirect_path.

2.从你的 settings.py 中删除 'django.contrib.redirects.middleware.RedirectFallbackMiddleware' 并将下面一行添加到 MIDDLEWARE settings.py.

# Here base is my Django app name
'base.custom_redirect_middleware.CustomRedirectFallbackMiddleware'

所有波纹管案例都工作得很好。

With no URL parameters.

With one URL paramter.

With more than one URL paramters.

更新:修复了 URL 没有尾部斜杠时引发 404 的问题。

希望这对您有所帮助。

关于python - Django 的重定向应用程序不适用于 URL 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43192484/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com