2014-02-05 21 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