Django CBV身份验证登录/注销解决方案

Django CBV身份验证登录/注销解决方案,django,login,logout,class-based-views,Django,Login,Logout,Class Based Views,我从Django网站的URL/“登录”获得了CBV设置,但我试图在成功登录后将登录重定向到URL“/blah/” 这是我的myapp/url.py from django.conf.urls import include, url from django.contrib import admin from content import views as content_views urlpatterns = [ url(r'^', include('content.urls')),

我从Django网站的URL/“登录”获得了CBV设置,但我试图在成功登录后将登录重定向到URL“/blah/”

这是我的myapp/url.py

from django.conf.urls import include, url
from django.contrib import admin
from content import views as content_views

urlpatterns = [
    url(r'^', include('content.urls')),
    url(r'^(?P<slug>[a-zA-z0-9]+)/$', content_views.BlahDetailView.as_view(), name='blah_detail'),]
这里是content/views.py

class LoginView(FormView):
    """
    Provides the ability to login as a user with a username and password
    """
    success_url = '/'
    form_class = AuthenticationForm
    redirect_field_name = REDIRECT_FIELD_NAME
    template_name = 'content/login.html'

    @method_decorator(sensitive_post_parameters('password'))
    @method_decorator(csrf_protect)
    @method_decorator(never_cache)
    def dispatch(self, request, *args, **kwargs):
        # Sets a test cookie to make sure the user has cookies enabled
        request.session.set_test_cookie()
        return super(LoginView, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        auth_login(self.request, form.get_user())
        # If the test cookie worked, go ahead and
        # delete it since its no longer needed
        if self.request.session.test_cookie_worked():
            self.request.session.delete_test_cookie()
        return super(LoginView, self).form_valid(form)

    def get_success_url(self):
        import ipdb; ipdb.set_trace()
        redirect_to = self.request.GET.get(self.redirect_field_name)
        if not is_safe_url(url=redirect_to, host=self.request.get_host()):
            redirect_to = self.success_url
        return redirect_to


class LogoutView(RedirectView):
    """
    Provides users the ability to logout
    """
    url = '/login/'

    def get(self, request, *args, **kwargs):
        import ipdb; ipdb.set_trace()
        if self.request.user.is_authenticated():
            auth_logout(request)
        return super(LogoutView, self).get(request, *args, **kwargs)

class IndexList(generic.ListView):
    template_name = 'content/index.html'
    context_object_name = 'home_page'
    queryset = <some object>

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        if self.request.user.is_active:
            return super(IndexList, self).dispatch(*args, **kwargs)
        else:
            return HttpResponseRedirect('%s?next=%s' % (settings.LOGIN_URL, self.request.path))

    def get_context_data(self, **kwargs):
        context = super(IndexList, self).get_context_data(**kwargs)
        if self.request.user.is_authenticated():
            context['authenticated_user'] = True
        else:
            context['authenticated_user'] = False
        <<some other context data here>>
        return context

class BlahDetailView(generic.DetailView):
    model = Obj
    template_name = 'content/blah'
    context_object_name = 'blah_detail'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        if self.request.user.is_active:
            return super(BlahDetailView, self).dispatch(*args, **kwargs)
        else:
            return HttpResponseRedirect('?next=%s' % (self.request.path))

    def get_queryset(self):
        self.page = get_object_or_404(Page, slug=self.kwargs['slug'])
        return Obj.objects.filter(slug=self.kwargs['slug'], enabled=True).order_by('name')

    def get_context_data(self, **kwargs):
        context = super(BlahDetailView, self).get_context_data(**kwargs)
        if self.request.user.is_authenticated():
            context['authenticated_user'] = True
        else:
            context['authenticated_user'] = False
        << some other context data here>>
        return context
类登录视图(FormView):
"""
提供使用用户名和密码以用户身份登录的功能
"""
成功_url='/'
form\u class=身份验证表单
重定向\字段\名称=重定向\字段\名称
模板名称='content/login.html'
@方法修饰符(敏感的参数(“密码”))
@方法装饰器(csrf保护)
@方法\u装饰器(从不\u缓存)
def调度(自我、请求、*args、**kwargs):
#设置测试cookie以确保用户已启用cookie
request.session.set\u test\u cookie()
返回super(LoginView,self).分派(请求,*args,**kwargs)
def表单_有效(自身、表单):
身份验证登录(self.request,form.get\u user())
#如果测试cookie有效,请继续并
#删除它,因为它不再需要
如果self.request.session.test\u cookie\u工作():
self.request.session.delete\u test\u cookie()
返回super(LoginView,self)。表单\u有效(表单)
def get_success_url(自我):
进口ipdb;ipdb.set_trace()
重定向到=self.request.GET.GET(self.redirect\u字段\u名称)
如果不安全,url(url=redirect\u to,host=self.request.get\u host()):
重定向到=self.success\u url
返回重定向到
类LogoutView(重定向视图):
"""
为用户提供注销功能
"""
url='/login/'
def get(自我、请求、*args、**kwargs):
进口ipdb;ipdb.set_trace()
如果self.request.user.is_经过身份验证():
授权注销(请求)
返回super(LogoutView,self).get(请求,*args,**kwargs)
类索引列表(generic.ListView):
模板名称='content/index.html'
上下文\对象\名称='主页'
查询集=
@方法\u装饰器(需要登录)
def调度(自身、*args、**kwargs):
如果self.request.user.u处于活动状态:
返回super(IndexList,self).dispatch(*args,**kwargs)
其他:
返回HttpResponseRedirect(“%s?next=%s%”(settings.LOGIN\u URL,self.request.path))
def获取上下文数据(自身,**kwargs):
context=super(IndexList,self)。获取上下文数据(**kwargs)
如果self.request.user.is_经过身份验证():
上下文['authenticated_user']=True
其他:
上下文['authenticated_user']=False
返回上下文
类BlahDetailView(generic.DetailView):
型号=Obj
模板名称='content/blah'
context_object_name='blah_detail'
@方法\u装饰器(需要登录)
def调度(自身、*args、**kwargs):
如果self.request.user.u处于活动状态:
返回超级(BlahDetailView,self).dispatch(*args,**kwargs)
其他:
返回HttpResponseRedirect(“?下一步=%s%”(self.request.path))
def get_queryset(自我):
self.page=get_object_或_404(page,slug=self.kwargs['slug'])
返回Obj.objects.filter(slug=self.kwargs['slug'],enabled=True)
def获取上下文数据(自身,**kwargs):
context=super(BlahDetailView,self)。获取上下文数据(**kwargs)
如果self.request.user.is_经过身份验证():
上下文['authenticated_user']=True
其他:
上下文['authenticated_user']=False
>
返回上下文
这是content/login.html

<form method="post" action="{% url 'content:login' %}"> {% csrf_token %}
    <input type="hidden" name="next" value="{{ next }}" />
    <input type="text" name="username" placeholder="Username"/><br/>
    <input type="password" name="password" placeholder="Password"/><br/>

    <input type="submit" value="Login"/>
</form>
{%csrf\u令牌%}


当我转到“/”时,它会打开登录页面,然后我登录,它会重定向到“/”。但当我转到“/blah/”时,它会打开登录页面,但不会重定向到“/blah/”。我看到我已经将success_url设置为“/”,我只是不明白如何将它重定向到“/blah/”,或者如果我转到任何其他url。我是一个新手,所以如果我没有看到一些不言而喻的东西,我道歉。谢谢,西米

<form method="post" action="{% url 'content:login' %}"> {% csrf_token %}
    <input type="hidden" name="next" value="{{ next }}" />
    <input type="text" name="username" placeholder="Username"/><br/>
    <input type="password" name="password" placeholder="Password"/><br/>

    <input type="submit" value="Login"/>
</form>