python之路_Cores解決跨域請求


三、服務端解決跨域請求

  上述我們介紹了如何在客戶端解決跨域請求問題,同樣我們可以在服務端進行設置處理,是否還記得在我們不做任何處理的時候,跨域請求時候瀏覽器給我們報的錯誤不?如下,翻譯過來就是因為相應頭沒有指定Access-Control-Allow-Origin所允許原始的請求路徑,因此原始請求路徑http://127.0.0.1:8001不被允許訪問。

  基於上述的原因解釋,我們只需要在響應的內容加入上述這樣的授權字段,便可解決,實例如下:

項目1客戶端請求代碼:(路徑為:http://127.0.0.1:8001)

<script>
    $(".ajax_btn").click(function () {
       $.ajax({
           url:"http://127.0.0.1:8002/send_ajax/",
           success:function (data) {
               alert(data);
               console.log(data)
           }
       })
    });
</script>

項目2服務端被請求的路徑:

def send_ajax(request):
    import json
    dic={"k1":"v1"}
    print("ok")
    response=HttpResponse(json.dumps(dic))
    response["Access-Control-Allow-Origin"]="http://127.0.0.1:8001"
    return response

  如上方式,在服務端相應內容中加入response["Access-Control-Allow-Origin"]="http://127.0.0.1:8001"字段后,http://127.0.0.1:8001路徑就可以跨域請求此路徑下的內容,如果將其設置成response["Access-Control-Allow-Origin"]="*"表示所有的客戶端都可以請求此服務器下此路徑。

  上述這種方式雖然在服務端解決了跨域請求的問題,但是通過上述設置方式,顯然不靈活,我們應該訪問路徑的實際情況進行判斷,然后再決定要不要給其跨域返回內容,解決辦法可以將服務器代碼改為如下:

def send_ajax(request):
    import json
    dic={"k1":"v1"}
    HttpOrigins=["http://127.0.0.1:8001","http://127.0.0.1:8003","http://127.0.0.1:8005"]
    print(request.META.get("HTTP_ORIGIN"))             #可以取得請求路徑的origin
    HttpOrigin=request.META.get("HTTP_ORIGIN")
    if HttpOrigin in HttpOrigins:
        response=HttpResponse(json.dumps(dic))
        response["Access-Control-Allow-Origin"]=HttpOrigin
    return response

PS:

  上述講述的都是基於get請求的情況,假如我們在客戶端利用PUT形式進行請求,因為put請求屬於上傳文件的請求方式,而http協議對此請求方式未做驗證,即請求便能成功,顯然不合理,所以瀏覽器給給其增加了預檢,即put請求提交時,客戶端實際提交的請求方式為OPTIONS,只有在服務端對其進行了驗證后,才會繼續提交正真put請求。上述的服務端跨域put形式請求可以改寫為如下:

def send_ajax(request):
    if request.method=="OPTIONS":#預檢
        response=HttpResponse()
        response["Access-Control-Allow-Methods"]="PUT"
        response["Access-Control-Allow-Origin"] = "http://127.0.0.1:8001"
        return response
    elif request.method=="PUT":
        import json
        dic = {"k1": "v1"}
        response = HttpResponse(json.dumps(dic))
        response["Access-Control-Allow-Origin"] = "http://127.0.0.1:8001"
        return response

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM