要使用重定向时使用Turbolinks 5 Django的,我怎么能自动列入Turbolinks-Location头的()?

要使用重定向时使用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 - 他们详细解释什么是必要的。