2016-02-29 190 views
2

美好的一天,我有以下幾點看法:@login_required導致問題

class BookList(RequireLoginMixin, generic.ListView): 
    model = Book 
    template_name = 'book/list.html' 

@login_required(login_url='/login/') 
def fetch_book_author(request): 
     context = {"context": Book.objects.all()} 
     return render(request, 'book/pages/authors.html', context) 

class RequireLoginMixin(object): 
@classmethod 
def as_view(cls, **initkwargs): 
    view = super(RequireLoginMixin, cls).as_view(**initkwargs) 
    return login_required(view) 

我想拒絕,除了主頁我的所有網頁的訪問。任何網頁,我試着去訪問應用裝飾或混入後,是給我下面的錯誤:

^__debug__/ 
^admin/ 
^mwf/ 
The current URL, accounts/login/, didn't match any of these. 

這裏是我的網址配置:

app_name = 'bookApp' 
urlpatterns = [ 
    url(r'^$', HomeView.as_view(), name='home'), 
    url(r'^about/$', AboutView.as_view(), name='about'), 
    url(r'^welcome/$', WelcomeView.as_view(), name='welcome'), 
    url(r'^fetch-books/$', fetch_book_author, name='fetch'), 
    url(r'^books/$', BookList.as_view(), name='books'), 
    url(r'^login/$', 'django.contrib.auth.views.login', name='login'), 
    url(r'^logout/$', 'django.contrib.auth.views.logout', kwargs={'next_page': '/mwf/'}), 
    url(r'^signup/$', UserRegistrationView.as_view(), name='signup'), 
    url('^', include('django.contrib.auth.urls')), 
] 

,並在我的設置,我有:

LOGIN_REDIRECT_URL = 'login/' 

不知道這裏有什麼問題。 真的會感謝所有幫助

+1

它看起來像你試圖使用的登錄URL是'accounts/login /',但沒有任何與urlpatterns中的URL匹配。嘗試將您的登錄模式更改爲'r ^'accounts/login/$'' – dkhaupt

+0

並使用'LOGIN_REDIRECT_URL = reverse_lazy('login')'來避免硬編碼的網址。 – Risadinha

+0

您是否已經導入django.contrib.auth.views?,還嘗試編寫'login'而不是'login /' – jsanchezs

回答

1

你應該有任何

LOGIN_URL = '/login/' # The absolute url 

LOGIN_URL = 'login' # the name of the url pattern. 

第二個選項是更好,因爲它避免了硬編碼的URL。

LOGIN_REDIRECT_URL設置是用戶登錄後後用戶重定向到的URL。使用此設置的登錄URL沒有意義。

如果您使用的是Django 1.9+,那麼您可以使用login required mixin,而不必自行編寫。

1

定義登錄網址 LOGIN_URL =「/登錄/」

LOGIN_REDIRECT_URL =「登錄/」當你被記錄到系統則使用重定向。

+0

試過所有這個相同的問題, –

1

我找到了問題和解決方案。 因此,由於我使用的是app_name,在我的網址app_name = 'bookApp'中,我必須將任何url name_space加上app_name。 因此,在應用程序:

LOGIN_URL = 'bookApp:login' 
LOGIN_REDIRECT_URL = reverse_lazy('welcome') 

的Et瞧,這樣做的伎倆。

+0

我認爲這應該是'LOGIN_URL ='bookApp:login''。 – Alasdair

+0

另外,你不需要'reverse_lazy',所以你可以做'LOGIN_REDIRECT_URL ='bookApp:welcome''。 – Alasdair