nginx,django - uwsgi没有看到POST数据

时间:2013-08-30 20:14:32

标签: python django nginx uwsgi

这是.ini文件:

module=myapp.wsgi:application
master=True
pidfile=/tmp/project-master.pid
socket=127.0.0.1:8000
vacuum=True
max-requests=5000
daemonize=/home/mercier/django/site/wsgi.log
buffer-size=327680
processes=16
listen=500
timeout=10
post-buffering=1

nginx使用uwsgi_pass指令转发连接。

从django看不到任何帖子数据 - request.POST只是{}。这是一个很大的问题......我该如何解决这个问题?在开发(runserver)中看到了发布数据。

重要提示:nginx和wsgi都以200(OK)响应。我也尝试设置不同的后缓冲(在这里和那里找到),但没有区别......

django 1.4 uwsgi 1.9.15 nginx 1.2.1

EDIT3: 现在我尝试使用webob :( load request.environ) 发送POST / PUT主体时客户端断开连接(预计会增加39个字节)

现在我手动尝试:print request.environ ['wsgi.input']。read(39) - >是一条空行...

Edit4:不是我试过我在网上找到的任何提示,我正在考虑尝试fcgi或在runserver上部署它;(

Edit5:相关的nginx.conf(启用的网站)部分:

server {

        listen   80; 

        server_name  localhost;

        access_log  /var/log/nginx/localhost.access.log;


        location / {
                root   /var/www;
                index  index.html index.htm;
                proxy_set_header X-FORWARDED-FOR $remote_addr;

                include uwsgi_params;
                uwsgi_pass_request_body on;
                uwsgi_pass_request_headers on;
                uwsgi_pass 127.0.0.1:8000;



        }

uwsgi_params:

uwsgi_param     QUERY_STRING            $query_string;
uwsgi_param     REQUEST_METHOD          $request_method;
uwsgi_param     CONTENT_TYPE            $content_type;
uwsgi_param     CONTENT_LENGTH          $content_length;

uwsgi_param     REQUEST_URI             $request_uri;
uwsgi_param     PATH_INFO               $document_uri;
uwsgi_param     DOCUMENT_ROOT           $document_root;
uwsgi_param     SERVER_PROTOCOL         $server_protocol;
uwsgi_param     UWSGI_SCHEME            $scheme;

uwsgi_param     REMOTE_ADDR             $remote_addr;
uwsgi_param     REMOTE_PORT             $remote_port;
uwsgi_param     SERVER_PORT             $server_port;
uwsgi_param     SERVER_NAME             $server_name;
uwsgi_param     DOCUMENT_BODY           $request_body;

Edit6:

这是我正在使用的应用程序(module =):

import os,sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site.settings")
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__),
"../../")))
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__),
"../")))

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

2 个答案:

答案 0 :(得分:0)

X = request.body

这应该是wsgi运行的任何django应用程序中的第一行。然后POST DATA工作。如果稍后使用,Django必须立即读取请求的主体。

然而,仍然存在这个问题: 无效的uwsgi请求(当前strsize:16705)。跳过。

所以我很难在这个设置中使用uwsgi。我通过使用fcgi来解决这个问题,fcgi没有这样的限制。

理由:strsize不可配置 - http://comments.gmane.org/gmane.comp.python.wsgi.uwsgi.general/5712

编辑:罗伯托是对的 - strsize与请求的正文无关,即使在uwsgi中也是如此。在旅行,夜晚等期间调试问题并不总是一个好主意;) 但是,Django必须立即阅读正文请求,这是毋庸置疑的。在执行任何其他操作之前,必须先阅读请求的正文。

答案 1 :(得分:0)

尝试删除nginx以查看问题所在。以http模式运行uWSGI:

HTTP的插座= 127.0.0.1:8000

并连接到端口8000

如果一切正常,请确保nginx正在传递CONTENT_LENGTH参数

最终粘贴你的nginx配置