电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

關(guān)于python 跨域處理方式詳解

瀏覽:9日期:2022-07-31 18:02:37

因為瀏覽器的同源策略限制,不是同源的腳本不能操作其他源下面的資源,想操作另一個源下面的資源就屬于跨域了,這里說的跨域是廣義跨域,我們常說的代碼中請求跨域,是狹義的跨域,即在腳本代碼中向非同源域發(fā)送http請求

瀏覽器的同源策略(SOP/same origin policy)是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS(跨站腳本攻擊 cross site scripting)和CSRF(跨站請求偽造cross-site request forgery)等攻擊。

(同源 origin:協(xié)議,域名,端口號,不清楚的話,直接在瀏覽器控制臺中輸入window.location.origin看看返回值就知道了。)

下面兩種情況,是不受跨域限制的,嚴格來講,這兩種情況只是跨站資源請求:

1)頁面中的鏈接,重定向及表單提交是不受同源策略限制的

2)跨域資源的引入,如<script src='http://www.hdgsjgj.cn/bcjs/20174.html'> <image src='http://www.hdgsjgj.cn/bcjs/20174.html'> <iframe>等

從上面的第二種情況,我們可以發(fā)現(xiàn),但凡通過src去獲取非同源狀態(tài)的資源時,都是不受跨域限制的,那我們就可以想想,是否可以借助這種跨站資源請求的方式來實現(xiàn)http跨域請求呢?這就是我們接下來要說的第一種跨域解決方案:jsonp

1、JSONP(不僅限于python,所有的GET請求都可以使用jsonp實現(xiàn)跨域)

1)實現(xiàn)原理:

從上面的分析我們已經(jīng)知道,web頁面上請求跨站資源請求是不會受到同源策略限制的,所有我們會想,我們可不可以在服務(wù)器上想辦法把web端需要的數(shù)據(jù)裝進一個js文件里面,然后讓web端直接訪問這個js文件,從而獲取需要的數(shù)據(jù)呢?恰巧我們知道有一種叫做json的數(shù)據(jù)格式,且js原生支持,所以web端就可以通過像訪問js腳本一樣的方式,來調(diào)用跨域服務(wù)器上動態(tài)生成的js文件。

為了便于客戶端使用數(shù)據(jù),逐漸形成一種非正式傳輸協(xié)議:JSONP。JSONP的一個要點就是,傳給服務(wù)器一個callback參數(shù),然后服務(wù)器返回數(shù)據(jù)時,將這個callback參數(shù)作為函數(shù)名來包裹住json數(shù)據(jù)

2)jsonp實例

在遠程服務(wù)器上新建一個remote.js文件:

HandleRemote({'title':'哈哈', 'name':'我是一個測試數(shù)據(jù)哦!'})

在本地新建html文件:

function HandleRemote(data){console.log(data.title+data.name);}<script type='text/javascript' src='http://www.hdgsjgj.cn/bcjs/遠程服務(wù)器地址/remote.js'>

運行本地文件,在瀏覽器的控制臺可以看到 哈哈我是一個測試數(shù)據(jù)哦! 的輸出

到現(xiàn)在我們已經(jīng)實現(xiàn)了去服務(wù)器上獲取數(shù)據(jù),剩下還有兩個問題需要我們思考:

a、我們?nèi)绾巫屵h程服務(wù)器知道他要調(diào)用的本地函數(shù)回調(diào)函數(shù)的名字是什么?

b、我們?nèi)绾卧谶h程服務(wù)器上動態(tài)生成js腳本

有了思路就很好辦了,先看第一個問題:

我們?nèi)绾巫尫?wù)器知道我們本地的回調(diào)函數(shù)名?告訴他就行了啊,在請求中加上我們的函數(shù)名,然后讓遠程服務(wù)器根據(jù)我們的參數(shù)取動態(tài)生成js腳本調(diào)用函數(shù)名即可!

前端實現(xiàn)

var url = 'http://test.com/getRemoteDate?callback=HandleRemote'var script = document.createElement('script');script.setAttribute('src', url)document.getElementByTagName('head')[0].appendChild(script);

最后將上面的代碼封裝成通用的ajax形式:

url = 'http://test.com/getRemoteDate/';$.ajax({url:url,type:'GET',dataType:'JSONP',jsonp:'callback', #將會作為參數(shù)傳給服務(wù)器,用于獲得回調(diào)函數(shù)的參數(shù)名jsonCallback:'test', # 自定義的jsonp的回調(diào)函數(shù)參數(shù)名,默認為jQuery自動生成的函數(shù)名,也可以自定義,jQuery會自動為你處理的。success:function(data){此處data即為返回的json數(shù)據(jù)了,前端根據(jù)需要自行處理} });

服務(wù)端代碼 :

def getData():return {'title':'哈哈', 'name':'這又是一個測試數(shù)據(jù)哦!'}def getRemote(request):funcName = request.GET.get('callback')result = getData()# 將結(jié)果以json形式返回,與前端的jsonp交互return funcName+'('+json.dumps(result)+')'

配置url:

url(r'^getRemoteData/$', getRemote)

到這里,jsonp就完成了,雖然jsonp不受同源策略的限制,但是jsonp有個問題,就是它只支持GET請求,其他請求不支持。

2、在響應頭加上響應的允許跨域的參數(shù),告訴瀏覽器當前請求被服務(wù)器接受,這種跨域方式也是通用的。

3、python Django中最常用的另一種處理跨域的方式:

使用Django提供的 Django-cors-headers 來處理跨域

從GitHub上面下載Django-cors-headers

pip install Django-cors-headers.zip

在settings.py中的中間件中配置 【’corsheaders.middleware.CorsMiddleware’,】記得這個中間件一定要寫在CSRF之前,為了方便處理,一般寫在最前面

設(shè)置 CORS_ORIGIN_ALLOW_ALL = True,即允許所有的跨域請求,當然,這里也可以設(shè)置為False,然后配合 CORS_ORIGIN_WHITELIST 白名單來使用

如此,我們的跨域處理即完成,支持所有的請求。

補充知識:python WSGI 解決跨域問題

import jsonfrom wsgiref.simple_server import make_server# application()函數(shù)是Python中符合WSGI標準的一個HTTP處理函數(shù),返回是一個字符串def application(environ, start_response): # start_response 如下調(diào)用就會發(fā)送HTTP響應的Header,注意只能調(diào)用一次start_response()函數(shù)發(fā)送Header。 # start_response 函數(shù)兩個參數(shù),一是HTTP響應碼,一是一組list表示的HTTP Header,每個Header用一個包含兩個str的數(shù)組表示 status = ’200 OK’ # response_headers 中添加請求頭部 ,解決跨域問題 response_headers = [(’Content-type’, ’application/json’), (’Access-Control-Allow-Origin’, ’*’), (’Access-Control-Allow-Methods’, ’POST’), (’Access-Control-Allow-Headers’, ’x-requested-with,content-type’), ] # json start_response(status, response_headers) result = {’code’: 200, ’message’: 'You get the flag'} return [result.encode()] if __name__ == '__main__': port = 8091 httpd = make_server('127.0.0.1', port, application) print('serving http on port {0}...'.format(str(port))) httpd.serve_forever()

以上這篇關(guān)于python 跨域處理方式詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | IWIS链条代理-ALPS耦合透镜-硅烷预处理剂-上海顶楚电子有限公司 lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 派财经_聚焦数字经济内容服务平台| 细胞染色-流式双标-试剂盒免费代做-上海研谨生物科技有限公司 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 高铝轻质保温砖_刚玉莫来石砖厂家_轻质耐火砖价格 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 液压中心架,数控中心架,自定心中心架-烟台恒阳机电设计有限公司 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 西安标准厂房_陕西工业厂房_西咸新区独栋厂房_长信科技产业园官方网站 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 工业铝型材-铝合金电机壳-铝排-气动执行器-山东永恒能源集团有限公司 | 聚合甘油__盐城市飞龙油脂有限公司 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 杭州火蝠电商_京东代运营_拼多多全托管代运营【天猫代运营】 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 广西正涛环保工程有限公司【官网】| 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 上海律师咨询_上海法律在线咨询免费_找对口律师上策法网-策法网 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 中山市派格家具有限公司【官网】 | 土壤肥料养分速测仪_测土配方施肥仪_土壤养分检测仪-杭州鸣辉科技有限公司 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 重庆轻质隔墙板-重庆安吉升科技有限公司 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 口信网(kousing.com) - 行业资讯_行业展会_行业培训_行业资料 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 国际学校_国际学校哪个好_国际课程学校-国际学校择校网 | 深圳诚暄fpc首页-柔性线路板,fpc柔性线路板打样生产厂家 | 上海办公室装修,办公楼装修设计,办公空间设计,企业展厅设计_写艺装饰公司 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 | 棉服定制/厂家/公司_棉袄订做/价格/费用-北京圣达信棉服 |