Django drf:手撸自定义跨域
项目需求:
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']
Django drf:手撸自定义跨域的更多相关文章
- Django框架12 /同源、跨域、CORS
Django框架12 /同源.跨域.CORS 目录 Django框架12 /同源.跨域.CORS 1. 同源策略 2. 跨域 3. 解决跨域:CORS/跨域资源共享 1. 同源策略 同源策略(Same ...
- Django提供后台接口的跨域问题
--> Django跨域 当使用Django仅用来开发后端接口,为前端提供JSON数据的时候,不可避免的要接受前端的POST请求.虽然Django以其强大易用的特定使用很广泛,但在跨域问题上却让 ...
- 解决Django Rest Framework中的跨域问题
方案一: 全局配置 自定义中间件 # my_md.py class MiddlewareMixin(object): def __init__(self, get_response=None): se ...
- django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)
OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法.通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源.可以说这是 ...
- django中同源策略和跨域解决方案
一 同源策略 1.1何谓同源? 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同 ...
- Asp.net之实现自定义跨域
跨域是指在浏览器的同源策略下导致前端和接口部署在不同域下导致无法直接访问的问题. 针对跨域有多种解决方案常见的有: JSNOP: 可参考Jquery实现,缺点是需要后端支持: Access-Con ...
- django中的缓存以及跨域
django中的缓存 先来了解以下问题
- 手机端-ajax跨域请求滚屏分页
近期做了一个关于信息展示的详情页面,将里面能够提升用户体验的小点写出来 1.当页面请求新的数据,或上传数据的时候 放一个loading.gif的过渡,告诉用户 你的操作已经完成,正在加载中 2.当所有 ...
- Django中使用CORS实现跨域请求(转)
原文:https://blog.csdn.net/zizle_lin/article/details/81381322 跨域请求: 请求url包含协议.网址.端口,任何一种不同都是跨域请求. ...
随机推荐
- Python3之内建模块base64
Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...
- JavaScript图形实例:图形的扇形变换和环形变换
1.1 扇形变换 将如图1所示的上边长方形的图形变换为下边的扇形图形的变换称为扇形变换. 设长方形图形中任一点P1(X1,Y1)变换为扇形图形上的点P2(X2,Y2),长方形的长为X,扇形圆心坐标为 ...
- 伸缩布局 Flex
其中在webkit内核的浏览器中使用时,必须加上-webkit-前缀,采用Flex布局的元素,称为Flex容器(flex container),简称”容器”.它的所有子元素自动成为容器成员,称为Fle ...
- 修改 ubuntu NTFS 文件系统下没有执行权限的问题
由于NTFS本身的特殊性,不能对其分区的文件权限进行修改,无论是sudo还是root都没有用. 安装以下两个插件解决问题: sudo apt-get install ntfs-3g //这个12.04 ...
- 汉字转拼音js工具:
/ JavaScript Document var PinYin = { "a": "\u554a\u963f\u9515", "ai": ...
- [转帖]时序数据库技术体系 – InfluxDB TSM存储引擎之数据写入
时序数据库技术体系 – InfluxDB TSM存储引擎之数据写入 http://hbasefly.com/2018/03/27/timeseries-database-6/ 2018年3月27日 ...
- K8S从入门到放弃系列-(13)Kubernetes集群mertics-server部署
集群部署好后,如果我们想知道集群中每个节点及节点上的pod资源使用情况,命令行下可以直接使用kubectl top node/pod来查看资源使用情况,默认此命令不能正常使用,需要我们部署对应api资 ...
- Word 查找替换高级玩法系列之 -- 通配符大全A篇
1. 通配符大全一览 序号 特殊字符(不使用通配符) 代码(不使用通配符) 特殊字符(使用通配符) 代码(使用通配符) 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^### 任意数字(单个 ...
- xml文件中引用网址报红色如何解决
用了ideal的宝宝们一定遇到过配置文件网址报红的错误吧 其实解决很简单,就是网不好导致它没法补全,我们手动给他补全就好啦 复制报红的网址 点击File==>settings==>lang ...
- java.lang.AbstractMethodError: null
在使用springcloud的时候运行报这个错,原因是版本冲突导致的,在idea中创建springcloud项目的时候,这里默认是${spring-cloud.version},但是如果你使用的是高版 ...