Django實(shí)現(xiàn)跨域請(qǐng)求過(guò)程詳解
前言
CORS 即 Cross Origin Resource Sharing 跨域資源共享.
跨域請(qǐng)求分兩種:簡(jiǎn)單請(qǐng)求、復(fù)雜請(qǐng)求.
簡(jiǎn)單請(qǐng)求
簡(jiǎn)單請(qǐng)求必須滿足下述條件.
HTTP方法為這三種方法之一:HEAD、GET、POST
HTTP頭消息不超出以下字段:
Accept、Accept-Language、Content-Language、Last-Event-ID
且Content-Type只能為下列類型中的某一個(gè):
- application/x-www-from-urlencoded
- multipart/form-data
- text/plain.
==任何不滿足上述要求的請(qǐng)求,都會(huì)被認(rèn)為是復(fù)雜請(qǐng)求.
復(fù)雜請(qǐng)求會(huì)先發(fā)出一個(gè)預(yù)請(qǐng)求——預(yù)檢,OPTIONS請(qǐng)求.==
瀏覽器的同源策略
無(wú)法跨域就是被瀏覽器的同源策略限制的.
也就是說(shuō),==瀏覽器會(huì)阻止非同源的請(qǐng)求.==
那什么是非同源呢?==域名或端口不同的,都屬于非同源.==
==瀏覽器只會(huì)阻止表單以及Ajax請(qǐng)求的跨域,但不會(huì)阻止src請(qǐng)求跨域.==
所以,我們的cdn、圖片等src請(qǐng)求都是正常的.
JsonP實(shí)現(xiàn)跨域
==JsonP跨域的原理是利用了瀏覽器不阻止src請(qǐng)求跨域來(lái)實(shí)現(xiàn)的.==
==JsonP只能實(shí)現(xiàn)GET請(qǐng)求跨域.==
首先 準(zhǔn)備我們的視圖文件
from django.http import HttpResponse
from rest_framework.views import APIView
class TestView(APIView):
def get(self, request):
return HttpResponse("handlerResponse('is ok')")
# 注意返回的函數(shù)以及參數(shù)的格式
然后 HTML文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title>JsonP跨站請(qǐng)求測(cè)試</title>
</head>
<body>
<script>
// 函數(shù)名應(yīng)為handlerResponse,這是一種約定俗成
function handlerResponse(data) {
alert(data)
}
</script>
<!--必須放在被執(zhí)行函數(shù)的script標(biāo)簽的下面,否則會(huì)報(bào)錯(cuò)函數(shù)不存在-->
<script src="http://127.0.0.1:8000/test/"></script>
</body>
</html>
好了 我們來(lái)測(cè)試吧

可以看到,我們成功實(shí)現(xiàn)了跨域獲取數(shù)據(jù).
JsonP解決跨域只能發(fā)送GET請(qǐng)求,并且實(shí)現(xiàn)起來(lái)前后端交互會(huì)比較多,現(xiàn)在幾乎已經(jīng)不在使用了
在Django中間件中添加響應(yīng)頭
可實(shí)現(xiàn)簡(jiǎn)單請(qǐng)求和復(fù)雜請(qǐng)求的跨域
第一步 準(zhǔn)備中間件
from django.utils.deprecation import MiddlewareMixin
class MyCors(MiddlewareMixin):
def process_response(self, request, response):
# 如下,等于'*'后,便可允許所有簡(jiǎn)單請(qǐng)求的跨域訪問(wèn)
response['Access-Control-Allow-Origin'] = '*'
# 判斷是否為復(fù)雜請(qǐng)求
if request.method == 'OPTIONS':
response['Access-Control-Allow-Headers'] = 'Content-Type'
response['Access-Control-Allow-Methods'] = 'PUT,PATCH,DELETE'
return response
寫好之后,別忘記了去注冊(cè).
第二步 視圖文件
from django.http import HttpResponse
from rest_framework.views import APIView
class TestView(APIView):
def get(self, request):
return HttpResponse("這是GET請(qǐng)求的數(shù)據(jù)")
def post(self, request):
return HttpResponse("這是POST請(qǐng)求的數(shù)據(jù)")
def put(self, request):
return HttpResponse("這是PUT請(qǐng)求的數(shù)")
第三步 HTML文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<title>test</title>
</head>
<body>
<button id="sign">點(diǎn)擊發(fā)送跨站請(qǐng)求</button>
<script>
$('#sign').click(function () {
$.ajax({
url: 'http://127.0.0.1:8000/test/', // 要訪問(wèn)的外站
type: 'put', // 請(qǐng)求類型, put為復(fù)雜請(qǐng)求
contentType: 'application/json', // 指定為'application/json'后,將變?yōu)閺?fù)雜請(qǐng)求
success: function (data) {
// 請(qǐng)求成功后將執(zhí)行該函數(shù)
// data是外站發(fā)送過(guò)來(lái)的數(shù)據(jù)
alert(data)
},
});
});
</script>
</body>
</html>
測(cè)試效果如下

可見(jiàn),我們實(shí)現(xiàn)了復(fù)雜請(qǐng)求的跨域,簡(jiǎn)單請(qǐng)求就更不用說(shuō)了.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用Flask和Django中解決跨域請(qǐng)求問(wèn)題
- Django跨域請(qǐng)求原理及實(shí)現(xiàn)代碼
- 簡(jiǎn)單了解django處理跨域請(qǐng)求最佳解決方案
- Django+uni-app實(shí)現(xiàn)數(shù)據(jù)通信中的請(qǐng)求跨域的示例代碼
- django基于cors解決跨域請(qǐng)求問(wèn)題詳解
- Django中使用CORS實(shí)現(xiàn)跨域請(qǐng)求過(guò)程解析
- django解決跨域請(qǐng)求的問(wèn)題詳解
- django解決跨域請(qǐng)求的問(wèn)題
- Django跨域請(qǐng)求CSRF的方法示例
- Django跨域請(qǐng)求無(wú)法傳遞Cookie的解決
相關(guān)文章
解決Pandas生成Excel時(shí)的sheet問(wèn)題的方法總結(jié)
估計(jì)有不少小伙伴在將 DataFrame導(dǎo)入到Excel的時(shí)候,遇到過(guò)下面這種尷尬的情況:想給一個(gè)現(xiàn)有的Excel文件追加一個(gè)sheet,結(jié)果發(fā)現(xiàn)其它的sheet都沒(méi)了等,本文就來(lái)告訴你如何解決這些問(wèn)題2022-08-08
Python?常用模塊threading和Thread模塊之線程池
這篇文章主要介紹了Python?threading和Thread模塊之線程池,線程池如消費(fèi)者,負(fù)責(zé)接收任務(wù),并將任務(wù)分配到一個(gè)空閑的線程中去執(zhí)行。并不關(guān)心是哪一個(gè)線程執(zhí)行的這個(gè)任務(wù),具體介紹需要的小伙伴可以參考下面文章詳細(xì)內(nèi)容2022-06-06
Python使用matplotlib繪制動(dòng)畫的方法
這篇文章主要介紹了Python使用matplotlib繪制動(dòng)畫的方法,涉及matplotlib模塊的常見(jiàn)使用技巧,需要的朋友可以參考下2015-05-05
Python實(shí)現(xiàn)快速多線程ping的方法
這篇文章主要介紹了Python實(shí)現(xiàn)快速多線程ping的方法,實(shí)例分析了Python多線程及ICMP數(shù)據(jù)包的發(fā)送技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
基于Tensorflow使用CPU而不用GPU問(wèn)題的解決
今天小編就為大家分享一篇基于Tensorflow使用CPU而不用GPU問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
Django實(shí)現(xiàn)將一個(gè)字典傳到前端顯示出來(lái)
這篇文章主要介紹了Django實(shí)現(xiàn)將一個(gè)字典傳到前端顯示出來(lái),具有很好的參考價(jià)值,希望2020-04-04

