2.3 用内置的方法实现登录与退出

目录

1.定位到 内部login logout方法 /usr/local/python3/lib/python3.6/site-packages/django/contrib/auth/views.py

def login 方法,其实已经过时了.....

内部实现是Calss_based_view 调用 as_view -> diapatch -> post  方法来实现的

class LoginView(SuccessURLAllowedHostsMixin, FormView):
    """
    Displays the login form and handles the login action.
    """
    form_class = AuthenticationForm
    authentication_form = None
    redirect_field_name = REDIRECT_FIELD_NAME
    template_name = 'registration/login.html'
    redirect_authenticated_user = False
    extra_context = None

    @method_decorator(sensitive_post_parameters())
    @method_decorator(csrf_protect)
    @method_decorator(never_cache)
    def dispatch(self, request, *args, **kwargs):
        if self.redirect_authenticated_user and self.request.user.is_authenticated:
            redirect_to = self.get_success_url()
            if redirect_to == self.request.path:
                raise ValueError(
                    "Redirection loop for authenticated user detected. Check that "
                    "your LOGIN_REDIRECT_URL doesn't point to a login page."
                )
            return HttpResponseRedirect(redirect_to)
        return super(LoginView, self).dispatch(request, *args, **kwargs)

   def get_context_data(self, **kwargs): context = super(LoginView, self).get_context_data(**kwargs) current_site = get_current_site(self.request) context.update({ self.redirect_field_name: self.get_success_url(), 'site': current_site, 'site_name': current_site.name, }) if self.extra_context is not None: context.update(self.extra_context) return context @deprecate_current_app def login(request, *args, **kwargs): warnings.warn( 'The login() view is superseded by the class-based LoginView().', RemovedInDjango21Warning, stacklevel=2 ) return LoginView.as_view(**kwargs)(request, *args, **kwargs)

def logout 方法

也是过时的.....,内部实现和 login方法一样,都是用的 class_based_view

class LogoutView(SuccessURLAllowedHostsMixin, TemplateView):
    """
    Logs out the user and displays 'You are logged out' message.
    """
    next_page = None
    redirect_field_name = REDIRECT_FIELD_NAME
    template_name = 'registration/logged_out.html'
    extra_context = None

    @method_decorator(never_cache)
    def dispatch(self, request, *args, **kwargs):
        auth_logout(request)
        next_page = self.get_next_page()
        if next_page:
            # Redirect to this page until the session has been cleared.
            return HttpResponseRedirect(next_page)
        return super(LogoutView, self).dispatch(request, *args, **kwargs)

   def get_context_data(self, **kwargs):
        context = super(LogoutView, self).get_context_data(**kwargs)
        current_site = get_current_site(self.request)
        context.update({
            'site': current_site,
            'site_name': current_site.name,
            'title': _('Logged out'),
        })
        if self.extra_context is not None:
            context.update(self.extra_context)
        return context


@deprecate_current_app
def logout(request, *args, **kwargs):
    warnings.warn(
        'The logout() view is superseded by the class-based LogoutView().',
        RemovedInDjango21Warning, stacklevel=2
    )
    return LogoutView.as_view(**kwargs)(request, *args, **kwargs)

2.编辑 account/urls.py 调用内部login logout方法

指定 template_name

from django.conf.urls import url 
from . import views
from django.contrib.auth import views as auth_view

urlpatterns = [ 
    url(r'^login$',views.user_login,name="user_login"),
    url(r'^new_login$',auth_view.login,{ "template_name":"account/registration/login.html"},name="new_user_login"),
    url(r'^logout/$',auth_view.logout,{ "template_name":"account/logout.html"},name="user_logout"),
]

3.创建编辑 templates/account/registration/login.html

{% extends "base.html" %}
{% load staticfiles %}
{% block title%}Login{% endblock %}
{% block content%}
    <div class="row text-center vertical-middle-sm">
        <h1>login</h1>
        <p>input your username and password:</p>
        <form class ="form-horizontal" action ="{% url 'account:new_user_login' %}" method="post">{% csrf_token %}
            <!--{{ form.as_p}}-->
            <div class ="form-group">
                <label for="{{ form.username.id_for_label }}" class="col-md-5 control-label" style="color:red"> <span class="glyphicon glyphicon-user"></span>Username</label>
                <div class="col-md-6 text-left">{{ form.username }}</div>
            </div>
            <div class ="form-group">                <label for="{{ form.password.id_for_label }}" class="col-md-5 control-label" style="color:blue"> <span class="glyphicon glyphicon-floppy-open"> </span> Password</label>
                <div class="col-md-6 text-left">{{ form.password }}</div>
            </div>
            <input type="submit" class="btn btn-primary btn-lg" value="Login">
        </form>
    </div>
{% endblock %}

PS: 当action="."  post目录会空一级,可以直接指定url或者 action="",中间不可以写 点

4.创建编辑 templates/account/logout.html

{% extends "base.html" %}
{% block title %}Logout{% endblock %}
{% block content %}
<div class =" row text-center vertical-middle-sm">
    <p>You have logout.</p>
    <p>You can <a href="{% url 'account:user_login'%}">login</a> again</p>
</div>
{% endblock %}

5.编辑 mysite/settings.py

登录成功后自动跳转到的页面

LOGIN_REDIRECT_URL='/blog/'

6.打开浏览器测试

登录

自动跳转到blog

登出

原文地址:https://www.cnblogs.com/yaoyuanchun/p/13985024.html