簡體   English   中英

python urllib2請求在換行符之前添加數據

[英]python urllib2 request is prepending newline chars to post data

我有一個使用urllib2將數據發布到服務器上的django(1.6.2)應用程序的簡單python(2.7.5)腳本。 當請求到達服務器時,已發布的值之一已被截斷,並且其中一個字段名稱已添加了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 ,並且sw_version值從“ TEST”截斷為“ TE”。

為什么會這樣?

您沒有打印header變量的值,但是如果header值以\\r\\n結尾,則可能會出現您描述的問題。 原因如下:

HTTP請求標頭應以兩個\\ r \\ n(CRLF)結尾,之后是POST數據。 urllib2模塊將不會驗證標頭值來檢查您的值中是否包含CRLF。 如果這樣做,則服務器認為標頭以“太早”結束一個CRLF。 這將導致POST數據以實際標頭結束標記的最后一個CRLF開始。 反過來,這將使content-length標頭(計算原始文章數據的長度)以兩個字符截斷文章數據。

因此,我建議您仔細檢查標題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM