2015-07-13 305 views
0

我正嘗試使用login_required裝飾器外部的django視圖。 我在我的工具上使用這個函數。django login_required裝飾器外部視圖

@login_required 
def somefunc(): 
    #logic 

,然後我打電話此somefunc()在我看來

class MyView(View): 
    def get(self, request, *args, **kwargs): 
     my_func = Somefunc() 

當我做到這一點說object has no attribute 'user' 請告訴我這裏的問題?

回答

0

您應該在View上添加login_required修飾符。這可以通過重寫dispatch方法來實現。

class MyView(View): 
    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(MyView, self).dispatch(*args, **kwargs) 

你可以創建自己實現這一混入或只使用django-bracesLoginRequiredMixin

如果您想在功能中進行此項檢查,則最好在somefunc中提出PermissionDenied例外。

無論哪種方式,你將需要request/usersomefunc

+0

謝謝,我更新了答案 – jgadelange

1

login_required正在尋找一個請求對象作爲第一個參數來裝飾視圖功能。請求對象具有user屬性,然後檢查該屬性是否實際登錄。您無法用此裝飾器包裝任意函數,並期望它與實際視圖函數完全相同。

+0

如果我發送請求給我的SomeFunc(請求) – aryan

+0

這可能會起作用。我認爲如果用戶沒有登錄,'login_required'將返回一個HttpResponse,所以你應該以某種方式處理。查看源代碼的工作原理:https://docs.djangoproject.com/en/1.8/_modules/django/contrib/auth/decorators/#login_required –

+0

但是,這是一個相當迂迴和模糊的處理方式,並可能導致意外的錯誤。我建議你自己寫一個明確的檢查,而不是使用'login_required'。您也可以按照@jgadelange的建議檢查django-braces。 –

相關問題