根据“后续重定向”(https://github.com/turbolinks/turbolinks#following-redirects)的Turbolinks 5文档:



解决方案是:



我对在Django(1.11)项目上使用Turbolinks感兴趣,我想知道是否有人可以向我指出如何创建新的Django redirect()函数或修改现有函数以始终包含Turbolinks的正确方向-重定向到预期功能所需的位置 header 。我绝对不希望每次重定向时都手动设置此 header 。

在“提交表单后重定向”部分(https://github.com/turbolinks/turbolinks#redirecting-after-a-form-submission)中有一个类似的条目,我也很感谢您在理解如何实现方面的任何帮助:



我确实在github上看到“Drop-in turbolinks实现为Django”包,但这是从turbolinks-classic派生的,并且源代码没有提及Turbolinks-Location header ,因此我确定这不是我想要的。

最佳答案

最后,我确实发现了Reddit用户指向该项目https://github.com/viewflow/django-material/blob/v2/material/middleware.py中的一大堆代码,从而发现该怎么做。

我将TurbolinksMiddleware类复制到我自己的apps目录下的middleware.py中,并在我的settings.py中列出了该类

# MIDDLEWARE CONFIGURATION
# --------------------------------------------------------------------------
MIDDLEWARE = [
    .
    .
    .
    'apps.middleware.TurbolinksMiddleware',
]

通过在我的html模板中包含turbolinks.js的常规安装步骤,一切似乎都可以正常工作。

这是TurbolinksMiddleware类,以防该链接在上面的链接中不可用:
class TurbolinksMiddleware(object):
    """
    Send the `Turbolinks-Location` header in response to a visit that was redirected,
    and Turbolinks will replace the browser’s topmost history entry .
    """

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)

        is_turbolinks = request.META.get('HTTP_TURBOLINKS_REFERRER')
        is_response_redirect = response.has_header('Location')

        if is_turbolinks:
            if is_response_redirect:
                location = response['Location']
                prev_location = request.session.pop('_turbolinks_redirect_to', None)
                if prev_location is not None:
                    # relative subsequent redirect
                    if location.startswith('.'):
                        location = prev_location.split('?')[0] + location
                request.session['_turbolinks_redirect_to'] = location
            else:
                if request.session.get('_turbolinks_redirect_to'):
                    location = request.session.pop('_turbolinks_redirect_to')
                    response['Turbolinks-Location'] = location
        return response

关于python - 要将Turbolinks 5与Django一起使用,在使用redirect()时如何自动包含Turbolinks-Location header ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47240766/

10-12 23:29