2014-09-23 119 views
4

我一直在使用Django的auth模塊,但最近不得不關閉它。 auth模塊通過重定向到登錄頁面並將您已註銷的頁面設置爲參數?next=/currentPage來處理會話到期。在Django重定向時處理URL片段

所以,如果我的會議上#dashboard過期我會被重定向到:

mydomain/account/login?next=/#dashboard 

動過Django的驗證模塊後,我注意到這已更改爲:

mydomain/account/login/#dashboard 

這似乎一致我在閱讀URL Fragment and 302 redirects後應該如何理解它,但是,我想操作這個片段,但是在我的HttpResponse對象中沒有看到它。

django.contrib.auth使用以下函數來處理這個請求,但我看不到他們在哪裏移動片段。實際上,我只想完全刪除片段,但如果我不能,我會在?next=參數中解決它。

def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME): 
    """ 
    Decorator for views that checks that the user passes the given test, 
    redirecting to the log-in page if necessary. The test should be a callable 
    that takes the user object and returns True if the user passes. 
    """ 

    def decorator(view_func): 
     @wraps(view_func, assigned=available_attrs(view_func)) 
     def _wrapped_view(request, *args, **kwargs): 
      if test_func(request.user): 
       return view_func(request, *args, **kwargs) 
      path = request.build_absolute_uri() 
      # urlparse chokes on lazy objects in Python 3, force to str 
      resolved_login_url = force_str(
       resolve_url(login_url or settings.LOGIN_URL)) 
      # If the login url is the same scheme and net location then just 
      # use the path as the "next" url. 
      login_scheme, login_netloc = urlparse(resolved_login_url)[:2] 
      current_scheme, current_netloc = urlparse(path)[:2] 
      if ((not login_scheme or login_scheme == current_scheme) and 
       (not login_netloc or login_netloc == current_netloc)): 
       path = request.get_full_path() 
      from django.contrib.auth.views import redirect_to_login 
      return redirect_to_login(
       path, resolved_login_url, redirect_field_name) 
     return _wrapped_view 
    return decorator 


def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None): 
    """ 
    Decorator for views that checks that the user is logged in, redirecting 
    to the log-in page if necessary. 
    """ 
    actual_decorator = user_passes_test(
     lambda u: u.is_authenticated(), 
     login_url=login_url, 
     redirect_field_name=redirect_field_name 
    ) 
    if function: 
     return actual_decorator(function) 
    return actual_decorator 

回答

9

他們沒有刪除它。片段是從不將發送到後端:這就是瀏覽器的工作方式。

請注意,您的原始網址根本不會被解釋爲next="/#dashboard",而是next="/",並帶有後續的「儀表板」片段。也就是說,片段與查詢字符串是分開的,而不是其中的一部分。

你需要做的是編碼散列,所以它是查詢字符串本身的一部分。

mydomain/account/login?next=/%23dashboard