1.Cookie
简介
浏览器缓存,是一种key-value结构。浏览器第一次访问服务器的时候cookie为空,服务器会创建一个cookie并响应给浏览器,浏览器会储存cookie,等到下一次访问这个服务器时会将携带的cookie发送给服务器,服务器变可以识别出客户端。
规范
- Cookie大小最大为4KB
- 一个服务器最多在浏览器上保存20个Cookie
- 一个浏览器最多保存300个Cookie
注意:
- 不同浏览器之间不共享Cookie
- 服务端发送重复的Cookie会覆盖掉原有的Cookie
语法
cookie = HttpResponse() 或cookie = render(request, ) 或cookie = rediret()
cookie.set_cookie(key, value)
set_cookie(key, value, max_age=xx, expires=xx, path="/xx")
"""
key: 键
value: 值
max_age: cookie存在的时间,以秒为单位
expires: cookie失效的具体时间
path: cookie生效的地址,其余的路径cookie不会被传递
"""
views.py
from django.shortcuts import render, HttpResponse, redirect
from .models import UserInfo
def login(request):
if request.method == "GET":
return render(request, "login.html")
elif request.method == "POST":
username = request.POST.get("username")
pwd = request.POST.get("pwd")
user = UserInfo.objects.filter(username=username, pwd=pwd).first()
if user:
cookie = HttpResponse("登陆成功")
cookie.set_cookie("is_login", True, max_age=10) # 5s以后cookie失效,刷新index路径时会跳转到登录界面
cookie.set_cookie("username", user.username, path='/index') # cookie中的username只会在index路径存在
return cookie
else:
return redirect("/login/")
def index(request):
is_login = request.COOKIES.get("is_login")
if is_login:
username = request.COOKIES.get("username")
return render(request, "index.html", locals())
else:
return redirect("/login/")
cookie失效(10s后)实现效果:
cookie生效路径(/index)实现效果:
2.Session
简介
是服务端技术,存储在服务端,给每个浏览器创建独立的session对象,存储在django_session表中,用户通过浏览器访问服务器时从各自的session对象中取得数据。
语法
设置session request.session["xx"] = xx
获取session request.session.get("xx")
删除session del request.session["xx"]
删除会话 request.session.flush()
主要用于注销用户
基本流程
设置session
生成随机字符串str
response.set_cookie("sessionid", str)
向django_session表中插入数据:
session_key session_data expire_date 随机字符串str {"xxx":xxx, "xxx":xxx ....} xxxx-xx-xx
获取session
session = request.Cookie.get("session")
从django_session表中过滤数据
obj = django_session.object.filter(session_key = session ).first()
拿到具体的数据
obj.session_data.get("xxx")
删除会话(flush)
- session = request.Cookie.get("session")
- django_session.object.filter(session_key = session ).delete()
- request.delete_cookie("sessionid", session)
Session更新
当创建session时,第一步会先判断浏览器是否携带的cookie中是否含有session_key,如果有则不更改session_key,覆盖session_data信息(前提是登录的用户不变),如果没有则会添加新的session_key 与session_data,比如A已经登录了谷歌浏览器,下一次再用谷歌浏览器登录时,会携带包含session_key的cookie信息,服务器接受之后不会增加新的session对象,而是找到该浏览器对应的session数据,覆盖修改上一次存储于的session_data,如果A用火狐浏览器登录时服务器则会创建火狐浏览器对应的session数据。
配置
settings.py
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
3.用户认证组件
auth模块
前提
首先需要在django自动创建的auth_user表中添加记录
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
基本语法
authenticate()
用户认证方法,需要username以及password两个参数(取决于auth_user表中username和password两个字段),当认证信息成功时,会返回一个user对象。
from django.contrib import auth
user = auth.authenticate(username=xxx, password=xxx)
login(request, user)
调用django中的session框架并给认证的用户添加session信息
views.py
from django.contrib import auth
def login(request):
if request.method == "GET":
return render(request, "login.html")
username = request.POST.get("username")
password = request.POST.get("password")
user = auth.authenticate(username=username, password=password)
if user:
auth.login(request, user) # request.user
return redirect("/index")
else:
return redirect("/login")
def index(request):
if request.user.username:
return render(request, "index.html")
else:
return redirect("/login")
login.html
<form action="" method="post">
{% csrf_token %}
用户名<input type="text" name="username">
密码<input type="text" name="password">
<input type="submit" value="提交">
</form>
index.html
<h2>欢迎您,{{ request.user.username }}</h2>
实现效果:
logout(request)
清除当前请求的所有session信息
views.py
def logout(request):
auth.logout(request)
return redirect("/login")
index.html
<a href="/logout">注销</a>
实现效果:
User对象
is_authenticated()
如果是一个User对象,则会返回True,主要用于验证用户登录
create_user()
用于注册创建用户
from django.contrib.auth.models import User
User.objects.create_user(username=xxx, password=xxx, email=xxx)
check_password()
用于修改密码,首先获取用户的输入的旧密码,匹配成功后输入新密码并修改
user = User.objects.get(username = “ ”)
user.set_password(password = “ ”)
user.save
login_required()
装饰器,只有当用户登录的时候才可以访问的地址
settings.py
LOGIN_URL = '/login/' # 当非登录用户访问被装饰器login_required修饰的地址时返回的url
views.py
from django.contrib.auth.decorators import login_required
@login_required
def hello(request):
return HttpResponse("hello world")
实现效果: