![](/img/trans.png)
[英]Django - Pass related object as variable in user_passes_test mixin
[英]user_passes_test: raise exception if user does not pass
我試圖定義一個裝飾器,以檢查用戶是否具有管理員某些特權:
def admin_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
actual_decorator = user_passes_test(
lambda u: u.is_staff and u.is_authenticated() and not Association.objects.filter(admins=u).exists(),
login_url=login_url,
redirect_field_name=redirect_field_name
)
if function:
return actual_decorator(function)
return actual_decorator
目的是在視圖中使用它。 特別是,我在基於類的視圖中使用它:
class MyCBV(CreateView):
@method_decorator(admin_required)
def dispatch(self, request, *args, **kwargs):
return super(MyCBV, self).dispatch(request, *args, **kwargs)
問題在於此視圖是通過AJAX加載的,因此不會發生重定向。 此外,即使用戶身份驗證失敗,視圖返回的HTTP狀態也將是成功,因此客戶端(JS)無法告知操作何時真正成功。
我通常在理解裝飾器和Django身份驗證時遇到麻煩,所以我的問題是:當身份驗證裝飾功能失敗時,如何引發異常(最好是PermissionDenied
異常)?
在Django 1.9+中,您可以使用UserPassesTestMixin
而不是裝飾器,並將raise_exception
設置為True
。
由於您使用的是不安全且過時的Django 1.4,因此您將無法執行此操作。 沒有使user_passes_test
提高PermissionDenied
而不是重定向的選項。 您可以嘗試在JavaScript中檢測重定向,或者查看user_passes_test
源代碼並實現類似的操作以返回所需的響應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.