Как вернуть Django сообщения об ошибках проекта, когда я использую nginx в рабочем режиме - PullRequest
1 голос
/ 14 апреля 2020

Я разработал проект Django и развернул его на бесплатных сервисах EC2 уровня Amazon. Все нормально, кроме сообщений об ошибках, которые не возвращаются обратно. Я использую проект в производственном режиме.

Пояснение к изображению выше [Console Log]:

  1. Успешный запрос и ответ - он был сделан для существующего URL

  2. Второй запрос сделан преднамеренно для несуществующего URL и не получил никакого ответа.

Я хочу получить как минимум 404 ответа, проблема в том, что у меня нет ответа от сервера. Когда я запустил его на сервере, я увидел, что он записывает результаты на сервер.

Вопрос: Как вернуть ответ, который Django генерирует, если что-то не так. Дополнительная информация: Эти сообщения об ошибках и ответ генерируются во встроенном шаблоне djangorestframework's.

Дополнительные сведения:

djangorestframework Diagram Explanation

Дайте мне знать, если я что-то упустил.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Мозг делает действительно интересные вещи, когда устал. Спасибо @ iklina c. Он был прав, лучше бы я правильно использовал django-cors-headers. Он уже был установлен и работал над герою, когда я перешел на amazon aws, я думал, что что-то связано с NGINX.

Примечания, чтобы взять.

  1. pip установить django -cors-headers

  2. Убедитесь, что это в ваших установленных приложений.

INSTALLED_APPS = [

    ...
    'corsheaders',
    ...
 ]
Вам также понадобится добавить класс промежуточного программного обеспечения для прослушивания ответов: # которые я пропустил
MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]
Список источников, которым разрешено делать межсайтовые HTTP-запросы
CORS_ORIGIN_WHITELIST = [
    "https://example.com",
    "https://sub.example.com",
    "http://localhost:8080",
    "http://127.0.0.1:9000"
]

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

В итоге я изменил nginx .conf на следующие

upstream hello_django {
    server web:8000;
}

server {

    listen 80;

    location / {
        proxy_pass http://hello_django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /staticfiles/ {
        alias /home/app/web/staticfiles/;
    }

    location /mediafiles/ {
        alias /home/app/web/mediafiles/;
    }

}

Happy coding.) На testdriven.io и django -cors-headers

0 голосов
/ 14 апреля 2020

Вы пропускаете запросы прокси, и они не получают корректно add_header, вы должны пропустить прокси после добавления заголовков

location / {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PATCH, PUT, DELETE';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';

 if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PATCH, PUT, DELETE';
    #
    # Custom headers and headers various browsers *should* be OK with but aren't
    #
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range, Authorization';
    #
    # Tell client that this pre-flight info is valid for 20 days
    #
    add_header 'Access-Control-Max-Age' 1728000;
    add_header 'Content-Type' 'text/plain; charset=utf-8';
    add_header 'Content-Length' 0;
    return 204;
 }


    proxy_pass http://app;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_redirect off;

Иначе можно добавить django -cors- заголовки в ваше приложение

...