目录
一、跨域请求
二、频率访问限制
一 、同一个域下的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


