要使用重定向时使用Turbolinks 5 Django的,我怎么能自动列入Turbolinks-Location头的()?
按照Turbolinks 5文档“以下的重定向”(https://github.com/turbolinks/turbolinks#following-redirects):要使用重定向时使用Turbolinks 5 Django的,我怎么能自动列入Turbolinks-Location头的()?
当您访问的位置
/one
和服务器重定向到的位置/two
,你还指望浏览器的地址栏中显示的重定向 网址。但是,Turbolinks使用
XMLHttpRequest
发出请求,其中 透明地遵循重定向。有没有办法让Turbolinks告诉 请求是否导致了重定向,而不从服务器的其他 合作。
而对于这个解决方案是:
响应发送
Turbolinks-Location
头的访问,这是 重定向,以及Turbolinks将取代浏览器的最顶端与你提供的价值的历史 条目。的Turbolinks Rails的引擎,与
redirect_to
帮手重定向非GET XHR请求自动执行此优化。
我在我的Django(1.11)的项目中使用Turbolinks了极大的兴趣,我想知道如果任何人都可以在如何创建一个新的Django重定向()函数或修改现有的指向正确的方向我一个总是包含重定向所需的Turbolinks-Location头部,以按预期方式工作。我绝对不希望每次执行重定向时手动设置此标头。
有在类似的入口段(https://github.com/turbolinks/turbolinks#redirecting-after-a-form-submission)“重定向表单提交后,”我也想感谢所有帮助了解如何实现:
如果表单提交结果的状态变化这 影响缓存的网页服务器,考虑清除Turbolinks的缓存与
Turbolinks.clearCache()
。Turbolinks Rails引擎针对非GET XHR请求自动执行此优化, 与
redirect_to
帮助器重定向。
我没看到有一个“插入式turbolinks实施的Django”包在github上,但是这是从turbolinks经典分叉和源代码也没有提到Turbolinks-Location头,所以我敢肯定这是不是我在找什么。
我确实最终发现了如何通过reddit用户指向这个项目中的一个代码块来尝试我正在尝试的内容。
我复制了TurbolinksMiddleware类到我自己的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
你提到Django的封装实现了middleware是负责添加标题。看起来,旧的turbolinks标题有不同的名称。您可以编写自己的中间件来支持turbolinks 5.
而不是正常提交表单,使用XHR提交它们。
您可以用普通的Django实现这一目标。阅读django CSRF doc - 他们详细解释什么是必要的。