zoukankan      html  css  js  c++  java
  • 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

    登出

  • 相关阅读:
    回发或回调参数无效。 问题的解决和思考
    母板页中的引用的图片,JS,css等路径问题
    Solution: 题解 CF1196E Connected Component on a Chessboard
    01/05/2020 我注册了博客园 I enrolled in Cnblogs.
    Basic Thought / Data Structure: 前缀和 Prefix Sum
    Basic Thought / Data Structure: 差分 Difference
    DotNet中异步编程(APM)的研究1异步编程介绍
    关于atl server 的感受(3) 一个我自以为豪的应用
    自己的博客,竟然要自己搜出来,太久没来了。
    关于atl server 的感受(2)
  • 原文地址:https://www.cnblogs.com/yaoyuanchun/p/13985024.html
Copyright © 2011-2022 走看看