0

今私はこのフォームを持っています:

<form action="/store_stl_data" method="post" accept-charset="utf-8"
      enctype="multipart/form-data">

    <label for="stl">STL</label>
    <input id="stl" name="stl" type="file" value="" />

    <input type="submit" value="submit" />
</form>

それから私のviews.py中に

@view_config(route_name='store_stl_data', renderer='templates/edit')

def store_stl_data(request):
    input_file=request.POST['stl'].file
    i1, i2 = itertools.tee(input_file)
    vertices = [map(float, line.split()[1:4])
                for line in i1
                if line.lstrip().startswith('vertex')]

    normals = [map(float, line.split()[2:5])
                for line in i2
                if line.lstrip().startswith('facet')]

        ...(parsing data)...
    return data

下の3行def store_stl_data(request):は、私が最も確信が持てない行です。このチュートリアルから入手しました。

store_stl_data人々がファイルをアップロードするときに、関数全体が実行され、入力ファイルを処理するようにしたいと思います。

今、それは私にエラーを与えます:

KeyError: "No key 'stl': Not a form request"

また、ここに私のルートがあり__init__.pyます:

from pyramid.config import Configurator
from sqlalchemy import engine_from_config

from .models import (
    DBSession,
    Base,
    )


def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.bind = engine
    config = Configurator(settings=settings)
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_route('view_wiki', '/')
    config.add_route('view_page', '/{pagename}')
    config.add_route('add_page', '/add_page/{pagename}')
    config.add_route('edit_page', '/{pagename}/edit_page')
    config.scan()
    return config.make_wsgi_app()
4

1 に答える 1

1

リクエストから取得した.fileオブジェクトは、すでに開いているファイル (のような) オブジェクトです。

リンク先のドキュメントの例をよく見ると、アップロードのファイル名を使用して新しいファイルが作成され、アップロードされたファイルを使用してその新しいファイルにデータが書き込まれます。input_fileそのコードで開かれることはなく、開かれるだけoutput_fileです(変数名が異なることに注意してください)。

ファイル オブジェクトを閉じる必要もないため、nowithも必要ありません。コードは次のように簡略化できます。

def store_stl_data(request):
    input_file=request.POST['stl'].file
    i1, i2 = itertools.tee(input_file)
    vertices = [map(float, line.split()[1:4])
                for line in i1
                if line.lstrip().startswith('vertex')]

    normals = [map(float, line.split()[2:5])
                for line in i2
                if line.lstrip().startswith('facet')]

私は個人的にはこれを使用しませんが、頂点の構築中itertools.teeにファイル全体をバッファーに読み込んでいます。tee

代わりに、単一のループを使用します。

def store_stl_data(request):
    input_file=request.POST['stl'].file
    vertices, normals = [], []
    for line in input_file
        parts = line.split()
        if parts[0] == 'vertex':
            vertices.append(map(float, parts[1:4]))
        elif parts[0] == 'facet':
            normals.append(map(float, parts[2:5]))

一度に 1 つの行だけがメモリに保持されるようになりました (頂点と法線の構造も)。

:KeyError: No key '...': Not a form requestエラー メッセージが表示された場合、ビューはHTTP 要求を受信して​​いません。POSTフォームメソッドがに設定されていることを再確認してください"POST"(大文字と小文字は関係ありません)。

于 2013-01-17T15:11:55.783 に答える