Python学习笔记:7.3.1 Django快速建站 - 内置登录退出

前言:本文是学习网易微专业的《python全栈工程师 - Django快速建站》课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!

一、课程目标

  • 了解Django内置的权限管理
  • 使用内置应用实现登录、退出

二、详情解读

2.1.内置用户权限管理

Python学习笔记:7.3.1 Django快速建站 - 内置登录退出_第1张图片

2.1.1.内置功能
  • django.contrib.auth
    LoginView
    LogoutView
    PasswordChangeView
    PasswordResetView
    PasswordResetDoneView
    PasswordResetConfirmView
    PasswordResetCompleteView
    详情参考官网:https://docs.djangoproject.com/en/3.0/topics/auth/default/#all-authentication-views
2.2.登录
2.2.1.前次课内容
  • 登录表单类
  • 登录视图函数
    authenticate
    login
  • 登录模板
  • URL配置
2.2.2.本次课
  • auth.views.LoginView
  • 显示用户登录状态
    详情参考官网:https://docs.djangoproject.com/en/3.0/topics/auth/default/#django.contrib.auth.views.LoginView

实操:
Step1:修改路由。替换myproject/account/urls.py为以下内容:

# -*- coding=utf-8 -*-
from django.urls import path
from . import views
# 引入 django 自带的 views ,
# 并取名为 auth_views 避免和上面的views名字冲突
from django.contrib.auth import views as auth_views

app_name = 'account'

urlpatterns = [
	# path('login/', views.user_login, name='user_login'),
    # 更改路由,这里模板用的 login2.html ,为了和上次课作区分。
    path('login/', auth_views.LoginView.as_view(template_name='account/login2.html'), name='user_login'),
]

Step2:编辑模板文件。新建文件myproject/templates/account/login2.html

{% extends 'base.html' %}
{% load staticfiles %}

{% block title %}Login{% endblock %}

{% block content %}
<div class="row text-center">
    <h1>登录h1>
    <p>输入用户名和密码p>
    <form action="{% url 'account:user_login' %}" class="form-horizontal" method="post">
        {% csrf_token %}
        <div class="form-group">
            <label for="" class="col-md-5 control-label">用户名:label>
            <div class="col-md-6 text-left">{{ form.username }}div>
        div>
        <div class="form-group">
            <label for="" class="col-md-5 control-label">密 码:label>
            <div class="col-md-6 text-left">{{ form.password }}div>
        div>
        <input type="submit" value="登录" class="btn btn-primary btn-lg">
    form>
div>
{% endblock %}

说明:
1).注意表单提交路径的写法,是用冒号的:{% url 'account:user_login' %}
2).表单提交需要添加csrf_token{% csrf_token %}
3).注意表单默认使用form的变量,例如上面的 form.username,form.password
运行结果:
Python学习笔记:7.3.1 Django快速建站 - 内置登录退出_第2张图片
此时会有问题,当用户提交登录,会自动跳转到路由http://127.0.0.1:8000/accounts/profile/,但这个路径我们没有定义,所以会报如下404错误:

Python学习笔记:7.3.1 Django快速建站 - 内置登录退出_第3张图片
解决上述问题方案:
方案一: 我们定义http://127.0.0.1:8000/accounts/profile/的路径
方案二: 强制所有登录操作都转到一个固定的路径里面。

方案二的操作如下 :
Step1:修改配置文件myproject/mysite/settings.py,在文件末尾添加如下配置:

.
.
.
LOGIN_REDIRECT_URL = '/blog/'

Step2:显示用户登录态。替换文件`myproject/templates/header.html’为以下内容:

{% load staticfiles %}
<div class="container">
    <nav class="navbar navbar-default" navigation>
        <div class="navbar-header">
            <img src="{% static  './images/logo.png' %}" alt="" width="100">
        div>
        <div>
            <ul class="nav navbar-nav">
                <li><a href="{% url 'blog:blog_title' %}">BLOGa>li>
            ul>
            <ul class="nav navbar-nav navbar-right">
                {% if user.is_authenticated %}
                <li><a href="#">{{ user.username }}a>li>
                <li><a href="#">退出a>li>
                {% else %}
                <li><a href="{% url 'account:user_login' %}">登录a>li>\
                {% endif %}
            ul>
        div>
    nav>
div>
2.3.退出
2.3.1.内置方法
  • auth.views.LogoutView
  • 退出后所在位置:./account/logout.html

实操:
step1:添加路由,修改myproject/account/urls.py:

# -*- coding=utf-8 -*-
from django.urls import path
from . import views
from django.contrib.auth import views as auth_views

app_name = 'account'
urlpatterns = [
    # path('login/', views.user_login, name='user_login'),
    path('login/', auth_views.LoginView.as_view(template_name='account/login2.html'), name='user_login'),
    # 新增 退出 路由
    path('logout/', auth_views.LogoutView.as_view(), name='user_logout'),
]

Step2:修改文件myproject/templates/header.html,给退出按钮添加退出路由:

{% load staticfiles %}
<div class="container">
    <nav class="navbar navbar-default" navigation>
        <div class="navbar-header">
            <img src="{% static  './images/logo.png' %}" alt="" width="100">
        div>
        <div>
            <ul class="nav navbar-nav">
                <li><a href="{% url 'blog:blog_title' %}">BLOGa>li>
            ul>
            <ul class="nav navbar-nav navbar-right">
                {% if user.is_authenticated %}
                <li><a href="#">{{ user.username }}a>li>
                <li><a href="{% url 'account:user_logout' %}">退出a>li>
                {% else %}
                <li><a href="{% url 'account:user_login' %}">登录a>li>
                {% endif %}
            ul>
        div>
    nav>
div>

完成上述修改后,点击“退出”,有会如下报错:
Python学习笔记:7.3.1 Django快速建站 - 内置登录退出_第4张图片
这是因为成功退出后,默认跳转到http://127.0.0.1:8000/account/logout页面,但这个页面没有定义。解决方案很简单,新建这个页面即可:

Step3:新建文件myproject/templates/account/logout.html

{% extends 'base.html' %}

{% block title %}Logout{% endblock %}

{% block content %}
<div class="row text-center">
    <p>你已经愉快地退出了。p>
    <p>如果还想回去,点这里吧:<a href="{% url 'account:user_login' %}">登录a>p>
div>
{% endblock %}

Step4:在路由中添加模板,修改myproject/account/urls.py

# -*- coding=utf-8 -*-
from django.urls import path
from . import views
from django.contrib.auth import views as auth_views

app_name = 'account'

urlpatterns = [
    # path('login/', views.user_login, name='user_login'),
    path('login/', auth_views.LoginView.as_view(template_name='account/login2.html'), name='user_login'),
    # 下面这句添加 template_name 的值
    path('logout/', auth_views.LogoutView.as_view(template_name='account/logout.html'), name='user_logout'),
]

三、课程小结

  • 01.内置用户权限管理
  • 02.基于类实现登录和退出

你可能感兴趣的:(Python全栈工程师学习笔记,django内置登录退出功能,django内置权限管理,django)