【发布时间】:2014-07-07 15:59:46
【问题描述】:
经过几个小时的阅读手册和其他帮助,我终于得到了我的 nginx+uwsgi1.9+django1.6+python3.3 服务器。
但是现在我遇到了问题(在我的理解中存在问题)-如何从请求中获取 POST 数据?我的意思是如何正确获取它。
django视图中的代码:
def info(request):
print(request)
return HttpResponse(request)
对服务器的请求:
http://127.0.0.1:8000/info/
{
"test":"test"
}
和有趣的部分 - uwsgi 日志中的输出(POST 和 GET 字典):
<WSGIRequest
path:/info/,
GET:<QueryDict: {}>,
POST:<QueryDict: {}>,
COOKIES:{},
META:{'CONTENT_LENGTH': '24',
'CONTENT_TYPE': 'application/json',
'CSRF_COOKIE': 'upJxA8TWO0nhKACr0dfU46Qyu0DzzUTR',
'DOCUMENT_ROOT': '/usr/share/nginx/html',
'HTTP_ACCEPT': '*/*',
'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch',
'HTTP_ACCEPT_LANGUAGE': 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
'HTTP_CONNECTION': 'keep-alive',
'HTTP_CONTENT_LENGTH': '24',
'HTTP_CONTENT_TYPE': 'application/json',
'HTTP_COOKIE': '',
'HTTP_HOST': '127.0.0.1:8000',
'HTTP_ORIGIN': 'chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo',
'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36',
'PATH_INFO': '/info/',
'QUERY_STRING': '',
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '53315',
'REQUEST_METHOD': 'POST',
'REQUEST_URI': '/info/',
'SCRIPT_NAME': '',
'SERVER_NAME': 'django',
'SERVER_PORT': '8000',
'SERVER_PROTOCOL': 'HTTP/1.1',
'uwsgi.node': b'',
'uwsgi.version': b'1.9.18.2',
'wsgi.errors': <_io.TextIOWrapper name=2 mode='w' encoding='UTF-8'>,
'wsgi.file_wrapper': <built-in function uwsgi_sendfile>,
'wsgi.input': <uwsgi._Input object at 0x7fa4ec6b8ee8>,
'wsgi.multiprocess': True,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 0)}>
并在浏览器中响应(与对服务器的请求相同):
{
"test":"test"
}
我做错了什么?
request.POST
and
request.POSt.dict()
返回空字典。
所以问题是如何在代码中获取 POST 数据以及为什么当我使用环境时它看起来如此不同?
UPD: return HttpResponse(str(request)) - 向我返回 WSGIRequest 对象而不是 POST 数据。但仍然不知道如何在代码中获取 POST 数据。
UPD2: uwsgi 配置:
[uwsgi]
module = mysite.wsgi
master = true
processes = 5
socket = :8001
daemonize = /var/log/uwsgi/mysite.log
touch-reload = /tmp/uwsgi-touch
post-buffering = 1
UPD3: 软件版本:
Python 3.3.2
Django 1.6.2
uWSGI 1.9.18.2
UPD4:
最终代码:
if request.method == "POST":
if request.META["CONTENT_TYPE"] == "application/json":
result = json.loads(request.body.decode())
else: result = request.POST.dict()
return HttpResponse(json.dumps(result), content_type="application/json")
这正是我想要的。 当我将数据发送到服务器时
POST
Content-Type: application/x-www-form-urlencoded
a=1
或:
POST
Content-Type: application/json
{"a":"1"}
我看到相同的响应(在代码变量中):
Content-Type: application/json
{"a": "1"}
【问题讨论】:
标签: django python-3.x uwsgi