2017-11-11 351 views
2

按照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頭,所以我敢肯定這是不是我在找什麼。

回答

0

我確實最終發現瞭如何通過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 
0

你提到Django的封裝實現了middleware是負責添加標題。看起來,舊的turbolinks標題有不同的名稱。您可以編寫自己的中間件來支持turbolinks 5.

而不是正常提交​​表單,使用XHR提交它們。

您可以用普通的Django實現這一目標。閱讀django CSRF doc - 他們詳細解釋什麼是必要的。

相關問題