项目需求:
1.用域名8000向8001发送请求,用django框架解决跨域问题
2.用上自定义中间件配置,支持get、post、put、detele和非简单请求
3.支持版本控制
4.在setting中配置白名单列表,在表中域名可以访问,否则返回错误信息
# 首先8000端口url层设置路由
from django.conf.urls import url from django.contrib import admin from app import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.test), ]
#写test视图函数
from django.views.decorators.cache import cache_page import time from rest_framework.response import Response # 单页面缓存10秒 # @cache_page(10) def test(request): print('三儿来了!') ctime = time.time() return render(request,'index.html',locals())
# 模板层写index模板(这里用到ajax向后台提交数据,需要引入bootstop且在setting中配置)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="/static/jquery-3.3.1.js"></script> <title>Title</title> </head> <body> 不缓存 {{ ctime }} <br> 存在的缓存 {#{% load cache %}#} {#第一个是超时时间,缓存时间。第二个参数是Key值,别名。#} {#{% cache 10 'test' %}#} {# {{ ctime }}#} {#{% endcache %}#} <button id="btn">点我发请求</button> </body> <script> $("#btn").click(function () { $.ajax({ url: 'http://127.0.0.1:8001/v1/publishs/', {#type: 'get',#} type:'post', {#type:'put',#} contentType:'application/json', {#data:JSON.stringify({'name':'egon'}),#} success: function (data) { console.log(data) } }) }) </script> </html>
# ajax提交的路由请求http://127.0.0.1:8001/v1/publishs/
# 由于请求的是V1版本,我们在端口8001路由层中设置版本路由
from django.conf.urls import url from django.contrib import admin from app import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^(?P<version>[v1|v2]+)/publishs/', views.PublishView.as_view()), ]
# 写对应的的函数视图
from rest_framework.views import APIView from rest_framework.versioning import URLPathVersioning from rest_framework.response import Response # 版本控制的局部使用 class PublishView(APIView): # versioning_class = QueryParameterVersioning # 基于url的get传参方法 versioning_class = URLPathVersioning # 基于url的正则方式 def get(self,request,*args,**kwargs): print(request.version) return Response({'status':100}) def post(self,request,*args,**kwargs): print(request.method) return Response({'status': 100, 'msg': 'post'}) def delete(self,request,*args,**kwargs): print(request.method) return Response({'status':100,'msg':'delete'}) def put(self,request,*args,**kwargs): print(request.method) return Response({'status':100,'msg':'put'})
#这个时候写定义中间件
from django.utils.deprecation import MiddlewareMixin from django.conf import settings from rest_framework.response import Response from django.http import JsonResponse class CORSMiddle(MiddlewareMixin): def process_response(self,request,response): # # print(request.META['HTTP_ORIGIN']) host_list = settings.OPEN_HOST host = request.META['HTTP_ORIGIN'] response['Access-Control-Allow-Origin'] = host if request.method == 'OPTIONS': response['Access-Control-Allow-Methods'] = 'PUT,DELETE,POST,GET' response['Access-Control-Allow-Headers'] = 'Content-Type' print(host,host_list) if host not in host_list: # rep = JsonResponse({'msg':'error 非法访问!'}) rep = Response({'msg':'error 非法访问!'}) rep['Access-Control-Allow-Origin'] = host return rep return response
# 自定义中间需要到setting中做配置,且把csrf注销
MIDDLEWARE = [ 'django.middleware.security.SecurityMid' '' 'dleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'app.center.CORSMiddle',# 此为自定义中间件 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
# 后面需要在setting中自定义白名单
OPEN_HOST = ['http://127.0.0.1:8002','http://127.0.0.1:8003']