1.Auth组件
导包创建对象用户认证设置用户只能登录之后访问某一个部分的内容,可以检查session信息 2.cookie
设置cookie获取cookie删除cookie实例 3.Session(保存在服务端的键值对)
工作原理session 设置session 获取session 删除,删除整条记录(包括 session_key、session_data、expire_date 三个字段) 4.FBV与CBV开发模式
FBVCBV
1.Auth组件Django 用户认证(Auth)组件一般用在用户的登录注册上,用于判断当前的用户是否合法,并跳转到登陆成功或失败页面。
导包Django 用户认证(Auth)组件需要导入 auth 模块:
# 认证模块 from django.contrib import auth # 对应数据库 from django.contrib.auth.models import User from django.contrib.auth import authenticate, login #数据库为login创建对象
创建用户对象的三种方法:
create():创建一个普通用户,密码是明文的。create_user():创建一个普通用户,密码是密文的。create_superuser():创建一个超级用户,密码是密文的,要多传一个邮箱 email 参数。
参数:
username: 用户名。password:密码。email:邮箱 (create_superuser 方法要多加一个 email)。
User.objects.create_user(username=username, password=password,email=email)用户认证
验证用户的用户名和密码使用 authenticate() 方法
返回值:如果验证成功,就返回用户对象,反之,返回 None。
给验证成功的用户加 session,将 request.user 赋值为用户对象。登陆使用 login() 方法。
user_obj = auth.authenticate(username=username, password=password)
if user_obj == None:
message="用户名或密码错误!"
else:
message="登录成功!"
login(request,user_obj)
------------------------------------------------------------------------
request.session.get('_auth_user_id') #获取用户当前的ID信息
auth.logout(request) #用户登出
设置用户只能登录之后访问某一个部分的内容,可以检查session信息注销用户使用 logout() 方法,需要清空 session 信息
if not request.user.is_authenticated: #如果用户未登录
return redirect("/now/logincheck/") #转移到此路径下
return render(request,"studey.html")
2.cookie
cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。
识别返回用户包括三个步骤:
服务器脚本向浏览器发送一组 cookie。例如:姓名、年龄或识别号码等。浏览器将这些信息存储在本地计算机上,以备将来使用。当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 cookie 信息发送到服务器,服务器将使用这些信息来识别用户。
HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。
但是仍然有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话
一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。
在Web开发中,使用 session 来完成会话跟踪,session 底层依赖 cookie 技术。
设置cookierep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密盐',...)获取cookie
request.cookieS.get(key)删除cookie
rep =HttpResponse || render || redirect rep.delete_cookie(key)实例
def login(request):
if request.method == "GET":
return render(request, "login.html")
username = request.POST.get("username")
password = request.POST.get("pwd")
user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
print(user_obj.username)
if not user_obj:
return redirect("/login/")
else:
rep = redirect("/index/")
rep.set_cookie("is_login", True)
return rep
def index(request):
print(request.cookieS.get('is_login'))
status = request.cookieS.get('is_login')
# 收到浏览器的再次请求,判断浏览器携带的cookie是不是登录成功的时候响应的 cookie
if not status:
return redirect('/login/')
return render(request, "index.html")
def logout(request):
rep = redirect('/login/')
rep.delete_cookie("is_login")
return rep
# 点击注销后执行,删除cookie,不再保存用户状态,并弹到登录页面
def order(request):
print(request.cookieS.get('is_login'))
status = request.cookieS.get('is_login')
if not status:
return redirect('/login/')
return render(request, "order.html")
3.Session(保存在服务端的键值对)
服务器在运行时可以为每一个用户的浏览器创建一个其独享的 session 对象,由于 session 为用户浏览器独享,所以用户在访问服务器的 web 资源时,可以把各自的数据放在各自的 session 中,当用户再去访问该服务器中的其它 web 资源时,其它 web 资源再从用户各自的 session 中取出数据为用户服务。
工作原理a. 浏览器第一次请求获取登录页面 login。b. 浏览器输入账号密码第二次请求,若输入正确,服务器响应浏览器一个 index 页面和一个键为 sessionid,值为随机字符串的cookie,即 set_cookie (“sessionid”,随机字符串)。c. 服务器内部在 django.session 表中记录一条数据。django.session 表中有三个字段。session_key:存的是随机字符串,即响应给浏览器的 cookie 的 sessionid 键对应的值。session_data:存的是用户的信息,即多个 request.session[“key”]=value,且是密文。expire_date:存的是该条记录的过期时间(默认14天)d. 浏览器第三次请求其他资源时,携带 cookie :{sessionid:随机字符串},服务器从 django.session表中根据该随机字符串取出该用户的数据,供其使用(即保存状态)。
注意: django.session 表中保存的是浏览器的信息,而不是每一个用户的信息。 因此, 同一浏览器多个用户请求只保存一条记录(后面覆盖前面),多个浏览器请求才保存多条记录。
cookie 弥补了 http 无状态的不足,让服务器知道来的人是"谁",但是 cookie 以文本的形式保存在浏览器端,安全性较差,且最大只支持 4096 字节,所以只通过 cookie 识别不同的用户,然后,在对应的 session 里保存私密的信息以及超过 4096 字节的文本。
session 设置request.session["key"] = value
执行步骤:
a. 生成随机字符串b. 把随机字符串和设置的键值对保存到 django_session 表的 session_key 和 session_data 里c. 设置 cookie:set_cookie(“sessionid”,随机字符串) 响应给浏览器 session 获取
request.session.get('key')
执行步骤:
a. 从 cookie 中获取 sessionid 键的值,即随机字符串。b. 根据随机字符串从 django_session 表过滤出记录。c. 取出 session_data 字段的数据。 session 删除,删除整条记录(包括 session_key、session_data、expire_date 三个字段)
request.session.flush()
删除 session_data 里的其中一组键值对:
del request.session["key"]
执行步骤:
- a. 从 cookie 中获取 sessionid 键的值,即随机字符串b. 根据随机字符串从 django_session 表过滤出记录c. 删除过滤出来的记录
实例:
def login(request):
if request.method == "GET":
return render(request, "login.html")
username = request.POST.get("username")
password = request.POST.get("pwd")
user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
print(user_obj.username)
if not user_obj:
return redirect("/session_login/")
else:
request.session['is_login'] = True
request.session['user1'] = username
return redirect("/s_index/")
def s_index(request):
status = request.session.get('is_login')
if not status:
return redirect('/session_login/')
return render(request, "s_index.html")
def s_logout(request):
# del request.session["is_login"] # 删除session_data里的一组键值对
request.session.flush() # 删除一条记录包括(session_key session_data expire_date)三个字段
return redirect('/session_login/')
4.FBV与CBV开发模式
FBV:基于函数的视图,就是在视图里使用函数处理请求。
FBVCBV:基于类的视图,就是在视图里使用类处理请求。
基于函数的视图其实我们前面章节一直在使用,就是使用了函数来处理用户的请求
路由配置:
urlpatterns = [
path("login/", views.login),
]
视图文件:
from django.shortcuts import render,HttpResponse
def login(request):
if request.method == "GET":
return HttpResponse("GET 方法")
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == "runoob" and pwd == "123456":
return HttpResponse("POST 方法")
else:
return HttpResponse("POST 方法1")
CBV
基于类的视图,就是使用了类来处理用户的请求,不同的请求我们可以在类中使用不同方法来处理,这样大大的提高了代码的可读性。
定义的类要继承父类 View,所以需要先引入库:
from django.views import View
执行对应请求的方法前会优先执行 dispatch 方法(在get/post/put…方法前执行),dispatch() 方法会根据请求的不同调用相应的方法来处理。
其实,在我们前面学到的知识都知道 Django 的 url 是将一个请求分配给可调用的函数的,而不是一个类,那是如何实现基于类的视图的呢? 主要还是通过父类 View 提供的一个静态方法 as_view() ,as_view 方法是基于类的外部接口, 他返回一个视图函数,调用后请求会传递给 dispatch 方法,dispatch 方法再根据不同请求来处理不同的方法。
路由配置:
urlpatterns = [
path("login/", views.Login.as_view()),
]
视图文件
from django.shortcuts import render,HttpResponse
from django.views import View
class Login(View):
def get(self,request):
return HttpResponse("GET 方法")
def post(self,request):
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == "runoob" and pwd == "123456":
return HttpResponse("POST 方法")
else:
return HttpResponse("POST 方法 1")
Copyright notice: this tutorial is based on runoob



