2014-02-05 39 views
3

以下是代碼。當我發送兩個字段失敗。Werkzeug測試客戶端和utf-8

import unittest 

class UnicodeTestCase(unittest.TestCase): 
    def test_unicode(self): 
     from cStringIO import StringIO 
     from flask import Flask, request 

     app = Flask(__name__) 
     app.config['TESTING'] = True 

     @app.route('/', methods=["POST"]) 
     def test_view(): 
      print request.values, request.files 
      return "OK" 

     file = (StringIO("0" * 1000), "filename.txt") 
     string = u"∆_∆" 

     client = app.test_client(use_cookies=False) 
     self.assertEquals(200, client.post('/', data={'file': file}).status_code) 
     self.assertEquals(200, client.post('/', data={'string': string}).status_code) 
     self.assertEquals(200, client.post('/', data={'file': file, 'string': string}).status_code) 

在最後斷言它失敗:

Error 
Traceback (most recent call last): 
    File "/Users/user1/tests/test_uni.py", line 108, in test_unicode 
    self.assertEquals(200, client.post('/', data={'file': file, 'string': string}).status_code) 
    File "/Users/user1/.virtualenvs/test/lib/python2.7/site-packages/werkzeug/test.py", line 771, in post 
    return self.open(*args, **kw) 
    File "/Users/user1/.virtualenvs/test/lib/python2.7/site-packages/flask/testing.py", line 108, in open 
    follow_redirects=follow_redirects) 
    File "/Users/user1/.virtualenvs/test/lib/python2.7/site-packages/werkzeug/test.py", line 725, in open 
    environ = args[0].get_environ() 
    File "/Users/user1/.virtualenvs/test/lib/python2.7/site-packages/werkzeug/test.py", line 535, in get_environ 
    stream_encode_multipart(values, charset=self.charset) 
    File "/Users/user1/.virtualenvs/test/lib/python2.7/site-packages/werkzeug/test.py", line 104, in stream_encode_multipart 
    write('\r\n\r\n' + value) 
    File "/Users/user1/.virtualenvs/test/lib/python2.7/site-packages/werkzeug/test.py", line 71, in write 
    write_binary(string.encode(charset)) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 4: ordinal not in range(128) 

它,當我送與郵差(谷歌的Chrome擴展),這兩個領域工作正常。

是否可以,我應該使用unicode與base64或其他東西包裝領域?或者它是werkzeug測試客戶端中的錯誤?

回答

0

看起來像測試客戶端錯誤,當直接請求工作正常時,我已經與測試客戶端有另一個錯誤,但測試客戶端有意想不到的結果。

對我而言https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/test.py#L71我有string類型爲str。對於字符串只有這個方法沒有被調用,對於文件只有這個方法不會用你的字符串調用。您可以嘗試臨時更新該法未來只有蟒2:

def write(string): 
    if isinstance(string, str): 
     write_binary(string) 
    else: 
     write_binary(string.encode(charset)) 

我創建錯誤的你的例子:https://github.com/mitsuhiko/flask/issues/973

+0

Armin修復了這個錯誤,感謝您的幫助 –

+0

您已經對werkzeug有問題,所以不是這樣。 – tbicr