1 网站都没有保存用户功能的需求,所有用户访问返回的结果都是一样的
2 出现了一些需要保存用户信息的网站
- 以登录功能为例:
- 如果不保存用户登录状态,也就意味着用户每次访问网站都需要重复的输入用户名和密码
- 这对用户来说,体验感极差
- 解决办法:
- 当用户第一次登陆成功之后,将用户的用户名和密码返回给用户浏览器,让用户浏览器 保存在本地
- 之后访问网站的时候浏览器自动将保存在本地的用户名和密码发送给服务端,服务端获取之后自动验证
- 但是具有极大的安全隐患
- 优化
- 当用户登陆成功之后,服务端产生一个随机字符串(在服务端保存数据,用K:V键值对的形式),交由客户端浏览器保存
- 之后访问服务端的时候,都带着随机字符串,服务端去数据库中比对是否有匹配到的随机字符串,从而获得用户信息
- 但是如果截获到当前随机字符串,那么就可以冒充当前用户,其实还是有极大的安全隐患
- 在web领域没有绝对的安全和绝对的不安全
服务器保存在客户端浏览器上的信息都可以称之为cookie
它的表现形式一般都是key:value键值对(可以有多个)
保存在服务器上的信息都可以称之为session
它的表现形式一般都是key:value(可以有多个)
视图函数的返回值
return HttpResponse()
return render()
return redirect()
变形
obj = HttpResponse()
return obj
obj1 = render()
return obj1
obj2 = redirect()
return obj2
如果想要操作cookie,必须进行以上变形才可以
obj = HttpResponse()
obj.set_cookie(key,value)
return obj
request.COOKIES.get(key)
obj = HttpResponse()
obj.set_cookie(key,value,max_age=5)
# 设置超时时间 5s 到期
return obj
max_age:设置超时时间,以秒为单位
expiress:设置超时时间 针对IE浏览器使用,以秒为单位
obj = HttpResponse()
# 设置超时时间 5s 到期
obj.delete_cookie(key)
return obj
- 注意
- 这里只是拿 HttpResponse 举例,并不是这个参数只能是 HttpResponse
- 比如
- 我们想下一步跳转到某一个功能时,可以是
obj = redirect('/home/')
obj.delete_cookie(key)
return obj
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == "dream" and password == "521":
# 登陆成功之后,跳转到登陆成功之后才能看到的页面
return redirect('/home/')
return render(request, 'login.html')
def home(request):
return HttpResponse("登陆成功!")
问题:登陆成功之后的跳转页面,不需要登录也可以直接访问到,只需要给对应地址即可
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == "dream" and password == "521":
# 登陆成功之后,保存用户登陆状态
obj = redirect('/home/')
# 让浏览器记录cookie
obj.set_cookie("sign", "1314521")
'''
浏览器不单单只是帮我们保存cookie
而且在后面每次访问的时候都会带着cookie
'''
# 登陆成功之后,跳转到登陆成功之后才能看到的页面
return obj
return render(request, 'login.html')
def home(request):
# 读取携带的cookie,cookie正确登陆成功
if request.COOKIES.get("sign") == "1314521":
return HttpResponse("登陆成功!")
# 读取携带的cookie,cookie不正确跳转到登陆页面
return redirect('/login/')
用户如果没有登录的情况下想访问一个需要登录的页面
那么先跳转到登录页面,当用户输入正确的用户名和密码之后再跳转到用户之前想访问的页面去,而不是直接写死
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == "dream" and password == "521":
# 获取用户上一次想要访问的url
# 结果可能为空 -- 直接访问login
tag_url = request.GET.get('tag_url')
if tag_url:
obj = redirect(tag_url)
else:
# 登陆成功之后,保存用户登陆状态
obj = redirect('/home/')
# 让浏览器记录cookie
obj.set_cookie("sign", "1314521")
'''
浏览器不单单只是帮我们保存cookie
而且在后面每次访问的时候都会带着cookie
'''
# 登陆成功之后,跳转到登陆成功之后才能看到的页面
return obj
return render(request, 'login.html')
# 校验用户登录状态的装饰器
def auth_check(func):
def inner(request, *args, **kwargs):
# 获取到用户上一次想要访问的url
tag_url = request.get_full_path()
# 读取携带的cookie,cookie正确登陆成功
if request.COOKIES.get("sign") == "1314521":
res = func(request, *args, **kwargs)
return res
else:
# 读取携带的cookie,cookie不正确跳转到登陆页面
return redirect(f'/login/?next={tag_url}')
return inner
@auth_check
def home(request):
return HttpResponse("home登陆成功!")
@auth_check
def index(request):
return HttpResponse("index登陆成功!")
@auth_check
def func(request):
return HttpResponse("func登陆成功!")
session数据是保存在服务端的,给客户端返回的是一个随机字符串
request.session['key'] = value
request.session.get('key')
request.session
对象获取到设置的多组键值对django_sessoin
表中的数据条数取决于浏览器
# 设置session
request.session['key'] = value
# 设置过期时间
request.session.set_expiry()
参数:
整数:多少秒过期
日期对象:到指定日期失效
0:一旦退出当前浏览器窗口就失效
不写:失效时间取决于Django内部全局session失效的时间
1.request.session.delete()
只删除服务端的
该方法用于删除当前用户的Session数据,但会保留Session的key
这意味着Session对象本身仍然存在,但其中的数据将被清空
下次访问时,如果Session没有被重新填充,则会得到一个空的Session对象
以下是使用request.session.delete()的示例
def clear_session(request):
request.session.delete()
# 其他操作或返回响应
2.request.session.flish()
服务端和客户端删除
该方法用于完全删除当前用户的session,包括session对象和所有相关数据
下次访问时,将创建一个新的空session对象
以下是使用request.session.flush()的示例
def clear_session(request):
request.session.flush()
# 其他操作或返回响应
1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用设置项:
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,默认修改之后才保存(默认)
*request*.session['sign'] = "369"
内部发生了哪些事
Django内部会自动帮我们生成一个随机字符串
Django内部自动将随机字符串和对应的数据存储到 django_sessoin
表中
先在内存中产生操作数据的内存
在响应经过Django中间件的时候才去操作数据数据库
'django.contrib.sessions.middleware.SessionMiddleware',
将产生的随机字符串返回给客户端浏览器保存
request.session.get("sign")
内部发生了哪些事
sessionid
对应的随机字符串django_session
表中查找对应的数据
request.session
中request.session
中的数据为None