В настоящее время я занимаюсь разработкой веб-приложения NER со следующим стеком:
- Ubuntu 18.04.1 x64
- Версия nginx: nginx / 1.14.0 (Ubuntu)
- Джанго 1.11.20
(я только следовал этому уроку https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04)
Моя цель - создать конечную точку API REST. Поскольку я не использую какую-либо модель Django, я решил не использовать Django rest api framework. Я создал простую функцию обработчика вида:
@csrf_exempt
def test(request):
data = json.loads(request.body.decode('utf8'))
#do some tensorflow stuff here, and return predictions
data['res'] = "String that might contain unicode chars, e.g č,š or others"
return JsonResponse(data, safe=False)
А я вызываю функцию из ИП:
var url = baseURL + "/ner/api/predict"
var xmlhttp = new XMLHttpRequest();
var data = {
"sentence" : "String that might contain unicode chars, e.g č,š or others"
}
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var response = JSON.parse(this.responseText);
console.log(response )
}
};
xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader('Content-type', 'application/json')
xmlhttp.send(JSON.stringify(data));
Это хорошо работает в моем местном dev. окружение (win10 + django). Проблема возникает, когда я отправляю эту кодовую базу на сервер, CORS кажется проблемой.
ner.js:83 OPTIONS <url here>/ner/api/predict 500 (Internal Server Error)
<url here>/:1 Access to XMLHttpRequest at '<url here>/ner/api/predict' from origin '<url here>' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
Итак, я попытался отредактировать свою конфигурацию nginx, но не могу решить эту проблему.
location / {
add_header Access-Control-Allow-Origin '*' always;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header Access-Control-Allow-Headers 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Sin$
add_header Access-Control-Max-Age 1728000 always;
include proxy_params;
proxy_connect_timeout 100s;
proxy_send_timeout 100s;
proxy_read_timeout 100s;
proxy_pass http://unix:/home/<path>.sock;
}
Есть ли способ, как исправить эту проблему?
Спасибо