django操作cookie补充、django操作session、CBV添加装饰器的三种方式、django中间件简介、django中间件五个常见方法、csrf跨站请求伪造

django操作cookie补充

django操作session

CBV添加装饰器的三种方式

django中间件简介

django中间件五个常见方法

csrf跨站请求伪造

django操作cookie补充

# 设置cookie
key, 键
value='', 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
secure=False, https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
   
# 使用
   set_signed_cookie(key,value,salt='加密盐')
set_signed_cookie(key,value,max_age=超时时间:默认是秒数)
expires:专门针对IE浏览器设置超时时间
  
HttpResponse对象.delete_cookie(key) 
 
# 删除cookie
   def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
    return rep                

image-20220524172700923

django操作session

# 设置
request.session['key'] = value  # 可以设置多组
eg:
	request.session['周一'] = '半死不活'
# 获取
request.session.get('key')  # 可以设置对组
eg:
    request.session.get('周一')
    
"""
 服务端保存用户相关状态信息,返回给客户端随机字符串,针对保存Django需要一张表来处理 >>> 自带的 django_session表
 在执行django数据库迁移命令会产生一对默认的表,这里面就有django_session表
"""

1.设置session内部发生的事情
  1.1.产生一个随机字符串
  1.2.表中存储随机字符串与加密数据的对应关系 
  1.3.并将产生的随机字符串也给客户端发送一份并让其保存
  	sessionid:随机字符串
2.获取session内部发送的事情
  1.自动获取客户端请求中的随机字符串
  2.自动去存储session数据的表中比对
  3.如果比对成功自动获取并'解密处理'
# django默认的session失效时间是14天

image-20220524174341531

image-20220524174416294

image-20220524175002643

  • django操作session补充

request.session.session_key  # 获取产生的随机字符串
# pm60sf6jxgyve773q0kbuqjri9mxgo42
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
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'   # 引擎

CBV添加装饰器的三种方式

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

django中间件简介

中间件是django门户,自带七个中间件,每个都有各自对应的功能
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
django还支持自定义中间件并提供五个可以自定义的方法
  process_request
  process_response
  process_view
  process_template_response
  process_excepton
django中间件的使用场景:只要是全局先关相关的功能都可以在中间件编写
    eg:用户黑名单校验、用户访问频率校验、网站全局用户身份校验

django中间件五个常见方法

# 使用方法:
"""
  1.创建一个任意名称的文件夹
  2.在该文件夹内创建一个任意名称的py文件
  3.在该文件内编写中间件类
  4.配置文件中注册
"""
# 必须要掌握的方法:
    1.process_request
    请求来的时候会从上往下依次执行配置文件中注册了的中间件里面的process_request方法 如果没有则直接跳过
    如果该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据
     # 自定义中间件
    'app01.mymiddleware.mymdd.MyMdd2',
    'app01.mymiddleware.mymdd.MyMdd1'

image-20220524211926494

image-20220524212208348

2、process_response
    响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法 如果没有则直接跳过
    如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据 而不再是视图函数想要返回给客户端的数据

image-20220524213211489

image-20220524213655019

 """如果process_request返回了HttpResponse对象 那么会从当前位置从下往上执行每一个process_response"""

image-20220524214023670

# 需要了解知识
1.process_view
process_view(self, request, view_func, view_args, view_kwargs)
  	路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法
        def process_view(self, request, view_func, view_args, view_kwargs):
        print('view_func',view_func)  # 即将要执行的视图函数名
        print('view_args', view_args)  # 传给视图函数的位置参数
        print('view_kwargs', view_kwargs)  # 关键字参数
        print('自定义中间价from MyMdd2 process_view')

image-20220524215903574

2.process_template_response
'''process_template_response(self, request,response)'''
它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。

   视图函数执行完毕之后返回的对象中含有render属性对应一个render方法,
    则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法
    
 def ab_md(request):
    print('视图函数: ab_md')
    def render():
        return HttpResponse('wuhuwuhu')
    res = HttpResponse('视图函数: ab_md')
    res.render = render
    return res
def process_template_response(self,request, response):
        print('自定义中间件from MyMdd2 process_template_response')
        return response
3.process_exception
process_exception(self, request, exception)
一个HttpRequest对象
一个exception是视图函数异常产生的Exception对象。    
  	视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里面的process_exception
    def process_exception(self, request, exception):
        print(exception)
        print('自定义中间价from MyMdd1 process_exception')
        
def ab_md(request):
    print('视图函数: ab_md')
    jjhaddishf
    def render():
        return HttpResponse('wuhuwuhu')
    res = HttpResponse('视图函数: ab_md')
    res.render = render
    return res

image-20220524221814833

csrf跨站请求伪造

# 前戏
 钓鱼网站:一个模仿正规网站的网址 诱骗用户在该网站上做本应该在正规网站上做的操作,从而获取到该用户在正规网站上的数据甚至是财产
  eg:假设我们需要登录网页完成转账操作
    我们不小心登录到了钓鱼网站 填写了账户 密码 对方账户等信息
    点击转账之后我们账户的钱确实减少了 但是对方账户却变成了一个你从来不认识的人
  原理:将收款人的账号 提前写成犯罪分子的然后隐藏 暴露给用户一个没有name属性的标签写着玩
    
    <p>转账账户:
        <input type="text"></p>
    <p style="display: none">转账账户:
        <input type="text" name="target_user" value="李世文">
    </p>

image-20220524224747147

image-20220524224803515

  • csrf解决措施

# 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>

image-20220524225319604

# ajax请求
	1.方式1:页面任意位置先写{% csrf_token %} 之后获取数据     'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()
  2.方式2:模板语法直接获取
    'csrfmiddlewaretoken':{{ csrf_token }}
"""通用解决方案:js脚本自动处理"""
	也只能适用于ajax提交  form表单还是需要额外指定

图片

posted @ 2022-05-24 23:33  未月  阅读(71)  评论(0编辑  收藏  举报