前言:本文是学习网易微专业的《python全栈工程师 - Django快速建站》课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!
一、课程目标
- 创建用户管理应用
- 开发用户登录功能
- 理解表单类
二、详情解读
2.1.1.表单
- 表单用于收集不同类型的用户输入,它是一个包含表单元素的区域。表单元素是允许用户在表单中输入内容,比如:文本域(
textarea
)、下拉列表,单选框(radio-buttons
)、复选框(checkbox
)等等。表单使用表单标签<form>
来设置。
<form>
用户名:<input type='text' name='username'><br>
密 码:<input type='password' name='pwd'>
</form>
2.1.2.请求响应流程
2.2.登录功能
2.2.1.创建应用
- 用户管理应用
python manage.py startapp account
- 实现功能:登录、退出、注册、修改密码、重置密码、个人信息。
- 配置:
./mysite/settings.py
实操:
Step1
:创建应用account
,
python manage.py startapp account
然后往settings.py
文件中添加配置:
.
.
.
INSTALLED_APPS = [
'simpleui',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
'account', # 新增这一行
]
.
.
.
Step2
:添加路由,在myproject/mysite/urls.py
文件中,编辑如下
rom django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls', namespace='blog')),
# 添加下面这一行
path('account/', include('account.urls', namespace='account')),
]
Step3
:新建路由文件myproject/account/urls.py
,写入下面代码:
# -*- coding=utf-8 -*-
from django.urls import path
from . import views
app_name = 'account'
urlpatterns = [
path('login/', views.user_login, name='user_login'),
]
2.2.2.理解表单类
- 将表单看做对象:
usename,password
都是属性(字段)
<form>
用户名:<input type="text" name="username"><br/>
密 码:<inpout type="password" name="pwd">
</form>
实操: 创建文件myproject/account/forms.py
,写入以下代码:
# -*- coding=utf-8 -*-
from django import forms
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
我们在交互模式中演示一下:
(mydjpro) F:\myproject>python manage.py shell
>>> from account.forms import LoginForm
>>> login_form = LoginForm()
>>> print(login_form)
<tr><th><label for="id_username">Username:</label></th><td><input type="text" name="username" required id="id_username"></td></tr>
<tr><th><label for="id_password">Password:</label></th><td><input type="password" name="password" required id="id_password"></td></tr>
>>> login_form.as_p()
'<p><label for="id_username">Username:</label> <input type="text" name="username" required id="id_username"></p>\n<p><label for="id_password">Password:</label> <input typ
e="password" name="password" required id="id_password"></p>'
>>> login_form.as_table()
'<tr><th><label for="id_username">Username:</label></th><td><input type="text" name="username" required id="id_username"></td></tr>\n<tr><th><label for="id_password">Pass
word:</label></th><td><input type="password" name="password" required id="id_password"></td></tr>'
>>> login_form.is_bound
False # 这里 False 表示是一个空表单
>>> user = {'username': 'zhan', 'password': '123465'}
>>> admin_form = LoginForm(user)
>>> admin_form.is_bound
True # 这里表示是一个有值的表单
>>> admin_form.is_valid()
True # 这里表示提供的username和password值是通过验证的,下面这个是不通过验证:
>>> user1 = {'username': 'zhanyuan', 'password': ''}
>>> admin_form1 = LoginForm(user1)
>>> admin_form1.is_bound
True
>>> admin_form1.is_valid()
False # 上面密码为空,所以这里没通过验证,返回False
>>> admin_form.cleaned_data # 这里获取表单的值
{'username': 'zhan', 'password': '123465'}
>>> admin_form1.cleaned_data
{'username': 'zhanyuan'}
>>>
2.2.3.功能实现
- 使用默认的用户管理应用auth:
authenticate、login
- 用户登录视图函数
– 呈现表单:响应用户GET
请求
– 用户提交数据:响应POST
请求
下面在交互模式中演示一下:
>>> from django.contrib.auth import authenticate, login
>>> user = authenticate(username='admin', password='admin')
>>> user
<User: admin>
>>> user.username
'admin'
>>> user.id
1
>>> user = authenticate(username='laowang', password='1q2w3e4r5t.')
>>> print(user) # 当数据库中没这个用户时,打印用户信息为None
None
>>>
实操:
Step1
:编写用户登录的视图函数,myproject/account/views.py
写入以下代码:
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from .forms import LoginForm
def user_login(request):
# GET请求渲染登录表单
if request.method == 'GET':
login_form = LoginForm()
return render(request, 'account/login.html', {'form': login_form})
# POST 请求处理登录表单提交的信息
if request.method == 'POST':
login_form = LoginForm(request.POST)
if login_form.is_valid():
# 获取表单的数据
cd = login_form.cleaned_data
# 验证用户名与密码是否匹配
user = authenticate(username = cd['username'], password=cd['password'])
if user:
login(request, user)
return HttpResponse('Welcome You, You have logined the website.')
else:
return HttpResponse('Sorry , Your username or password is not right.')
else:
return HttpResponse('Invalid login.')
Step2
:编辑模板文件myproject/templates/account/login.html
{% extends 'base.html' %}
{% block title %} Login {% endblock %}
{% block content %}
<div class="row text-center">
<h1>登录</h1>
<p>输入用户和密码</p>
<form action="." class="form-horizontal" method="post">
{# 下面这句 csrf 是必备的,不然会报 403 错误 #}
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="登录">
</form>
</div>
{% endblock %}
运行结果:
2.2.4.模板
./templates/account/login.html
–{% csrf_token %}
的作用
–CSRF (Cross-Site Request Forgery)
,跨站请求伪造
三、课程小结
- 01.初步了解表单
- 02.编写表单类
- 03.实现登录功能