python day59

python day59

cbv加装饰器

cbv加装饰器可以加在类上:
加在类上需要給name属性传一个值

@method_decorator(auth,name='post')
class Tndex(View):
    def get(self,request,*args,**kwargs):
        return HttpResponse('ok')

也可以加在方法上

@method_decorator(auth)
def get(self, request, *args, **kwargs):
    pass

例:

def auth(func):
    def inner(request,*args, **kwargs):
        #登录校验
        if request.session.get('is_login'):
            res = func(*args, **kwargs)
            return res
        else:
            return redirect('/login')

    return inner


from django.views import View

from django.utils.decorators import method_decorator

# @method_decorator(auth,name='post') #给get请求加装饰器
class Index(View):
    @method_decorator(auth)
    def get(self, request, *args, **kwargs):
        return HttpResponse('index')

    def post(self, request, *args, **kwargs):
        return HttpResponse('post_index')

正向代理和反向代理

https://www.cnblogs.com/liuqingzheng/p/10521675.html

中间件介绍和常用内置中间件

django中间件(Middleware):介于request与response处理之间的一道处理过程,在全局上改变django的输入与输出。

django中内置中间件
MIDDLEWARE = [
    # 处理session
    'django.contrib.sessions.middleware.SessionMiddleware',
    # 处理是否带斜杠的
    'django.middleware.common.CommonMiddleware',
    # 跨站请求伪造的处理
    'django.middleware.csrf.CsrfViewMiddleware',
	#主要掌握以上3个
	 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'app01.middleware.MyMiddleware',
]
SessionMiddleware源码中最重要的部分

路径

django.contrib.sessions.middleware.SessionMiddleware
process_request(self, request) # 请求来了
process_response(self, request, response) # 请求走了会触发

自定义中间件

process_request

请求来了触发它,从上往下依次执行(在setting中中间件注册的位置)
def process_request(self, request):
如果返回None,就继续往下走
如果返回四件套之一,直接就回去了

也可以在这里面写请求来了的一些判断

process_response

请求走了,会触发它,从下往上执行。

def process_response(self, request, response):
    print('请求走了0000')
    return response  #一定要return response 

一定要记得return response !!!

process_view(了解)

Django会在调用视图函数之前调用process_view方法。

它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果

def process_view(self, request, view_func, view_args, view_kwargs):
    # view_func 视图函数
    # view_args,  位置参数
    # view_kwargs 关键字参数
    print('我是process view')

    # 如果return None,会执行执行视图函数
    #手动执行了视图函数
    # response=view_func(request,view_args, view_kwargs)
    # 返回response,视图函数就不执行了
    return HttpResponse('ddddd')
process_exception(了解)

这个方法只有在视图函数中出现异常了才执行

    def process_exception(self, request, exception):
        #记录错误日志
        print(exception)
        print('出错了')
process_template_response(了解)

该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法

def process_template_response(self,request,response):
    print('我执行了')
    return response
class Test:
    def __init__(self,status,msg):
        self.status=status
        self.msg=msg
    def render(self):
        import json
        dic={'status':self.status,'msg':self.msg}

        return HttpResponse(json.dumps(dic))
def index(response):
    return Test(True,'测试')

CSRF_TOKEN跨站请求伪造

CSRF或者XSRF是:跨站请求伪造,攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的。

防范CSRF攻击的方式
1、Referer:上一次访问的地址(图片防盗链)https://www.lagou.com/gongsi/
2、在请求地址中添加 token 并验证
3、在 HTTP 头中自定义属性并验证
4、把随机字符串放在请求体中

具体操作请跳转:https://www.cnblogs.com/liuqingzheng/p/9505044.html

django中处理csrf

form表单

<form action="" method="post">
    {% csrf_token %}
    <p>给谁转:<input type="text" name="to_user" id="id_name"></p>
    <p>转多少:<input type="text" name="money" id="id_money"></p>
    <input type="submit" value="转账">

</form>

ajax提交有两种方案

       $.ajax({
            url: '/transfer/',
            method: 'post',
            //data: {to_user: $('#id_name').val(), money: $('#id_money').val(),csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()},
            data: {to_user: $('#id_name').val(), money: $('#id_money').val(),csrfmiddlewaretoken:'{{csrf_token}}'},
            success: function (data) {
                console.log(data)

            }
        })

cookie的处理

是一个字符串,可以自己用js切割,也可以用jquery的插件

使用插件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="/static/jquery-3.3.1.js"></script>
    <script src="/static/jquery.cookie.js"></script>
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="text" name="password" id="pwd"></p>
    <p><input type="submit"></p>
</form>
<button class="btn">点我</button>
</body>
<script>
    $(".btn").click(function () {
        var token=$.cookie('csrftoken')
        //var token='{{ csrf_token }}'
        $.ajax({
            url: '',
            headers:{'X-CSRFToken':token},
            type: 'post',
            data: {
                'name': $('[name="name"]').val(),
                'password': $("#pwd").val(),
            },
            success: function (data) {
                console.log(data)
            }

        })
    })
</script>
</html>
csrf放到请求头中
 $.ajax({
            url: '',
            headers:{'X-CSRFToken':token},
            type: 'post',
            data: {
                'name': $('[name="name"]').val(),
                'password': $("#pwd").val(),
            },
            success: function (data) {
                console.log(data)
            }

        })
全局使用csrf,局部视图函数禁用csrf

在视图函数上加装饰器

from django.views.decorators.csrf import csrf_exempt,csrf_protect
# 不再检测,局部禁用(前提是全站使用)
# @csrf_exempt
# 检测,局部使用(前提是全站禁用)
@csrf_protect
def csrf_token(request):
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值