gpt4 book ai didi

python - 在 Django 中保留重定向之间的原始请求链接?

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:27 25 4
gpt4 key购买 nike

我确实使用默认的 django.core.context_processors.request 模板上下文处理器,因此我可以在 Django 模板中访问 HttpRequest 的 request 实例。

一种用途是检索原始发件人网址:

import re

nexturl_re = re.compile('\?next=(.+)$')

@register.simple_tag(takes_context=True)
def get_previous_url(context):
try:
return shop_base + \
nexturl_re.search( context['request'].get_full_path() ).group(1)
except (IndexError, AttributeError):
return shop_base + '/'

我确实使用它从发件人网址中提取参数。

问题在于某些 View 会 http 重定向到另一个 View ,因此 ?next= 之后的原始可选参数会丢失。

有什么方法可以保留/传递特定 View 的原始网址吗?例如,以下 smart.smart_add View 的 url 调度会执行重定向。它不接受可选的关键字参数。

from django.conf.urls import patterns

urlpatterns += patterns('satchmo_store.shop.views',
(r'^add/$', 'smart.smart_add', {}, 'satchmo_smart_add'),

除了完全重写原始 View 函数之外,还有其他方法吗?

谢谢。

更新根据abstractpaper的回答解决了以下问题:

  1. 编写一个中间件类来传递重定向响应的 url 参数:
    import re

    nexturlopt_re = re.compile('(\?next=.+)$')

    class ForwardUrlArguments(object):
    def process_response(self, request, response):
    if response.status_code in (301, 302, …):
    new_location = response.get('Location')
    if new_location:
    try:
    new_location += nexturlopt_re.search(
    request.get_full_path() ).group(1)
    except (IndexError, AttributeError):
    pass
    response['Location'] = new_location

    return response
  2. 在 View 文件中装饰特定方法来应用中间件的响应:
    from django.utils.decorators import decorator_from_middleware

    forward_urlargs = decorator_from_middleware(ForwardUrlArguments)

    @forward_urlargs
    def account_signin(request):


    @forward_urlargs
    def cart_smart_add(request):


    @forward_urlargs
    def cart_set_quantity(request):
    return cart.set_quantity(request) # wrapped a library function

最佳答案

你可以写一个 Middleware捕获 HTTP 301 请求并传递查询参数。

关于python - 在 Django 中保留重定向之间的原始请求链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20860829/

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