项目需求:

  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']

最新文章

  1. phpexcel读取excel的xls xlsx csv格式
  2. Core Data的一些常见用法
  3. Slackware Linux or FreeBSD 配置中文环境。
  4. 手动关闭searchDisplayControlelr
  5. Jmeter 中使用非GUI启动进行压力测试
  6. --Dirring love 音乐(01背包问题)
  7. ViewPager 基本方式加载view
  8. PHPCMS V9实现硬件地址MAC绑定访问技术实现
  9. Stateless Iterators
  10. QT-【转】2D编程
  11. eclipse中svn插件的安装
  12. Python新手学习基础之函数-lambda函数
  13. 手贱随手在Linux敲了 as 命令,出不来了
  14. C# 反射相关的东西
  15. 苹果iPhone X上搭载的那颗A11仿生芯片,到底牛在哪?
  16. Android 视频展示控件之 SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 对比总结
  17. 移动端video不全屏播放
  18. Saiku Table展示数据合并bug修复(二十五)
  19. 20175234 2018-2019-2 《Java程序设计》第八周学习总结
  20. datatables日常使用集合

热门文章

  1. 如何修改WAMPServer默认的网站路径地址
  2. 【Leetcode_easy】874. Walking Robot Simulation
  3. 05点睛Spring MVC 4.1-服务器端推送
  4. LeetCode 378. 有序矩阵中第K小的元素(Kth Smallest Element in a Sorted Matrix) 13
  5. springmvc流程 struts2 spring Hibernate 优缺点 使用场景介绍
  6. (一)PlantUML 语法之时序图
  7. vim常用命令的使用
  8. Spring Boot的配置文件-yml文件的集合配置方式
  9. Hi3531a海思logo加载的实现流程
  10. hdu 6625 three array (01-trie)