问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

django怎么解决跨域?

发布网友 发布时间:2024-09-25 18:47

我来回答

1个回答

热心网友 时间:2024-10-19 04:34

导读:很多朋友问到关于django怎么解决跨域的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

什么是跨域、怎么解决跨域?

一个请求url的**协议、端口、域名**其中任意一个与当前页面url不相同就是跨域

即:?(http/https)协议、(segmentfault)主域名、(www)子域名、(8080)端口

是因为浏览器的同源策略的*,同源策略是一种安全策略,同源指的是域名,协议,端口相同,会阻止一个域的js脚本和另一个域的内容进行交互。防止在一个浏览器中的两个页面产生不安全、异常的行为。

当然如果不同源的话会产生一定的*:

【1】无法读取非同源网页的Cookie、LocalStorage和IndexedDB

【2】无法接触非同源网页的DOM

【3】无法向非同源地址发送AJAX请求

document.createElement(‘script’)生成一个script标签,然后插body里而已。

JSONP的实现原理就是创建一个script标签,再把需要请求的api地址放到src里.这个请求只能用GET方法,不可能是POST(向服务端传送数据)。

一种非正式传输协议,它会允许用户传递一个callback参数给服务端,然后服务端返回数据的时候会将这个callback参数作为函数名来包裹住JSON数据,然后客户端就可以随意的定义自己的函数来处理返回的数据了。

一般是后端在处理请求数据的时候,添加允许跨域的请求头信息,服务端设置Access-Control-Allow-Origin就可以,如果需要携带cookie,前后端都需要设置

window对象有个name的属性,在一个window下,窗口载入的页面都是共享一个window.name。

在a.html中,怎么把b.html页面加载进来,获取b.html的数据。在a.html页面使用iframe,可以去获取b.html的数据,然后在a.html页面中取得iframe获取得数据。

但是iframe想要获取b.html中的数据,只需要给这个iframe的src设为就可以,如果a.html想要得到iframe所获得的数据,也就是iframe的window.name的值,还要把这个iframe的src设成跟a.html页面同一个域才可以,不然a.html访问不到iframe里的window.name属性。

//父窗口打开一个子窗口

??varopenWindow=window.open('','title');

//父窗口向子窗口发消息(第一个参数代表发送的内容,第二个参数代表接收消息窗口的url)

??openWindow.postMessage('Nicetomeetyou!','');

调用message事件,监听对方发送的消息

//监听message消息

??window.addEventListener('message',function(e){

??console.log(e.source);//e.source发送消息的窗口

??console.log(e.origin);//e.origin消息发向的网址

??console.log(e.data);?//e.data?发送的消息

??},false);

??server{

??#监听9099端口

??listen9099;

??#域名是localhost

??server_namelocalhost;

??#凡是localhost:9099/api这个样子的,都转发到真正的服务端地址

??location^~/api{

????proxy_pass;

??}??

?}

//请求的时候直接用回前端这边的域名,这就不会跨域,然后Nginx监听到凡是localhost:9099/api这个样子的,都转发到真正的服务端地址

fetch('',{

?method:'POST',

?headers:{

??'Accept':'application/json',

??'Content-Type':'application/json'

?},

?body:JSON.stringify({

??msg:'helloIframePost'

?})

})

django+vue无法设置跨域cookies

后端开发环境:Django3.2.9

前端开发环境:vue3+ts

浏览器版本:chrome(96.0.4664.45)

问题:

最近开发一个新项目,前端使用axios进行http类的封装,前后端分离进行api调试,进行登录后,后续的api调用发现无法识别到cookie。

尝试情况:

1、axios设置withCredentials,无效

2、分析api请求和响应信息,发现响应标头有一段警告信息

3、联想到既然是响应标头出现报警信息,那么可以考虑从django入手。在官网上输入"SAMESITE",果然找到了相关的说明,通过在settings.py设置SESSION_COOKIE_SAMESITE='None'和SESSION_COOKIE_SECURE=True后成功解决问题。

ajax跨域问题(python版本)

跨域问题来源于JavaScript的同源策略,即只有协议+主机名+端口号(如存在)相同,则允许相互访问。即JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。

注意:localhost和127.0.0.1也属于跨域。

如果Origin指定的源不在许可范围内,服务器会返回一个不带有Access-Control-Allow-Origin字段的响应.浏览器解析时发现缺少了这个字段,就会报错.

修改Django中的views.py文件修改views.py中对应API的实现函数,给返回值加上响应头Access-Control-Allow-Origin,允许其他域通过Ajax请求数据:

满足以下两个条件的请求。

(1)请求方法是以下三种方法之一:

(2)HTTP的头信息不超出以下几种字段:

非简单请求就是复杂请求。

非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。

预检请求为OPTIONS请求,用于向服务器请求权限信息的。

预检请求被成功响应后,才会发出真实请求,携带真实数据。

JSONP是JSONwithPadding的略称。它是一个非官方的协议,它允许在服务器端集成Scripttags返回至客户端,通过javascriptcallback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

JSONP的实现步骤大致如下(参考了来源中的文章)

请求时,接口地址是作为构建出的脚本标签的src的,这样,当脚本标签构建出来时,最终的src是接口返回的内容

这时,只要浏览器定义了foo函数,该函数就会立即调用。作为参数的JSON数据被视为JavaScript对象,而不是字符串,因此避免了使用JSON.parse的步骤。

JSONP使用注意

基于JSONP的实现原理,所以JSONP只能是“GET”请求,不能进行较为复杂的POST和其它请求,所以遇到那种情况,就得参考下面的CORS解决跨域了(所以如今它也基本被淘汰了)。

前面讲了JSONP的实现原理,现在我们可以自己写JS来实现JSONP功能。

一般情况下,我们希望这个script标签能够动态的调用,而不是像固定在html里面所以没等页面显示就执行了,很不灵活。

我们可以通过页面的触发事件操作后,通过javascript动态的创建script标签,这样我们就可以灵活调用远程服务。实例如下:

为了更加灵活,上述我们将你自己在客户端定义的回调函数的函数名传送给服务端,服务端则会返回以你定义的回调函数名的方法,将获取的json数据传入这个方法完成回调。

如上,jQuery框架也当然支持JSONP,可以使用$.getJSON(url,[data],[callback])方法。

与js实现的方式相比,我们并不要自己生成一个script标签,客户端也并不需要自己定义一个回调函数.

上述这种方法,很方便,不需要我们自己定义回调函数和指定回调函数名,但是,如果说我们想指定自己的回调函数名,或者说服务上规定了固定回调函数名该怎么办呢?

我们可以使用$.ajax方法来实现。如下例:

在上小节中jsonp:'callbacks'就是定义一个存放回调函数的键,jsonpCallback是前端定义好的回调函数方法名,server端接受callback键对应值后就可以在其中填充数据打包返回。

但是,jsonpCallback参数可以不定义,jquery会自动定义一个随机名发过去,那前端就得用回调函数来处理对应数据了。利用jQuery可以很方便的实现JSONP来进行跨域访问。

如此,我们的跨域处理即完成,支持所有的请求。

解决携带身份信息的跨域请求

![Y$EL]}B8CA)OU{)L6F3WFD.png

axios中这样设置

当前端配置修改后请求跨域就会出现第一步的错误,这时候就需要在服务器端设置了。

(顺带一说,感谢我的后端小伙伴成少在这个寂寞的夜晚陪我搞到深夜)

现在的情况是只有前端同意跨域请求携带cookie了,而后端还没有同意。所以在后台配置中也设置一下就好了。

django中setting.py的配置

[图片上传失败...(image-90d7c0-1556455798141)]

django和vue初次接触

因为要改一些以前的需求,主管让我学习一下vue,花了半天的时间算是入了门,就要拿成熟的项目去改,这个难度还是挺大的.

熟悉网站建设的人应该都知道vue是一个出色的前端框架,而django是python语言体系下的一个后端框架,虽然说他们两个都可以写出完整的网站,但是各有侧重点,django发开速度快,但是本身自带的模板引擎比较孱弱,而vue是以数据驱动和组件化的思想构建,在渲染页面方面实属一流,所以作为python开发者,有时候就会将这个两个框架结合起来,进行网站的开发.

不同的框架是如何结合在一起呢,这就引出了一个前后端分离的思想,后端只提供接口,api,,前端去调用这些接口,来拿数据,再渲染到html模板上

不同框架进行开发时,最大的问题就是跨域,由于框架不同,他们所启用的端口号是不同的,也就是不同的数据源,由于安全性,所以他们之间是不能直接访问的,解除方法是在django的配置文件中引入跨域许可的中间件,用Django的第三方包django-cors-headers来解决跨域问题

这样的话,我们就可以更方便的通过vue的启动方式来进行调试了

最后怎么整合到一起呢?我们知道django是通过指定模板和静态文件的路径来进行渲染的,所以,我们需要将vue文件打包,生成index主页面和静态文件,这样我们就可以把这两个分别放入django默认的文件夹下,或者重新指定路径就可以了.

结语:以上就是首席CTO笔记为大家介绍的关于django怎么解决跨域的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...爱你你是我的罗密欧 , 我愿意变成你的朱丽叶' 谁知 有句歌词是“我爱你你是我的朱丽叶,我愿意变成你的梁山伯”是哪... 为什么打印出来的文档页码和原来的不一样 ...两台电脑用路由器上网一台是W7一台是XP如何实现两台电脑共享文件 win7怎么联另一台电脑win7怎么让网络和另一台电脑共享 w7的系统怎么共享电脑w7系统里面文件怎么共享另一台电脑 共享win7电脑w7系统里面文件怎么共享另一台电脑 翡翠有收藏价值吗,我们玩家如何去投资 价格一两万元的翡翠如何挑选 ppt怎么转换成视频?简单四步法,轻松搞定ppt微课录制 微信附近的人为什么都混乱了 backdoor.Gpigeon.ugu病毒怎清理.. 怎样在微信查找附近100米以内的朋友 ...的人也被全部删除了 我恢复了 却没有了聊天记录,现在开会员还有用... 我用手机财付通快捷支付开通了QQ年费会员,怎么领取不了“年费多彩... ...从我QQ号上删除了,那么跟他的聊天记录能恢复吗? 环行电动车怎么样 QQ聊天记录被删除了,好友也被删除了,聊天记录能恢复吗 环行电动车怎么样,质量还行吗 即将要考教师资格证,身份证丢了,临时身份证暂时不能补,还可以参加 如何在哔哩哔哩下载音频 购买中海优质成长混合最少要多少钱 10月19日中午我在农行买了中海优质成长,问问能买多少份? 请高手评价一下交银精选和中海优质成长两支基金 中海优质成长 ...在机器里删?另外用什么充电方式对机子好,USB还是充电器? 华为手机怎样看经纬度 又岂在朝朝暮暮的意思鹊桥仙纤云弄巧原文及翻译 有米有赞美牛排的诗句 没有赞美牛排的诗句,赞美牛肉(不是牛肉面)的也好... 有哪些清洗苹果的小技巧? ...用手机上网数据就是全外地的然后还都显示100米 如何安全地在家中使用无火香薰灯? 香薰使用技巧 素丫无火香薰怎么使用 大众cc抖动什么原因? 大众CC的气缸排列形式是什么? 大众CC正时链条故障前兆是什么? 嗓子上火吃什么水果 拼多多怎么看关注的人在哪里看呢? 影之刃3职业强度排名 影之刃3魂转职什么好 影之刃3魂转职推荐 影之刃3平民玩什么职业-平民职业选择推荐 我捡到一个魅族手机但是被锁定了怎么解锁 女式皮草上衣怎么搭配下装? 短皮草下身怎么搭配短皮草下身如何搭配 我在一个塑料编织袋厂工作,主要负责切割,长期吸附大量的烟尘,有什么... ...隔壁新搬来的一个厂今天第一天上班做的是编织袋有挺浓的油漆味... 紫砂壶如何鉴定价格 如何从价格和材质来鉴别紫砂壶真假? 紫砂壶怎么鉴定真假