1、创建应用
为了实现用户登录、退出、注册等功能,从而进行用户管理,我们要创建一个新的应用account。
(1)创建应用:
$ python manage.py startapp account
(2)设置settings.py
INSTALLED_APPS = [
...
'blog',
'account',
]
(3)设置./mysite/urls.py
urlpatterns = [
...
path('account/', include('account.urls', namespace='account')),
]
(4)在./account中创建urls.py,并设置好本应用的路径
from django.urls import path
from . import views
app_name = "account"
urlpatterns = [
path('login/', views.user_login, name='user_login'),
]
需要再views.py中创建一个较为user_login的函数来响应请求。
2、理解表单类-用户登录
(1)创建表单类
表单一般是有需要用POST传递数据到服务器中,在./account目录中创建文件forms.py, 该文件专门存放各种表单有关的类,代码如下:
from django import forms
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
3、登录的视图函数
编辑./account/views.py,实现一个名为user_login的视图函数
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.contrib.auth import authenticate, login
from .forms import LoginForm
def user_login(request): # request必须作为视图函数的第一个参数
if request.method == "POST":
login_form = LoginForm(request.POST) # 通过传入request.POST返回的类字典类型数据,从而建立一个绑定实例,也就是把输入的数据传给了LoginForm类,该类的is_bound就为True
if login_form.is_valid(): # 验证表单的数据是合法有效的
cd = login_form.cleaned_data # 以字典返回实例的具体数据
user = authenticate(username=cd['username'], password=cd['password']) # authenticate检验此用户是否为本网站项目的用户,以及密码是否正确,返回user的实例对象
if user:
login(request, user) # 实现用户登录,用户登录之后会调用默认的session应用
return HttpResponse("Wellcome You.You have been authenticated successfully") # 将HTML看做字符,就可以传给HttpResponse类,这与render有所不同
else:
return HttpResponse("Sorry. Your username or password is not right.")
else:
return HttpResponse("Invalid login")
if request.method == "GET": # 如果是GET请求,则将 login_form = LoginForm()传给制定的模板呈现即可
login_form = LoginForm()
return render(request, "account/login.html", {"form": login_form})
在request对象的诸多方法中,常用的有request.method、request.GET和request.POST。
(1)request.GET, 当客户端向服务端发送GET请求后,request.GET会得到一个类字典对象 ,比如客户端向服务器发送http://www.xxx.com/?name=test&course=2的GET请求后,该请求携带了两个参数和值,即name=test和course=2,Django通过request.GET得到两个参数及其值,结果是类字典对象,还可以用request.GET.get('name')得到参数name的值test,这里的get()是字典的一个方法,需要注意。
(2)GET多用于查询数据,POST多用于数据写入或者更新等。
(3)在本应用中,浏览器想服务器提交表单内容,采用了POST方法,用POST提交方法,浏览器的地址不会发生变化,这与GET不同。
(4)在Django中,通过request.POST得到提交的表单数据,也是一个类字典对象。
(5)login_form = LoginForm(request.POST) # 通过request.POST传入字典类型的数据,从而建立一个绑定实例,也就是把输入的数据传给了表单LoginForm类,该类的is_bound就为True。
(6) authenticate主要用于检验此用户是否为本网站项目的用户,以及密码是否正确,如果True则返回User的一个实例对象。
(7)login(request, user) # 实现用户登录,用户登录之后会调用默认的session应用,一般login()和authenticate()配合使用
(8)将HTML看做字符,就可以传给HttpResponse类,这与render有所不同
(9)if request.method == "GET": # 如果是GET请求,则将 login_form = LoginForm()传给制定的模板呈现即可。
4、登录的前端界面
编写./templates/account/login.html
{% extends "base.html" %}
{% load staticfiles %}
{% block title %}Login{% endblock %}
{% block content %}
Login
Input your username and password
{% endblock %}
(1)