目录
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
登出