根据“后续重定向”(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/