【问题标题】:Werkzeug test client and utf-8Werkzeug 测试客户端和 utf-8
【发布时间】:2014-02-05 17:37:22
【问题描述】:

这是代码。当我发送两个字段时,它都失败了。

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)

当我使用 Postman(Google Chrome 扩展程序)发送两个字段时,它工作正常。

可以吗,我应该用 unicode 用 base64 或其他东西包装字段吗?还是 werkzeug 测试客户端中的错误?

【问题讨论】:

    标签: flask werkzeug python-unicode


    【解决方案1】:

    看起来像测试客户端错误,当直接请求正常工作时,我已经有另一个测试客户端错误,但测试客户端有意外结果。

    对于https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/test.py#L71 中的我,我将string 输入为str。仅针对字符串不调用此方法,仅针对文件不使用您的字符串调用此方法。您可以尝试使用 next for python 2 临时更新此方法:

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

    我为您的示例创建了错误:https://github.com/mitsuhiko/flask/issues/973。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多