Tôi có một thiết lập liên quan đến
Máy chủ giao diện (Node.js, tên miền: localhost: 3000) <---> Phần cuối (Django, Ajax, tên miền: localhost: 8000)
Trình duyệt <- webapp <- Node.js (Phục vụ ứng dụng)
Trình duyệt (webapp) -> Ajax -> Django (Phục vụ các yêu cầu POST ajax)
Bây giờ, vấn đề của tôi ở đây là với thiết lập CORS mà ứng dụng web sử dụng để thực hiện các cuộc gọi Ajax đến máy chủ phụ trợ. Trong chrome, tôi tiếp tục nhận được
Không thể sử dụng ký tự đại diện trong Access-Control-Allow-Origin khi cờ thông tin xác thực là đúng.
cũng không hoạt động trên firefox.
Thiết lập Node.js của tôi là:
var allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', 'http://localhost:8000/');
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
};
Và trong Django tôi đang sử dụng phần mềm trung gian này cùng với cái này
Các ứng dụng web thực hiện các yêu cầu như vậy:
$.ajax({
type: "POST",
url: 'http://localhost:8000/blah',
data: {},
xhrFields: {
withCredentials: true
},
crossDomain: true,
dataType: 'json',
success: successHandler
});
Vì vậy, các tiêu đề yêu cầu mà webapp gửi trông giống như:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept"
Access-Control-Allow-Methods: 'GET,PUT,POST,DELETE'
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=***; sessionid="***"
Và đây là tiêu đề phản hồi:
Access-Control-Allow-Headers: Content-Type,*
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
Content-Type: application/json
Tôi làm sai ở đâu?!
Chỉnh sửa 1: Tôi đã sử dụng chrome --disable-web-security
, nhưng bây giờ muốn mọi thứ thực sự hoạt động.
Chỉnh sửa 2: Trả lời:
Vì vậy, giải pháp cho tôi django-cors-headers
cấu hình:
CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'http://localhost:3000' # Here was the problem indeed and it has to be http://localhost:3000, not http://localhost:3000/
)
http
, nó là /
cuối cùng. Tôi cho rằng bỏ qua http có thể hoạt động, nhưng tôi đã không thực sự làm việc với công cụ này trong một số năm, vì vậy không thực sự biết những gì hoạt động bây giờ!