• day103 跨域请求 与频率访问限制.


    目录

    一、跨域请求

    二、频率访问限制 

    一 、同一个域下的ajax请求访问 

    url文件

    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),
        url(r"^books/",views.books),
    ]
    

      

    views

    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    def  index(request):
        return render(request,"index.html")
    
    def books(request):
    
        import json
        book_list =["西游记","水浒传","金瓶"]
    
        return HttpResponse(json.dumps(book_list,ensure_ascii=False))

     html index文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
    
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    
    </head>
    <body>
    
    <button class="btn">click</button>
    
    <p>书籍列表:</p>
    
    <p class="book_list"></p>
    <script>
        $(".btn").click(function () {
            $.ajax({
                url:"/books/",
                success:function (data) {
                    $(".book_list").append(data)
                }
    
    
            })
            
        })
    
    </script>
    
    </body>
    </html>

     结果为 

     

    第二个域的views文件为:

    # Create your views here.
    def books(request):
        import json
        book_list =["西游记","水浒传","金瓶"]
    
        HttpResponse(json.dumps(book_list,ensure_ascii=False))
     

     二、跨域访问

    将 ajax的访问路径做更改

     输出结果为:

     

     解决办法 在第二个项目的view文件里做如下更改

    # Create your views here.
    def books(request):
        import json
        book_list =["西游记","水浒传","金瓶"]
    
        # return HttpResponse(json.dumps(book_list,ensure_ascii=False))
        obj =HttpResponse(json.dumps(book_list,ensure_ascii=False))
        obj["Access-Control-Allow-Origin"] ="http://127.0.0.1:8000"
        return obj

     打印结果:

     预检

     

    ajax请求代码

     

    二、频率访问限制

     viewS文件 

    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    from app01 import models
    from rest_framework.views import APIView
    from rest_framework.serializers import ModelSerializer
    from rest_framework.viewsets import ModelViewSet
    from django.views import  View
    
    
    # 序列化组件
    class BookModelSerializers(ModelSerializer):
        class Meta:
            model =models.Book
            fields ="__all__"
    
    class PublishModelSeralizers(ModelSerializer):
        class Meta:
            models=models.Publish
            fields ="__all__"
    
    class AuthorModelSeralizers(ModelSerializer):
        class Meta:
            models =models.Author
            fields ="__all__"
    
    
    # 频率访问组件
    from rest_framework.throttling import BaseThrottle
    class VisitThrottle(BaseThrottle):
        def allow_request(self,request,view):
            return  False
    
    
    class BooksModeView(ModelViewSet):
    
        throttle_classes = [VisitThrottle]
        queryset = models.Book.objects.all()
        serializer_class = BookModelSerializers
    

      

     

    案例 每隔10秒最多访问3次 

    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    from app01 import models
    from rest_framework.views import APIView
    from rest_framework.serializers import ModelSerializer
    from rest_framework.viewsets import ModelViewSet
    
    
    # 序列化组件
    class BookModelSerializers(ModelSerializer):
        class Meta:
            model =models.Book
            fields ="__all__"
    
    class PublishModelSeralizers(ModelSerializer):
        class Meta:
            models=models.Publish
            fields ="__all__"
    
    class AuthorModelSeralizers(ModelSerializer):
        class Meta:
            models =models.Author
            fields ="__all__"
    
    
    # 频率访问组件
    from rest_framework.throttling import BaseThrottle
    
    VISIT_RECORD={}
    class VisitThrottle(BaseThrottle):
    
        def __init__(self):
            self.history =[]
    
        def allow_request(self,request,view):
            remote_addr =request.META.get("REMOTE_ADDR")
            print(remote_addr)
            print(self.get_ident(request))
    
            import time
            ctime =time.time()
            #IP 第一次访问
            if remote_addr not in VISIT_RECORD:
                VISIT_RECORD[remote_addr] = [ctime,]
                return True
    
            #查去当前访问IP的访问历史记录
            history =VISIT_RECORD.get(remote_addr)
            self.history =history
            print(self.history)
    
            if history and ctime - history[-1] > 10:
                history.pop()
    
            if len(history)<3:
                history.insert(0,ctime)  #索引第一位开始插入
                return True
            else:
                return  False
    
    #显示剩余多少时间可以继续访问
        def wait(self):
            import time
            ctime = time.time()
            return 10 - (ctime - self.history[-1])
    
    
    class BooksModeView(ModelViewSet):
    
        throttle_classes = [VisitThrottle,]
        queryset = models.Book.objects.all()
        serializer_class = BookModelSerializers
    

      

  • 相关阅读:
    浅谈MVC架构模式
    用JSP实现学生查询
    读cookie中文字符乱码问题
    span 换行与不换行
    SAP HANA中的Synonym使用及demo 沧海
    SAP HANA HDB序列的使用方法及技巧(SAP HANA HDB SEQUENCE ) 沧海
    SAP HANA中创建与时间相关的数据及Time Attribute View(Fiscal) 沧海
    SAP HANA中创建与时间相关的数据及Time Attribute View(Gregorian) 沧海
    SAP HANA如何在存储过程中使用自定义的table type 沧海
    SAP HANA SQL执行计划(SAP HANA SQL explain plan)(SQL 优化分析) 沧海
  • 原文地址:https://www.cnblogs.com/mengbin0546/p/9259377.html
Copyright © 2020-2023  润新知