1

私はFlaskにまったく慣れていません。pysphere ライブラリを使用してファイルを仮想マシンにコピーするコードがあります。これ自体は問題なく動作しますが、Flask アプリを使用しようとすると、次のようになります。

UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 2: ordinal not in range(128)

最初は、Web フォームが気に入らないものを渡しているからだと考えました。ただし、値をハードコーディングすることにしましたが、それでも失敗します。コードは次のとおりです。

@app.route('/begin_install', methods=['POST'])
def begin_install():
    source_installer_path = app.root_path + '/installers'
    installer_file = str(request.form['installer'])
    option_file_path = app.root_path + '/installers/options'
    option_file = 'testing.options'

    vmserver.start_install( request.form['vm'],
                        source_installer_path,
                        installer_file,
                        option_file_path,
                        option_file)

    return render_template('results.html')

次に、私のpysphere関連ファイルで:

def start_install(self, vmpath, installer_path, installer_file, options_path, options_file):
    vm.revert_to_named_snapshot('python_install')
    vm.power_on()
    while vm.get_tools_status() != 'RUNNING':
        sleep(3)
    vm.login_in_guest(self.guest_user, self.guest_password)
    vm.send_file('C:\\folder\\filetosend.exe', 'c:\\installer\\filename.exe')

「vm.send_file」までのすべてが完全に正常に動作します。Flask 以外のアプリから同じコードを呼び出しても、問題なく動作します。コードのこの部分がすべてpysphereであるのに、Flaskからエラーが発生する理由について非常に混乱しています。

編集:ここにトレースバックがあります

Traceback (most recent call last):
  File "C:\Users\username\Flask\lib\site-packages\flask\app.py", line 1701, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\username\Flask\lib\site-packages\flask\app.py", line 1689, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "C:\Users\username\Flask\lib\site-packages\flask\app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\username\Flask\lib\site-packages\flask\app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\username\Flask\lib\site-packages\flask\app.py", line 1358, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\username\Flask\lib\site-packages\flask\app.py", line 1344, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\python\PycharmProjects\installtest\installtest.py", line 51, in begin_install
    option_file)
  File "C:\python\PycharmProjects\installtest\testmachines.py", line 56, in start_install
    'c:\\installer\\filename.exe')
  File "C:\Users\username\Flask\lib\site-packages\pysphere\vi_virtual_machine.py", line 1282, in send_file
    resp = opener.open(request)
  File "C:\Python27\Lib\urllib2.py", line 400, in open
    response = self._open(req, data)
  File "C:\Python27\Lib\urllib2.py", line 418, in _open
    '_open', req)
  File "C:\Python27\Lib\urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "C:\Python27\Lib\urllib2.py", line 1215, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "C:\Python27\Lib\urllib2.py", line 1174, in do_open
    h.request(req.get_method(), req.get_selector(), req.data, headers)
  File "C:\Python27\Lib\httplib.py", line 958, in request
    self._send_request(method, url, body, headers)
  File "C:\Python27\Lib\httplib.py", line 992, in _send_request
    self.endheaders(body)
  File "C:\Python27\Lib\httplib.py", line 954, in endheaders
    self._send_output(message_body)
  File "C:\Python27\Lib\httplib.py", line 812, in _send_output
    msg += message_body
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 2: ordinal not in range(128)
4

1 に答える 1

0

pysphereトレースバックusesでわかるように、urllib2これは を使用していhttplibます。

私の知る限り、httplib はユニコード文字列をさらにチェックすることなく、http リクエスト全体を連結しています。また、Python は、一部が Unicode の場合、常に Unicode を返します。

あなたのパイスフィアは、メソッド内requestまたはメソッド内のいずれかでユニコードで汚染されていると思います:openersend_file

  ファイル「C:\Users\username\Flask\lib\site-packages\pysphere\vi_virtual_machine.py」、1282行目、send_file
    resp = opener.open(リクエスト)

resp の作成方法を確認する必要があります。インスタンスを構成vmし、おそらくどのヘッダーがユニコードであるか、requestまたはopenerインスタンス化にどのように影響するかを詳しく説明します。

于 2013-01-04T13:33:30.720 に答える