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包含协议.网址.端口,任何一种不同都是跨域请求. ...
随机推荐
- 【Leetcode_easy】1033. Moving Stones Until Consecutive
problem 1033. Moving Stones Until Consecutive 参考 1. Leetcode_easy_1033. Moving Stones Until Consecut ...
- CSS网站框架及样式命名规范
CSS网站框架 复位:reset.css 基础:base.css 或 basic.css (字体大小.颜色.背景.行高.列表样式.按钮样式.表格样式等等) 布局:layout.css (非结构的布局) ...
- RabbitMQ官方教程一Hello World(GOLANG语言实现)
介绍 RabbitMQ是消息中间件:它接受并转发消息. 您可以将其视为邮局系统:将要发送的邮件放在邮箱中时, 可以确保邮递员最终将邮件传递给收件人. 以此类推,RabbitMQ是一个邮箱,一个邮局和一 ...
- idm技术下载百度网盘
原使用教程:https://www.haorenka.org/idm.html 使用idm下载器后实际下载速度,比原网盘客户端快很多 相关软件下载 参考上面的参考教程,这里只提供对应所需要的文件,有的 ...
- Asp.Net Core中完成拒绝访问功能
很多时候如果用户没有某个菜单的操作权限的话在页面是不应该显示出来的. @if (SignInManager.IsSignedIn(User) && User.IsInRole(&quo ...
- cnbolgs博客中添加Latex支持
参考:http://www.cnblogs.com/ilogic/archive/2012/08/05/latex.html 主要是利用在线生成公式的工具:MathJax,但要在博客上获得 MathJ ...
- kafka原理分析
#kafka为什么有高吞吐量 1 由于接收数据时可以设置request.required.acks参数,一般设定为1或者0,即生产者发送消息0代表不关心kafka是否接收成功,也就是关闭ack:1代表 ...
- gensim中word2vec
from gensim.models import Word2Vec Word2Vec(self, sentences=None, size=100, alpha=0.025, window=5, m ...
- [#] - .Net平台的实时性能监控
App Metricshttps://www.app-metrics.io ASP.NET Core之跨平台的实时性能监控http://www.cnblogs.com/GuZhenYin/p/7170 ...
- 剑指offer54:字符流中第一个不重复的字符
1 题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中 ...