Django中的request.POST和request.body

=Start=

缘由:

之前其实没想过Django中的request.POST和request.body有什么不同,最近踩了些坑,才知道,原来两者还是有区别的,一不小心就容易出错。

所以在此记录一下,方便以后参考。

正文:

参考解答:

下面是class HttpRequest(object)中获取POST QueryDict的函数部分:

这里主要关注后面的 if elif else这三个分支即可,从 elif self.content_type == 'application/x-www-form-urlencoded':这个分支能看到只有请求header中的 'Content-Type':'application/x-www-form-urlencoded'才会填充request.POST,其它情况下只有一个空的 <QueryDict: {}>

测试、验证如下:

urls.py的配置很简单,在这里暂且略去。下面是用curl发测试请求的命令及其返回:

对应的Server端收到的Content-Type分别是:

几个心得、注意事项:

  • 能用 .get('key_name') 方式的就不要用 ['key_name'] 的方式;
  • 将任何可能出现Exception的地方都放在合适的try..catch中;
  • 测试多一点,问题少一点;
  • 监控多一点,睡得安心点;
  • 对核心接口一定要做好能力容量预估、管理;
  • 不怕出错,就怕出错了还不知道原因在哪;

 

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/3927.html

《Django中的request.POST和request.body》上有1条评论

  1. Django的request对象里包含的header信息
    https://docs.djangoproject.com/en/2.0/ref/request-response/#django.http.HttpRequest.META

    # 一个获取请求来源IP的方式
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
    ip = request.META['HTTP_X_FORWARDED_FOR']
    elif request.META.has_key('REMOTE_ADDR'):
    ip = request.META['REMOTE_ADDR']
    else:
    ip = ''

    CONTENT_LENGTH – The length of the request body (as a string).
    CONTENT_TYPE – The MIME type of the request body.
    HTTP_ACCEPT – Acceptable content types for the response.
    HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
    HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
    HTTP_HOST – The HTTP Host header sent by the client.
    HTTP_REFERER – The referring page, if any.
    HTTP_USER_AGENT – The client’s user-agent string.
    QUERY_STRING – The query string, as a single (unparsed) string.
    REMOTE_ADDR – The IP address of the client.
    REMOTE_HOST – The hostname of the client.
    REMOTE_USER – The user authenticated by the Web server, if any.
    REQUEST_METHOD – A string such as "GET" or "POST".

发表评论

电子邮件地址不会被公开。 必填项已用*标注