【问题标题】:python urllib2 request is prepending newline chars to post datapython urllib2 请求在换行符之前添加以发布数据
【发布时间】:2014-05-31 23:37:22
【问题描述】:

我有一个简单的 python (2.7.5) 脚本,它使用 urllib2 将数据发布到服务器上的 django (1.6.2) 应用程序。当请求到达服务器时,已发布的值之一已被截断,并且其中一个字段名称添加了 CR/LF 前缀。这似乎是一个编码问题,但我不知道如何解决它。

python 脚本像这样发布到服务器:

auth = 'Basic ' + base64.encodestring('%s:%s' % (user, pwd))
header = {'Authorization': auth }

data = {
    'status': 'TEST',
    'activity_code': 'TEST',
    'sw_version': 'TEST',
    'timestamp': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}
data = urllib.urlencode(data)

request = urllib2.Request(url, data, header)
response = urllib2.urlopen(request)
result = json.loads(response.read())
print 'result = ', str(result), '\n'

在服务器上,有一个 django 应用程序像这样处理请求:

data = request.POST.copy()
error = {}

try:
    required = ['activity_code', 'timestamp', 'sw_version', 'status']
    for field in required:
        assert len(data.get(field)) > 0
except:
    error['message'] = 'required field is missing (' + field + ')'
    error['debug'] = data

if error:
    content = json.dumps(error, cls=DjangoJSONEncoder)
    return HttpResponse(content, content_type='application/json')

这是脚本收到服务器响应后的输出:

result = {u'debug': {u'timestamp': u'2014-04-16 14:22:15', u'\r\nstatus': u'TEST', u'activity_code': u'TEST', u'sw_version': u'TE'}, u'message': u'required field is missing (status)'}

请注意,status 字段名称不知何故以 CR/LF 为前缀,sw_version 值从“TEST”截断为“TE”。

为什么会这样??

【问题讨论】:

  • 如果errorFalse,您能否显示生成响应的行?
  • sw_version 被预先添加的相同字节数 (crlf) 截断,即 2,因此解决第一个将解决第二个。只是注意到
  • 复制前可以打印POST的内容吗?
  • 通过从 auth 标头值的末尾删除空格来修复,即auth = auth.rstrip()
  • 很高兴听到。请注意,encodestring 将在每 N 个字符处引入换行符。改用b64encode 可能更好。

标签: python django newline urllib2 urllib


【解决方案1】:

您没有打印header 变量的值,但如果header 值以\r\n 结尾,则可能会出现您描述的问题。原因如下:

HTTP 请求标头应以两个 \r\n (CRLF) 结尾,之后是 POST 数据。 urllib2 模块不会验证标头值以检查您的值中是否包含 CRLF。如果这样做,服务器会认为标头“过早”结束一个 CRLF。这将导致 POST 数据以实际标题结束标记的最后一个 CRLF 开始。这反过来会使 content-length 标头(计算原始帖子数据的长度)将帖子数据截断两个字符。

所以我建议仔细检查您的标题。

【讨论】:

  • 你成功了@Krumelur。我刚刚将 .rstrip() 添加到 auth 标头值并解决了问题。谢谢!
  • 我在上传到 pypi 时遇到了非常相似的问题。请参阅此处:stackoverflow.com/questions/33349391/… Ant 帮助将不胜感激
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2022-07-07
  • 2014-06-01
相关资源
最近更新 更多