LINUX.ORG.RU

Кроссдоменный запрос для django

 ,


0

1

Помогите пожалуйста разрешить кроссдоменныйй запрос на локальной машине.

У меня на локальной машине поднят апач. на хосте

http://localhost/rurun/

есть яваскриптовый фронтэнд.

Так же локально запущен django 1.11. Запущен командой:

python manage.py runserver
Это значит, что используется встроенный сервер.

На django установлен следующий пакет: https://github.com/ottoyiu/django-cors-headers

Так же в конфиге прописано следующее:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'statistic',
    'corsheaders',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
]

CORS_ORIGIN_ALLOW_ALL = True

После клика на кнопке, из фронэнда отправляется ajax-запрос к django. Но браузер в консоль выводит сообщение об ошибке:

XMLHttpRequest cannot load http://127.0.0.1:8000/days. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. The response had HTTP status code 400.

Вот более подробная информация из вкладки network:

Request URL:http://127.0.0.1:8000/days
Request Method:GET
Status Code:400 Bad Request
Remote Address:127.0.0.1:8000
Response Headers
view source
Content-Type:text/html
Date:Thu, 29 Jun 2017 17:52:08 GMT
Server:WSGIServer/0.2 CPython/3.5.2
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Host:127.0.0.1:8000
Origin:http://localhost
Referer:http://localhost/rurun/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
X-Compress:null

Ещё пробовал в конфиге прописывать разрешённые хосты в белом листе:

CORS_ORIGIN_WHITELIST = (
    'localhost/rurun'
)

Разные комбинации протоколов и портов тоже прбовал


Че-то джанга уже как пэхэпэ. Какие-то дилетантские вопросы пошли. Стыдно быть должно.

А по сабжу - просто переделай все свои ajax-url с http://127.0.0.1:8000/days на просто /days и будет тебе счастье

Siado ★★★★★
()
Ответ на: комментарий от Siado

ajax-запрос у меня был только один. Такой:

	$.ajax({
		url: 'http://127.0.0.1:8000/days',
		crossDomain: true
	}, {
		success: function(data) {
			var statistic = JSON.parse(result);
			alert(statistic);
		},
		error: function(xhr, status, error) {
			console.log(xhr, status, error);		
		}
	});
[\code]

После вашего совета я заменил его на такой:
	$.ajax({
		url: '/days',
		crossDomain: true
	}, {
		success: function(data) {
			var statistic = JSON.parse(result);
			alert(statistic);
		},
		error: function(xhr, status, error) {
			console.log(xhr, status, error);		
		}
	});
[\code]

Но ничего не изменилось, браузер по прежнему возвращает ошибку.

Да и с чего бы её не возвращать? Ведь в первом варианте хотя бы порт был указан верно


UPD:
ещё заглянул в консоль джанги и увидел там следующее:
Invalid HTTP_HOST header: '127.0.0.1:8000'. You may need to add '127.0.0.1' to ALLOWED_HOSTS.

После этого попробовал добавить этот хост в список разрешённых так:

CORS_ORIGIN_WHITELIST = (
    '127.0.0.1'
)

Но сообщение об этой ошибке по прежнему не исчезло

prozaik
() автор топика
Ответ на: комментарий от prozaik

Так это. Чтобы мой совет заработал, тебе надо веб-сервер настроить так, чтобы на запрос / выплевывался html с js-ажаксом, а на другие запросы типа /* (а еще лучше /api/*) проксировало в джанго сервер.

Это первый способ и имхо самый правильный.

Есть другой вариант - это закинуть в джанговый responce заголовок: «Access-Control-Allow-Origin: *» Что по идее и должен делать твой установленный django-cors-headers, но че-то не делает.

З.ы.

Ну а если тебе чисто для локалхостного тестирования и не для продакшена - то просто запусти хром с такими параметрами: https://stackoverflow.com/questions/3102819/disable-same-origin-policy-in-chrome

Siado ★★★★★
()
Последнее исправление: Siado (всего исправлений: 2)
Ответ на: комментарий от Siado

Хоть это и не лучший путь, но я с радостью бы добавил этот заголовок в response, но не понимаю как это сделать. Наверное из view?

вот как выглядит мой view:

def days_read(request, timestamp_begin, timestamp_end):
	timestamp_begin_human = datetime.datetime.fromtimestamp(float(timestamp_begin))
	timestamp_end_human = datetime.datetime.fromtimestamp(float(timestamp_end))
	days = Day.objects.filter(created_date__range=(timestamp_begin_human, timestamp_end_human)).order_by('created_date')
	days_serialized = serializers.serialize('json', days)
	return JsonResponse(days_serialized, safe=False) 	

Где-то в нём нужно прописывать заголовок?

Первый пункт не очень понял, но думаю, встроенный в джанго сервер нельзя настроить. Он очень примитивный и предназначен только чтобы быстро запустить проект

prozaik
() автор топика
Ответ на: комментарий от Siado

вобщем я дико извиняюсь, но проблему решил, добавив в ALLOWED_HOSTS


127.0.0.1
[\code]

несколько дней у меня джанга работала на локалхосте и без этой настройки, а после того как я поставил пакет django-cors-headers, почему-то начала ругаться

prozaik
() автор топика

django-cors-headers — говноподелие от говноделов, не умеющих читать не то что референсы, но даже хелпы.

Goury ★★★★★
()
Ответ на: комментарий от Siado

Access-Control-Allow-Origin: *

Индокитайский костыль.
Там должен быть конкретный ориджин или список ориджинов, которым можно.
И это далеко не единственный заголовок, который надо вернуть.

Goury ★★★★★
()
Ответ на: комментарий от prozaik

Примитивная у тебя форма рук, сервер джанги шлёт такие же HTTP ответы как и любой другой сервер

Goury ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.