【问题标题】:Different environment in wsgi request objectwsgi请求对象中的不同环境
【发布时间】: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


    【解决方案1】:

    看起来你是在发布 JSON 数据,而不是 HTML 表单数据。

    在这种情况下,您正在寻找原始帖子数据,访问方式如下:

    request.body
    

    请参阅文档中的HttpRequest.body

    如果你想解析那个 JSON 字符串,使用这个:

    import json
    data = json.loads(request.body)
    

    request.POST 字典仅在请求包含表单数据时填充。这是Content-Type 标头为application/x-www-form-urlencodedmultipart/form-data 时。

    【讨论】:

    • 是的,它的 json。我认为它只是字符串或 QueryDict 对象。但是为什么 print() 和 HttpResponse() 的结果存在差异?为什么它不是相同的 WSGIRequest 或 POST 对象? – Alex T 31 分钟前
    • ehh...我的意思是为什么我在 HttpResponse(request) 和 print(request) 之间看到不同的结果?
    • return HttpResponse(request) 应该返回一个空响应,因为 request 不是字符串。 print(request) 将打印请求的表示,因为它会在输出之前自动调用str(request)
    • 但是 return HttpResponse(request) 返回 POST 的内容,我的意思是 request.POST 的内容,我想在我的代码中获取:>
    • 你使用的是什么版本的 Django?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2021-11-07
    相关资源
    最近更新 更多