2016-02-29 258 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