前言:本文是学习网易微专业的《python全栈工程师 - Django快速建站》课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!
Django
内置的权限管理django.contrib.auth
:LoginView
LogoutView
PasswordChangeView
PasswordResetView
PasswordResetDoneView
PasswordResetConfirmView
PasswordResetCompleteView
authenticate
login
URL
配置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
运行结果:
此时会有问题,当用户提交登录,会自动跳转到路由http://127.0.0.1:8000/accounts/profile/
,但这个路径我们没有定义,所以会报如下404错误:
解决上述问题方案:
方案一: 我们定义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>
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>
完成上述修改后,点击“退出”,有会如下报错:
这是因为成功退出后,默认跳转到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'),
]