Режим учетных данных запросов, инициируемых XMLHttpRequest, контролируется атрибутом withCredentials.
Прежде чем задать этот вопрос, я прочитал этот пост.
В моих settings.py:
INSTALLED_APPS = [
...
'corsheaders',
]
CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'http://103.200.30.76'
)
Мой веб-сайт использует Apache для прослушивания 80
порт, и я использую
python3 manage.py runserver 103.200.30.76:8001
Но я все еще получаю нижнюю ошибку:
Не удалось загрузить http://103.200.30.76:8001/api/website/websitemanage/footerreconmend/list/: Ответ на предварительный запрос не проходит проверку контроля доступа: значение заголовка "Access-Control-Allow-Origin" в ответе не должно быть подстановочного знака "*", когда режим учетных данных запроса "включить". Поэтому происхождение ' http://103.200.30.76/' не разрешено. Режим учетных данных запросов, инициируемых XMLHttpRequest, контролируется атрибутом withCredentials.
Один из запросов выглядит так:
General:
Request URL:http://103.200.30.76:8001/api/website/websitemanage/homepagefunctionshow/list/
Request Method:OPTIONS
Status Code:200 OK
Remote Address:103.200.30.76:8001
Referrer Policy:no-referrer-when-downgrade
Response Headers
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:accept, accept-encoding, authorization, content-type, dnt, origin, user-agent, x-csrftoken, x-requested-with
Access-Control-Allow-Methods:DELETE, GET, OPTIONS, PATCH, POST, PUT
Access-Control-Allow-Origin:http://103.200.30.76
Access-Control-Max-Age:86400
Content-Length:0
Content-Type:text/html; charset=utf-8
Date:Mon, 11 Dec 2017 02:44:12 GMT
Server:WSGIServer/0.2 CPython/3.5.2
Vary:Origin
X-Frame-Options:SAMEORIGIN
Request Headers:
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.9,en;q=0.8
Access-Control-Request-Headers:access-control-allow-origin,x-requested-with
Access-Control-Request-Method:GET
Connection:keep-alive
Host:103.200.30.76:8001
Origin:http://103.200.30.76
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
Итак, кто может помочь мне с этим, пожалуйста?
РЕДАКТИРОВАТЬ
Я нахожу, если я использую команду ниже (disable-web-security
), чтобы открыть Chrome, у меня не будет этой проблемы.
open -a "Google Chrome" --args --disable-web-security --user-data-dir
РЕДАКТИРОВАТЬ - 2
Я попробовал ответ Накиба Хакими, используйте промежуточную посуду:
class AccessControl(MiddlewareMixin):
def process_request(self, request):
if 'HTTP_ACCESS_CONTROL_REQUEST_METHOD' in request.META:
response = http.HttpResponse()
response["Access-Control-Allow-Origin"]= "*"
response["Access-Control-Allow-Credentials"] = "true"
response["Access-Control-Allow-Methods"]= "GET,HEAD,OPTIONS,POST,PUT"
response["Access-Control-Allow-Headers"] = "Authentication , Authorization , X-CSRF-Token , Access-Control-Allow-Credentials , Access-Control-Allow-Methods , Access-Control-Allow-Origin , Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"
return response
return None
Но все еще имеет эту проблему.
Я проверил запрос в отладчике:
Здесь нет HTTP_ACCESS_CONTROL_REQUEST_METHOD
в запросе.
1 ответ
По умолчанию django доза не разрешает Access-Control-Allow-Origin для всех доменов, для этого необходимо добавить MIDDLEWARE_CLASSES.
class AccessControl(object):
def process_request(self, request):
if 'HTTP_ACCESS_CONTROL_REQUEST_METHOD' in request.META:
response = http.HttpResponse()
response["Access-Control-Allow-Origin"]= "*"
response["Access-Control-Allow-Credentials"] = "true"
response["Access-Control-Allow-Methods"]= "GET,HEAD,OPTIONS,POST,PUT"
response["Access-Control-Allow-Headers"] = "Authentication , Authorization , X-CSRF-Token , Access-Control-Allow-Credentials , Access-Control-Allow-Methods , Access-Control-Allow-Origin , Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"
return response
return None
тогда в setting.py
MIDDLEWARE_CLASSES = [
...
'app.filename.AccessControl',
]
это позволит запросы со всех доменов