项目需求:

  1.用域名8000向8001发送请求,用django框架解决跨域问题

  2.用上自定义中间件配置,支持get、post、put、detele和非简单请求

  3.支持版本控制

  4.在setting中配置白名单列表,在表中域名可以访问,否则返回错误信息

# 首先8000端口url层设置路由

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app import views
  4.  
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. url(r'^index/', views.test),
  8. ]

#写test视图函数

  1. from django.views.decorators.cache import cache_page
  2. import time
  3. from rest_framework.response import Response
  4. # 单页面缓存10秒
  5. # @cache_page(10)
  6. def test(request):
  7. print('三儿来了!')
  8. ctime = time.time()
  9.  
  10. return render(request,'index.html',locals())

# 模板层写index模板(这里用到ajax向后台提交数据,需要引入bootstop且在setting中配置)

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <script src="/static/jquery-3.3.1.js"></script>
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. 不缓存
  10. {{ ctime }}
  11. <br>
  12. 存在的缓存
  13. {#{% load cache %}#}
  14. {#第一个是超时时间,缓存时间。第二个参数是Key值,别名。#}
  15. {#{% cache 10 'test' %}#}
  16. {# {{ ctime }}#}
  17. {#{% endcache %}#}
  18. <button id="btn">点我发请求</button>
  19.  
  20. </body>
  21. <script>
  22. $("#btn").click(function () {
  23. $.ajax({
  24. url: 'http://127.0.0.1:8001/v1/publishs/',
  25. {#type: 'get',#}
  26. type:'post',
  27. {#type:'put',#}
  28. contentType:'application/json',
  29. {#data:JSON.stringify({'name':'egon'}),#}
  30. success: function (data) {
  31. console.log(data)
  32. }
  33. })
  34. })
  35.  
  36. </script>
  37. </html>

# ajax提交的路由请求http://127.0.0.1:8001/v1/publishs/

# 由于请求的是V1版本,我们在端口8001路由层中设置版本路由

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app import views
  4. urlpatterns = [
  5. url(r'^admin/', admin.site.urls),
  6. url(r'^(?P<version>[v1|v2]+)/publishs/', views.PublishView.as_view()),
  7.  
  8. ]

# 写对应的的函数视图

  1. from rest_framework.views import APIView
  2. from rest_framework.versioning import URLPathVersioning
  3. from rest_framework.response import Response
  4.  
  5. # 版本控制的局部使用
  6. class PublishView(APIView):
  7. # versioning_class = QueryParameterVersioning # 基于url的get传参方法
  8. versioning_class = URLPathVersioning # 基于url的正则方式
  9.  
  10. def get(self,request,*args,**kwargs):
  11. print(request.version)
  12. return Response({'status':100})
  13.  
  14. def post(self,request,*args,**kwargs):
  15. print(request.method)
  16. return Response({'status': 100, 'msg': 'post'})
  17.  
  18. def delete(self,request,*args,**kwargs):
  19. print(request.method)
  20. return Response({'status':100,'msg':'delete'})
  21.  
  22. def put(self,request,*args,**kwargs):
  23. print(request.method)
  24. return Response({'status':100,'msg':'put'})

#这个时候写定义中间件

  1. from django.utils.deprecation import MiddlewareMixin
  2. from django.conf import settings
  3. from rest_framework.response import Response
  4. from django.http import JsonResponse
  5.  
  6. class CORSMiddle(MiddlewareMixin):
  7. def process_response(self,request,response):
  8. #
  9. # print(request.META['HTTP_ORIGIN'])
  10. host_list = settings.OPEN_HOST
  11. host = request.META['HTTP_ORIGIN']
  12.  
  13. response['Access-Control-Allow-Origin'] = host
  14. if request.method == 'OPTIONS':
  15. response['Access-Control-Allow-Methods'] = 'PUT,DELETE,POST,GET'
  16. response['Access-Control-Allow-Headers'] = 'Content-Type'
  17.  
  18. print(host,host_list)
  19. if host not in host_list:
  20. # rep = JsonResponse({'msg':'error 非法访问!'})
  21. rep = Response({'msg':'error 非法访问!'})
  22. rep['Access-Control-Allow-Origin'] = host
  23. return rep
  24. return response

# 自定义中间需要到setting中做配置,且把csrf注销

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMid'
  3. ''
  4. 'dleware',
  5. 'django.contrib.sessions.middleware.SessionMiddleware',
  6. 'django.middleware.common.CommonMiddleware',
  7. # 'django.middleware.csrf.CsrfViewMiddleware',
  8. 'app.center.CORSMiddle',# 此为自定义中间件
  9. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  10. 'django.contrib.messages.middleware.MessageMiddleware',
  11. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  12. ]

# 后面需要在setting中自定义白名单

  1. OPEN_HOST = ['http://127.0.0.1:8002','http://127.0.0.1:8003']

Django drf:手撸自定义跨域的更多相关文章

  1. Django框架12 /同源、跨域、CORS

    Django框架12 /同源.跨域.CORS 目录 Django框架12 /同源.跨域.CORS 1. 同源策略 2. 跨域 3. 解决跨域:CORS/跨域资源共享 1. 同源策略 同源策略(Same ...

  2. Django提供后台接口的跨域问题

    --> Django跨域 当使用Django仅用来开发后端接口,为前端提供JSON数据的时候,不可避免的要接受前端的POST请求.虽然Django以其强大易用的特定使用很广泛,但在跨域问题上却让 ...

  3. 解决Django Rest Framework中的跨域问题

    方案一: 全局配置 自定义中间件 # my_md.py class MiddlewareMixin(object): def __init__(self, get_response=None): se ...

  4. django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)

    OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法.通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源.可以说这是 ...

  5. django中同源策略和跨域解决方案

    一  同源策略 1.1何谓同源? 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同 ...

  6. Asp.net之实现自定义跨域

    跨域是指在浏览器的同源策略下导致前端和接口部署在不同域下导致无法直接访问的问题. 针对跨域有多种解决方案常见的有: JSNOP: 可参考Jquery实现,缺点是需要后端支持:   Access-Con ...

  7. django中的缓存以及跨域

    django中的缓存 先来了解以下问题

  8. 手机端-ajax跨域请求滚屏分页

    近期做了一个关于信息展示的详情页面,将里面能够提升用户体验的小点写出来 1.当页面请求新的数据,或上传数据的时候 放一个loading.gif的过渡,告诉用户 你的操作已经完成,正在加载中 2.当所有 ...

  9. Django中使用CORS实现跨域请求(转)

    原文:https://blog.csdn.net/zizle_lin/article/details/81381322 跨域请求: ​    请求url包含协议.网址.端口,任何一种不同都是跨域请求. ...

随机推荐

  1. 修改ecshop的70种技巧

    1.如何修改网站”欢迎惠临本店”答复(dafu):languages\zh_cn\common.php文件中,$_LANG['welcome']=’欢迎惠临本店’:将他修改成你需要的字样. 2.如何修 ...

  2. CentOS6安装MySQL开启远程登录

    Centos6安装MySQL 检测下系统有没有自带的mysql:yum list installed | grep mysql 如果已经有的话执行命令 yum -y remove mysql-libs ...

  3. 解决ubuntu的firefox上网速度慢【转】

    在ubuntu上用firefox上网十分慢,但是在切换了chrome后发现上网速度很快,是解析域名上出现了问题,所以要为FF设置DNS缓存以提高速度.(在WIN下这个是自动设置好的,在ubuntu下需 ...

  4. 使用 LVS 实现负载均衡原理及安装配置详解(课堂随笔)

    一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(r ...

  5. jira7.3.6 linux安装及破解

    一.环境准备 jira7.3的运行是依赖java环境的,也就是说需要安装jdk并且要是1.8以上版本,如下: http://www.oracle.com/technetwork/java/javase ...

  6. idea导入eclipse包乱码问题全局解决方案:

    IJ导入eclipse包乱码问题: 全局解决方案: 设置所在文件夹位置 1.从eclipse导入方式,发现还是乱码 2.导航栏点击文件->设置->editor->文件编码 将所在文件 ...

  7. Word 查找替换高级玩法系列之 -- 通配符大全A篇

    1. 通配符大全一览 序号 特殊字符(不使用通配符) 代码(不使用通配符) 特殊字符(使用通配符) 代码(使用通配符) 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^### 任意数字(单个 ...

  8. Python33之类和对象(继承)

    一.继承的概念及使用方法 在Python中一个类如果想使用前面一个类所有的方法和属性就需要使用继承 继承的定义     def Class_Child(Class_parent) 这样就可以在子类中使 ...

  9. 题解 Luogu P1110 【[ZJOI2007]报表统计】

    感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...

  10. PAT甲级 Dijkstra 相关题_C++题解

    Dijkstra PAT (Advanced Level) Practice Dijkstra 相关题 目录 <算法笔记>重点摘要 1003 Emergency (25) <算法笔记 ...