• 限制访问次数例子和Ajax的some


    -- 限制访问次数作业解答  --
    -- urls.py 里-- 
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/', views.index),]
    
    -- views.py 里-- 
    from django.shortcuts import render, HttpResponse
    def index(request):
        return HttpResponse('index')
    
    -- 代码写在哪里? 限制次数 --
    新建文件夹 middleware --> my_middleware.py里
    在 settings.py 里注册中间件  'middleware.my_middleware.Throttle'
    导入类
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    import time
    
    visit_dict = {}  
    -- 普通版 -- 
    class Throttle(MiddlewareMixin):  节流器
            def process_request(self, request):
            ip = request.META.get('REMOTE_ADDR')
            now = time.time()
            # 获取访问的记录
            history = visit_dict.get(ip, [])
            # 根据记录进行判断  [ 10:06:05,10:06:09,10:06:45 ]  
            new = []
            for i in history:
                if now - i < 5:
                    new.append(i)
            history = new
            if len(history) >= 3:
                return HttpResponse('访问频率太快了,你先歇一会')
            history.append(now)
            visit_dict[ip] = history
    
    -- 优化版--
        def process_request(self, request):
            ip = request.META.get('REMOTE_ADDR')
            now = time.time()
            # 获取访问的记录
            history = visit_dict.get(ip, [])
            # 根据记录进行判断  [ 10:06:45,10:06:09,10:06:05, ]  
            while history and now - history[-1] > 5:
                history.pop()  #删除最后一个
            if len(history) >= 3:
                return HttpResponse('访问频率太快了,你先歇一会')
            history.insert(0, now)
            visit_dict[ip] = history
    -- session 版 --   一个浏览器就是一个用户
        def process_request(self, request):
            now = time.time()  #拿到当前时间
            # 获取访问的记录
            history = request.session.get('history', [])
            # 根据记录进行判断  [ 10:06:45,10:06:09,10:06:05, ]  
            while history and now - history[-1] > 5:
                history.pop()
            if len(history) >= 3:
                return HttpResponse('访问频率太快了,你先歇一会')
            history.insert(0, now)  
            request.session['history'] = history
    数据库没表 python manage.py migrate  数据库迁移命令
    django_session表  一个浏览器就是一个记录


    -- html -- ajax参数的问题 $.ajax({ url: '/ajax_test/', 提交地址 type: 'get', 类型 data: { 数据 name: 'alex', 键值对 age: 73, hobby: JSON.stringify(['大保健', 'cnb', '画大饼']) }, success: function (res) { 回调函数 console.log(res) }, error: function (res) { 错误 console.log(res) } }) -- views.py -- from django.conf import global_settings import json from django.http import JsonResponse def ajax_test(request): print(request.POST) hobby = request.POST.get('hobby') # 拿到字符串的东西 hobby = json.loads(hobby) # 反序列化 print(hobby, type(hobby)) # 列表 list # return HttpResponse(json.dumps({'xxx':'xxxx'})) # text/html; charset=utf-8 return JsonResponse({'xxx': 'xxxx'}) # content_type: application/json' # return JsonResponse([],safe=False) # content_type: application/json' 复制代码

    上传文件 upload

    -- html --
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="" enctype="multipart/form-data"></form>
    **<form action="" enctype="application/x-www-form-urlencoded"></form>** 删除这行
    <input type="file" id="f1">
    <button id="b1">上传</button>
    
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <script>
        $('#b1').click(function () {
            var form_obj = new FormData();  #组建FormData对象
            form_obj.append('x1', $('#f1')[0].files[0]);   #jQuery对象到DOM对象--键,值
            $.ajax({
                url: '/upload/',
                type: 'post',
                data: form_obj,
                processData:false,   #注意  不处理编码方式
                contentType:false,   #注意  不处理请求头
                success: function (res) {
                    alert('OK')
                }
            })
        })
    </script>
    </body>
    </html>
    
    -- views.py --  此时注释csrf中间件
    def upload(request):
        if request.is_ajax():  #是的话就返回True
            file_obj = request.FILES.get('x1')
            with open(file_obj.name, 'wb') as f:
                for i in file_obj.chunks():
                    f.write(i)
            return HttpResponse('ok')
        return render(request, 'upload.html')

    csrf 校验

    -- 发 ajax 能提交 post 请求 -- 
      保证有cookie
    
    {% csrf_token %} 两个作用:一个是隐藏的标签,另一个检查里能看到cookie了
    方法一:
    $.ajax({
        url: '/calc/',
        type: 'post',
        data: {        csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() ,   #属性选择器
            i1: $('[name="i1"]').val(),
            i2: $('[name="i2"]').val(),
        },
        success: function (res) {
            $('[name="i3"]').val(res)
        }
    })
    方法二:
    装饰器
    from django.views.decorators.csrf import ensure_csrf_cookie   #确保访问某个视图有csrf_cookie 
    @ensure_csrf_cookie
    def func(request):
        pass
    设置请求头
    $('#b2').click(function () {
        $.ajax({
            url: '/calc2/',
            type: 'post',
            headers:{
               'X-csrftoken': $('[name="csrfmiddlewaretoken"]').val(),
            }, 
            data: {
                i1: $('[name="ii1"]').val(),
                i2: $('[name="ii2"]').val(),
            },
            success: function (res) {
                $('[name="ii3"]').val(res)
            }
        })
    });
    推荐以后的用法 -- 引入静态文件,配置静态文件  --批量操作
    static --> js -->ajax_setup.js
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    var csrftoken = getCookie('csrftoken');
    function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }      #正则表达式 匹配
    $.ajaxSetup({
        beforeSend: function (xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            }
        }
    });
    页面引用 
    <script src="/static/js/ajax_setup.js"></script>
    这样每个ajax都可以发送post请求了
  • 相关阅读:
    Path类的最全面具体解释
    数据挖掘之分类算法---knn算法(有matlab样例)
    Android View框架的measure机制
    2017年本博客知识体系引导(更新至2017.8.11)
    [DevExpress]DevExpress 中 汉化包 汉化方法
    盗墓笔记第一季全(12集)下载地址
    浅谈spring——注解配置(九)
    git使用系列(一)
    算法与数据结构(一)
    phpstrom 2016.2 注册服务器地址
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10385086.html
Copyright © 2020-2023  润新知