在Django中重定向之间保持原始请求链接?

时间:2013-12-31 17:10:33

标签: python django satchmo

我确实使用默认的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 + '/'

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

问题在于某些视图会将http重定向到其他视图,因此?next=之后的原始可选参数会丢失。

是否有某种方法可以保留/传递特定视图的原始网址? 例如,在调度smart.smart_add视图的url之后会执行重定向。它不接受可选的关键字参数。

from django.conf.urls import patterns

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

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

感谢。

更新 基于抽象的答案解决了以下问题:

  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. 在视图文件中装饰应用中间件响应的特定方法:
    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
    

1 个答案:

答案 0 :(得分:1)

您可以编写Middleware来捕获HTTP 301请求并传递查询参数。