Отсутствует пользовательский заголовок с django, nginx и gunicorn - PullRequest
9 голосов
/ 04 ноября 2011

Отказ от ответственности:

Я работаю в проекте, где существует «огромное» веб-приложение, в котором есть API для мобильных телефонов, поэтому изменение API не является вариантом.

Это приложение было разработано некоторое время назад, и несколько разработчиков работали над ним,

Сказав это, проблема заключается в следующем;

В API для мобильных устройств этого сайта (просто просматривает, а затем возвращает данные json), код ищет токен, но делает это в заголовках запроса:

token = request.META.get('HTTP_TOKEN')

Когда я тестирую этот API локально, он работает нормально, а в производстве - нет, поэтому я пытаюсь выяснить, что происходит, и нашел это:

django преобразует заголовки, даже пользовательские заголовки, в ключи в запросе. META, я использую urllib2 и запросы для тестирования API, и проблема в работе заключается в том, что на рабочем сервере запрос. У META никогда нет ключа называется HTTP_TOKEN, поэтому, немного отладив, я серьезно думаю, что проблема в том, как мы обслуживаем приложение django.

Мы используем django1.3, nginx, gunicorn, virtualenvwrapper, python2.7.

Мой главный подозреваемый - nginx, я думаю, в некотором роде nginx получает заголовок, но не пересылает его в django, я пытаюсь провести некоторое исследование по этому поводу, но я нашел информацию только о заголовках безопасности и пользовательских заголовках из nginx, но Я не могу найти документ или что-то о том, как сказать nginx, что разрешает этот заголовок и не удаляет его.

Мне нужна помощь, во-первых, проверьте, получает ли nginx заголовок, но я просто немного знаю о nginx и не знаю, как сказать ему, чтобы регистрировать заголовки запросов.

Спасибо

Обновление

файл nginx conf

Ответы [ 4 ]

4 голосов
/ 11 ноября 2011

Если доступ к Django осуществляется с помощью uwsgi_pass, то в соответствующем месте (ах) ...

# All request headers should be passed on by default     
# Make sure "Token" response header is passed to user 
uwsgi_pass_header  Token;

Если доступ к Django осуществляется с помощью fastcgi_pass, то в соответствующем месте (ах) ...

# All request headers should be passed on by default     
# Make sure "Token" response header is passed to user 
fastcgi_pass_header  Token;

Если доступ к Django осуществляется через proxy_pass, то в соответствующем месте (ах) ...

# All request headers should be passed on by default
# but we can make sure "Token" request header is passed to Django 
proxy_set_header Token $http_token;

# Make sure "Token" response header is passed to user 
proxy_pass_header  Token;

Это должно помочь исключить вероятность того, что Nginx не передает вещи из вашей проблемы.

3 голосов
/ 18 октября 2016

В вашем файле конфигурации nginx (например, mysite_nginx.conf ) в разделе server добавьте этот параметр: uwsgi_pass_request_headers on;.

Например:

server {
    # the port your site will be served on
    listen      8000;

    ...

    underscores_in_headers on;
}

И если доступ к Django осуществляется через uwsgi_pass , вам необходимо добавить этот один параметр uwsgi_pass_request_headers on; в location раздел.

Например:

location / {
    include     /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
    uwsgi_pass_request_headers on;
    uwsgi_pass  django;
}
2 голосов
/ 07 июня 2012

Я не нашел реального ответа, но смог найти обходной путь.У меня была та же проблема со стандартными заголовками RFC if-none-match и if-Modified-Since, поэтому мое решение проверено на эти заголовки.

Добавлено в мою конфигурацию nginx:

uwsgi_param HTTP_IF_NONE_MATCH $http_if_none_match;
uwsgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since;

Я не могу объяснить, почему nginx по умолчанию отказывается передавать эти заголовки в uwsgi.Этот конфиг заставляет его.Страницы теперь генерируют 304 соответственно.

Для первоначального вопроса о нестандартном заголовке «токен», это должно сработать:

uwsgi_param HTTP_TOKEN $http_token;
2 голосов
/ 09 ноября 2011

Я думаю, это то, что вам нужно:

log_format combined '$remote_addr - $remote_user [$time_local]  '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" "$http_http_token" "$upstream_http_http_token"'

для регистрации происходящего.

Вы можете заглянуть глубже в раздел proxy_set_header в вышестоящем прокси-модуле, чтобы узнать, как проходитьнеобходимые заголовки.

Документацию можно найти здесь:

Последняя запись указывает на то, что nginx по умолчанию проходит большинство заголовков

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...