Ошибка аутентификации администратора Django - PullRequest
1 голос
/ 01 февраля 2010

вход в администратор django завершается неудачно при первом нажатии кнопки «войти» время, но нажимая «назад» и «войти» снова - вход пользователя в систему успешно.

Я развертываю приложение Django с zc.buildout здесь, с настройкой, аналогичной к тому, что описано здесь http://www.meppum.com/2009/jan/17/installing-django-ubuntu-intrepid/. Nginx (прослушивание 127.0.0.1:8003) работает за пределами Apache (прослушивание 127.0.0.1:8001), конфигурации обоих серверов конец поста. Я получаю доступ к своему приложению django как 127.0.0.1:8003/.

Итак, 127.0.0.1:8003/admin/ открывает форму входа администратора django. 1) Ввод имени пользователя / пароля, нажатие кнопки «войти» перенаправляет на (по неизвестной причине?) 127.0.0.1/ admin, поэтому ничего не заканчивается, так как сервер не прослушивает на 80 порт. HTTP trace (после нажатия входа в систему: http://127.0.0.1:8003/admin/)

POST /admin/ HTTP/1.1
Host: 127.0.0.1:8003
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.17) Gecko/2010010604 Ubuntu/9.04 (jaunty) Firefox/3.0.17
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:8003/admin/
Cookie: JSESSIONID=0D287C17FBA82223AB7D5884EA534967; sessionid=c65c7af8ebde9e6bdf9c739a731d376b
Content-Type: application/x-www-form-urlencoded
Content-Length: 55
username=to&password=password&this_is_the_login_form=1

HTTP/1.x 302 FOUND
Server: nginx/0.8.29
Date: Mon, 01 Feb 2010 10:27:44 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Expires: Mon, 01 Feb 2010 10:27:44 GMT
Vary: Cookie
Etag: "d41d8cd98f00b204e9800998ecf8427e"
Cache-Control: max-age=0
Set-Cookie: sessionid=9db437da69c359136786696f90ba89f2; expires=Mon, 15-Feb-2010 10:27:44 GMT; Max-Age=1209600; Path=/
Last-Modified: Mon, 01 Feb 2010 10:27:44 GMT
Location: http://127.0.0.1/admin/
Content-Length: 0

2) Повторное нажатие браузера и кнопка «Войти» (или Нажатие браузера «назад» и «обновить») успешно входит в систему. HTTP-трассировка:

POST /admin/ HTTP/1.1
Host: 127.0.0.1:8003
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.17) Gecko/2010010604 Ubuntu/9.04 (jaunty) Firefox/3.0.17
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:8003/admin/
Cookie: JSESSIONID=0D287C17FBA82223AB7D5884EA534967; sessionid=9db437da69c359136786696f90ba89f2
Content-Type: application/x-www-form-urlencoded
Content-Length: 55
username=to&password=password&this_is_the_login_form=1

HTTP/1.x 200 OK
Server: nginx/0.8.29
Date: Mon, 01 Feb 2010 10:52:02 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Mon, 01 Feb 2010 10:52:02 GMT
Vary: Cookie
Etag: "3355a46fb32d7cb6ab21262c359d9eec"
Cache-Control: max-age=0
Last-Modified: Mon, 01 Feb 2010 10:52:02 GMT

Похоже, это проблема, связанная с файлами cookie, но, я думаю, корень проблема может также заключаться в конфигурации apache и / или nginx.

Есть идеи, как сделать так, чтобы форма входа администратора работала немедленно?

Ура!

до

P.S.configs:

Конфигурация apache vhost:

<VirtualHost *:8001>

    <Directory /home/toinbis/Desktop/programming/project/runtime/
htdocs/django_wsgi/>
        Order deny,allow
        Allow from all
    </Directory>

    WSGIDaemonProcess tsd user=www-data group=www-data threads=25
    WSGIProcessGroup tsd

    WSGIScriptAlias / /home/toinbis/Desktop/programming/project/
runtime/htdocs/django_wsgi/djproject.wsgi

    LogLevel warn
    ErrorLog  /home/toinbis/Desktop/programming/project/runtime/logs/
apache_tsd_error.log
    CustomLog /home/toinbis/Desktop/programming/project/runtime/logs/
apache_tsd_access.log combined

    ServerName localhost
</VirtualHost>

Конфигурация nginx:

daemon off;
#user www-data;
worker_processes  2;

error_log  /home/toinbis/Desktop/programming/project/runtime/logs/
nginx_general_error.log;
pid        /home/toinbis/Desktop/programming/project/runtime/var/pids/
nginx.pid;

events {
    worker_connections  1024;
    #server_names_hash_bucket_size: 128;

}

http {
    include       /home/toinbis/Desktop/programming/project/runtime/
etc/nginx_conf/mime.types;
    default_type  application/octet-stream;

    access_log  /home/toinbis/Desktop/programming/project/runtime/logs/
nginx_access.log;
    error_log   /home/toinbis/Desktop/programming/project/runtime/logs/
nginx_error.log;

    sendfile        on;
    tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  2;
    tcp_nodelay        on;

    server_names_hash_bucket_size 128;
    #server_name_hashes 128;
    gzip  on;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)"; #iš ubuntu
    gzip_types text/plain text/css application/x-javascript text/xml
application/xml application/xml+rss text/javascript;

upstream backend {
  server 127.0.0.1:8001;

}

server {
            listen   8003;
            server_name localhost;

            error_log /home/toinbis/Desktop/programming/project/
runtime/logs/project_nginx_error.log;
            access_log /home/toinbis/Desktop/programming/project/
runtime/logs/project_nginx_access.log;

            location / {
                        proxy_pass  http://backend/;
                        include     /home/toinbis/Desktop/programming/
project/runtime/etc/nginx_conf/nginx_proxy_1.conf;
            }

            location  /media/ {
                        root /home/toinbis/Desktop/programming/project/
src/tsd/core/;
            }

}
}

ура, до

Ответы [ 3 ]

1 голос
/ 01 февраля 2010

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

Возвращаемый заголовок Location неверен:

Location: http://127.0.0.1/admin/

Этоявно отсутствует номер порта.К сожалению, трудно сказать точно, откуда это исходит.Вы можете использовать Nginx или Apache, автоматически изменяя заголовок Location.Я бы посоветовал сделать следующее, чтобы увидеть, где возникает проблема:

  • Очистите куки перед каждым входом в систему, иначе вы можете получить ложный положительный результат.
  • Перейти непосредственнок вашему экземпляру Apache и посмотрите, сохраняется ли проблема.
    • http://127.0.0.1:8001/admin/
    • Если заголовок местоположения не имеет порта на нем:
      • Запустите сервер разработки Django на некотором случайном порту (например, 8005) ипосмотрите, если проблема не устранена:
        • Если проблема не устранена, она есть в вашем коде.
        • Если проблема не устранена, Apache либо делает что-то странное, либо WSGI / Django не получаетвся информация, необходимая для определения номера порта.
          • Убедитесь, что скрипт wsgi и приложение django могут видеть номер порта в среде.
    • Если в заголовке местоположения есть порт:
      • По какой-то причине Nginx удаляет его.
      • Попробуйте вырезать Apache из цикла, он вам, вероятно, не нужен.
        • Запустите Django как сервер FastCGI и подключите к нему Nginx вместо Apache.
          • Это на самом деле снизит некоторые накладные расходы на вашем сервере (меньше запросов, дополнительные потоки, использование памяти и т. Д.).
          • Довольно хорошее руководство по настройке здесь .

Редактировать ниндзя!
Не уверен, будет ли этосправка, но, похоже, в Nginx есть опция игнорирования номера порта в редиректах.URL неактивен, поэтому я вставляю его из здесь .

http://wiki.codemongers.com/NginxHttpCoreModule#port_in_redirect

syntax: port_in_redirect [ on|off ]
default: port_in_redirect on
context: http, server, location

Директива позволяетили запрещает указание порта в перенаправлениях, обрабатываемых nginx.

1 голос
/ 03 февраля 2010

Юдж, Джеймс,

Большое спасибо за вашу помощь еще раз!

Решение оказалось описанным здесь : изменение proxy_set_headerHost $host; на proxy_set_headerHost $host:$server_port; добилось цели!

1 голос
/ 01 февраля 2010

Ваши настройки неверны. Джанго считает, что он работает на порту 80. Посмотрите на эту строку в первом HTTP-ответе:

Location: http://127.0.0.1/admin/

К сожалению, я не могу сейчас понять, почему это происходит. В таких случаях я предпочитаю просто выполнить соответствующий код Django с помощью отладчика.

...