django操作cookie与session,中间件,csrf

1. django操作cookie补充

复制代码
set_signed_cookie()
参数:
key:这个cookie的key。
value:这个cookie的value。
max_age:最长的生命周期。单位是秒。
expires:过期时间。跟max_age是类似的,只不过这个参数需要传递一个具体的日期,比如datetime或者是符合日期格式的字符串。如果同时设置了expires和max_age,那么将会使用expires的值作为过期时间。
path:对域名下哪个路径有效。默认是对域名下所有路径都有效。
domain:针对哪个域名有效。默认是针对主域名下都有效,如果只要针对某个子域名才有效,那么可以设置这个属性.
secure:是否是安全的,如果设置为True,那么只能在https协议下才可用。
httponly:默认是False。如果为True,那么在客户端不能通过JavaScript进行操作。
salt: 加密盐
复制代码

 

2. django操作session

复制代码
# 设置
request.session['key'] = value  # 可以设置多组
# 获取
request.session.get('key')  # 可以获取多组
"""
服务端保存用户相关状态信息 返回给客户端随机字符串
针对保存 django需要一张表来处理 >>> 自带的django_session表
ps:django数据库迁移命令会产生一堆默认的表 其中就有一张django_session表
"""
1.设置session内部发生的事情
  1.产生一个随机字符串
  2.表中存储随机字符串与加密数据的对应关系 
  3.并将产生的随机字符串也给客户端发送一份并让其保存
      sessionid:随机字符串
2.获取session内部发送的事情
  1.自动获取客户端请求中的随机字符串
  2.自动去存储session数据的表中比对
  3.如果比对成功自动获取并'解密处理'
# django默认的session失效时间是14天


request.session.session_key            # 获取产生的随机字符串
request.session.delete()               # 只删客户端
request.session.flush()                # 服务端 客户端都删
request.session.set_expiry(value)      # 设置超时时间
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。
  
针对session数据的存储位置 有五种方案
  1.数据库存储   
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
INSTALLED_APPS [
'django.contrib.sessions',
]
2.缓存存储
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
3.文件存储
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH =
4.缓存+数据库存储
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
5.动态加密
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
复制代码

 

3. CBV添加装饰器

复制代码
'''需要借助于一个专门的装饰器模块'''
from django.utils.decorators import method_decorator
# 方式1:直接在类中的某个方法上添加
class MyLoginView(views.View):
    @method_decorator(login_auth)
    def get(self, request):
        return HttpResponse("from CBV get view")
# 方式2:直接在类名上添加并指定
@method_decorator(login_auth, name='get')
class MyLoginView(views.View):
    def get(self, request):
        return HttpResponse("from CBV get view")
# 方式3:重写dispatch方法并添加作用于类中所有的方法
class MyLoginView(views.View):
    @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        super().dispatch(request,*args,**kwargs)
复制代码

 

4. django中间件

复制代码
# 回忆django请求生命周期流程图
是django的门户 自带七个中间件 每个都有各自对应的功能

django不单有七个中间件并且每个都有很多功能和方法,除此之外django还支持自定义中间件并提供五个可以自定义的方法
必知: process_request process_response
了解: process_view process_template_response process_excepton django中间件的使用场景:只要是全局相关的功能都可以在中间件中编写 eg:用户黑名单校验、用户访问频率校验、网站全局用户身份校验
复制代码

 

5. 自定义中间件

复制代码
"""
1.创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内编写中间件类
4.配置文件中注册
"""
# 必须要掌握的方法
  1.process_request
      请求来的时候会从上往下依次执行配置文件中注册了的中间件里面的process_request方法 如果没有则直接跳过
    如果该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据
  2.process_response
      响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法 如果没有则直接跳过
    如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据 而不再是视图函数想要返回给客户端的数据
  """如果process_request返回了HttpResponse对象 那么会从当前位置从下往上执行每一个process_response"""
  
# 需要了解的方法
  1.process_view
      路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法
  2.process_template_response
      视图函数执行完毕之后返回的对象中含有render属性对应一个render方法
    则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法
  3.process_exception
      视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里面的process_exception
复制代码

 

6. csrf跨站请求伪造

# 前戏
    钓鱼网站:一个模仿正规网站的网址 诱骗用户在该网站上做本应该在正规网站上做的操作,从而获取到该用户在正规网站上的数据甚至是财产
    eg:假设我们需要登录网页完成转账操作
    我们不小心登录到了钓鱼网站 填写了账户 密码 对方账户等信息
    点击转账之后我们账户的钱确实减少了 但是对方账户却变成了一个你从来不认识的人
  原理:将收款人的账号 提前写成犯罪分子的然后隐藏 暴露给用户一个没有name属性的标签写着玩
# 简单模拟
    开设两个django项目 模拟两个相同的页面 具体参考课上代码

 

7. csrf解决策略

复制代码
"""针对csrf相关的校验有很多种方式 django只是提供了一些而已"""

# form表单
    <form action="" method="post">
    {% csrf_token %}
    <p>当前账户:<input type="text" name="current_user"></p>
    <p>目标账户:<input type="text" name="target_user"></p>
    <p>转账金额:<input type="text" name="money"></p>
    <input type="submit">
    </form>
# ajax请求
    1.方式1:页面任意位置先写{% csrf_token %} 之后获取数据     'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()
    2.方式2:模板语法直接获取
    'csrfmiddlewaretoken':{{ csrf_token }}

"""通用解决方案:js脚本自动处理"""
    也只能适用于ajax提交  form表单还是需要额外指定
复制代码

 

posted @   thrombus  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示