电子商务网站建设与管理笔试,旅游的网页设计模板,婚礼网,大数据营销系统怎么样文章目录 一、cookie与session的介绍HTTP四大特性 cookiesession Django操作cookie三板斧基于cookie的登录功能set_cookie 设置cookie 清空cookie设置cookie参数Django操作session设置session获取session清空sessionsession相关的参数设置过期时间 CBV添加装饰器 一、cookie与s… 文章目录 一、cookie与session的介绍HTTP四大特性 cookiesession Django操作cookie三板斧基于cookie的登录功能set_cookie 设置cookie 清空cookie设置cookie参数Django操作session设置session获取session清空sessionsession相关的参数设置过期时间 CBV添加装饰器 一、cookie与session的介绍
在讲之前我们先来回忆一下HTTP的四大特性
HTTP四大特性 1.基于请求响应 2.基于TIC、IP作用于应用层上的协议 3.无状态 保存客户端的装态 4.无连接 这篇文章要讲的就是跟“无状态”有关
最开始所有的网站都不需要用户注册登录所有人来访问到的数据都是一样的
但是随着互联网的发展很多网站需要知道当前用户的状态 cookie
保存在客户端与用户状态相关的信息这种信息都可以叫做cookie 最开始的cookie非常的不安全
session
保存在服务端与用户状态相关的信息session依赖于cookie工作 当然也可以不保存cookie在浏览器里设置阻止所有cookie当你设置了以后所有需要登录的网页都会登录不上去。
原理就是用户登录以后所有的相关信息都需要经过cookie服务器需要返回一些数据给cookie但是你的cookie被你关掉了就不会验证也就是令牌没有作用了所以不简易阻止所有cookie
Django操作cookie
在Django中如何是用cookie
三板斧
return HttpResponse 返回字符串
return render 返回网页
return redirect 重定向obj HttpResponse
return objobj render
return objobj redirect
return obj
操作cookie的时候就用到了这个obj对象基于cookie的登录功能
首先我们做一个简单的登录页面功能需要创建一个数据库从数据库匹配账户密码
models.py 创建数据库创建完别忘了做数据迁移
class Userinfo(models.Model):name models.CharField(max_length32)password models.IntegerField()tests.py 创建一些数据出来
import os
import sysif __name__ __main__:os.environ.setdefault(DJANGO_SETTINGS_MODULE, day10.settings)import djangodjango.setup()from app01 import modelsbulk_list []for i in range(10000):user_obj models.Userinfo(namefkevin{i}, passwordf{i})bulk_list.append(user_obj)models.Userinfo.objects.bulk_create(bulk_list)set_cookie 设置cookie
views.py 登录功能
def login(request):if request.method POST:print(request.POST)username request.POST.get(username) # 这里取到的是前端name的键password request.POST.get(password)userinfo models.Userinfo.objects.all() # 查询数据库的得到userinfo对象for i in userinfo: # 循环数据库里的数据if username i.name and password str(i.password): # 判断数据是否匹配print(登录成功)obj redirect(/index/) # 先实例化对象登录成功跳转页面obj.set_cookie(username, i.name, max_age60) # 让浏览器记录当前登录状态,max_age60这条记录只保存60秒60秒后删除return obj # 登录成功跳转页面else:return HttpResponse(密码错误)return render(request, login.html)login.html
body
form action methodpost用户名input typetext nameusername密码input typepassword namepasswordinput typesubmit
/form
/body这样一个简单的登录功能就创建出来了这个我们就可以在浏览器里看到cookie已经保存了一些数据 还可以做一个登录验证功能登录之后才能看到内容这里用到了装饰器
views.py
def login_auth(func):def inner(*args, **kwargs): # 这里就已经接收到了request参数request args[0] # 将request从args中索引取值出来if request.COOKIES.get(username): # 如果cookies有值就不用再登陆return func(*args, **kwargs)else: # 否则需要登录验证return redirect(/login/) # 跳转到登录页面return innerlogin_auth # 添加登录功能装饰器
def index(request):if request.is_ajax():myfile request.FILES.get(myfile)import osdir_path os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 获取当前文件所在路径with open(dir_path /static/ myfile.name, wb) as f: # 将文件写到static文件夹下for i in myfile:f.write(i)return render(request, index.html, locals())清空cookie
obj.delete_cookie(username)使用场景退出登录、注销
设置cookie参数
obj.set_cookie(username, i.name, max_age60)上面我们用到了三种参数分别是
● key, 键
● value’’, 值
● max_ageNone, 超时时间 cookie需要延续的时间以秒为单位如果参数是\ None 这个cookie会延续到浏览器关闭为止
还有其他的一些参数 ● expiresNone, 超时时间(IE requires expires, so set it if hasn’t been already.)兼容IE浏览器可以在同时设置两种这样兼容了所有浏览器
● path’/‘, Cookie生效的路径/ 表示根路径特殊的根路径的cookie可以被任何url的页面访问浏览器只会把cookie回传给带有该路径的页面这样可以避免将cookie传给站点中的其他的应用。
● domainNone, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如 domain”.example.com”所构造的cookie对下面这些站点都是可读的www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None cookie只能由设置它的站点读取
● secureFalse, 浏览器将通过HTTPS来回传cookie
● httponlyFalse 只能http协议传输无法被JavaScript获取不是绝对底层抓包可以获取到也可以被覆盖
Django操作session
session的数据是保存在后端保存在后端的载体其实有很多种比如可以把数据保存在数据库、文件、Redis等
Django的默认保存位置在数据库中在django_session表中
设置session
成功设置一个seesion值有什么变化
会生成一个随机字符串
def set_session(request):request.session[username] kevin1return HttpResponse(set_session)2. 会把用户设置的信息保存到django_session中数据也做了加密处理 3. 把数据封装到了request.session里去了
Django后端把随机字符串保存到浏览器中后端的随机字符串中的也保存在浏览器中keysessionid
这个是候我们再多设置一个值的时候session_key是不变的变的是session_data在别的浏览器打开的是候会多增加一条但是一个浏览器只对应一条这样做的好处可以节省MySQL数据空间
获取session
def get_session(request):print(request.session.get(username)) #kevin1 直接通过点语法获取return HttpResponse(get_session)获取session的时候发生了哪些事 浏览器先把sessionid回传到Django的后端 Django后端获取到了sessionid然后去数据表中根据session_key查询 如果查到了就说明之前已经登录过 如果查不到就返回None 查询出来的数据默认是加密的Django后端又把数据解密之后封装到request.session中 在取session值的时候就从request.session中取 session的过期时间默认是14天
清空session
request.session.delete() # 清空session只删除服务端的数据不删除浏览器的
request.session.flush() # 清空前后端的session数据session相关的参数
request.session.values() # 拿出所有的value值
request.session.keys() # 拿出所有的key值
request.session.items() # 拿出所有的key值和value值设置过期时间
request.session.set_expiry(value)如果value是个整数session会在这些秒数后失效 如果value是个datatime或timedeltasession就会在这个时间后失效。 如果value是0用户关闭浏览器session就会失效 如果value是Nonesession会依赖全局session失效策略
CBV添加装饰器
现在我给CBV添加一个登录验证有三种方法
第一种
from django.utils.decorators import method_decoratormethod_decorator(login_auth, nameget)
method_decorator(login_auth, namepost)
class L_login(View):def get(self, *args, **kwargs):return HttpResponse(get)def post(self, *args, **kwargs):return HttpResponse(post)第二种
from django.utils.decorators import method_decoratorclass L_login(View):method_decorator(login_auth)def get(self, *args, **kwargs):return HttpResponse(get)method_decorator(login_auth)def post(self, *args, **kwargs):return HttpResponse(post)第三种
from django.utils.decorators import method_decoratorclass L_login(View):method_decorator(login_auth) # 加载dispatch上的装饰器会对下面的所有方法起作用def dispatch(self, request, *args, **kwargs):return super().dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse(get)def post(self, request):return HttpResponse(post)一般第一种和第二种用的比较多