1

最終的には、ユーザーがファイルをアップロードするときに、ファイルを解析してからsave_url、その解析の出力を表示する新しいURLを(を使用して)作成するようにしたいと思います。

フォームをレンダリングするedit.ptは次のとおりです。

<form action="/add_page" method="post" accept-charset="utf-8" enctype="multipart/form-data">
<label for="stl">Stl</label>
<input name="stl" type="file" value="" />
<input type="submit" value="submit"/>
</form>

これがのadd_pageセクションですviews.py

@view_config(route_name='add_page', renderer='templates/edit.pt')
def add_page(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')]

    ordering=[]
    N=len(normals)

    ...(parsing data)...


    return data
    if data is None:
        displayNotification['please upload file']
    if 'stl' in request.params:
        name=request.params('name')
        page=Page(name,data)
        return HTTPFound(location=request.route_url('view_page',pagename=name))
    save_url=request.route_url('add_page',pagename=name)
    page=Page('','')
    return dict(page=page,save_url=save_url)

http://localhost:6543/add_page/newそして、 (新しいURLで新しいページを追加するために)に移動しようとすると、次のエラーが発生します。

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

このエラーは、の下の行で発生しますdef add_page(request):このチュートリアルから抜け出すようにフォーマットしています。

4

1 に答える 1

1

「フォーム送信時にデータを保存した後に行うこと」には、基本的に2つのシナリオがあります。

  1. データ(たとえば、ファイル解析の結果)を永続的なストレージ(データベース、そのファイルをアドレス指定するための一意のURI(たとえば/files/123123)を提供します)に保存します。次に、その場所にHTTPリダイレクトを発行します。

    @view_config(renderer="templates/form_view.pt")
    def form_view(self):
    
        if self.request.method == 'POST':
            if _validation_passed(request):
                new_url = _save_data(request)
                return HTTPFound(new_url)
            else:
                return _render_form(values=request.POST, msg="Validation failed")
    
        # We are a GET not a POST, render empty form
        return _render_form()
    

新しい「ページ」は永続的に保持されるため/files/123123、ブラウザでアクセスするだけで同じページが表示されます。

  1. または、ビューがHTTPポストを受信し、データを処理して、別のビューにリダイレクトする代わりに、他の「通常の」ビューと同じようにHTMLのblobを返します。これは、たとえば、フォームが検証に失敗し、フォームを再表示する場合に使用されますが、データをどこにも保存しない場合にも役立ちます。したがって、基本的にリダイレクト先のURIがありません。

    @view_config(renderer="templates/form_view.pt")
    def form_view(self):
    
        if self.request.method == 'POST':
            if _validation_passed(request):
                return _render_data(request)
            else:
                return _render_form(values=request.POST, msg="Validation failed")
    
        # We are a GET not a POST, render empty form
        return _render_form()
    

この場合、結果ページはファイルが送信された後にのみ表示されます。ファイルを再度表示するには、ユーザーはファイルを再アップロードする必要があります。

それらのパターンの1つに従うだけで、物事を整理することができます。

ファイルの送信にはさらに複雑な問題があります。通常、サーバー上の一時的な場所にファイルを保存するという工夫をしなければ、ファイルフィールドにデータが入力された状態でフォームを再表示することはできません。

于 2013-01-18T21:33:39.597 に答える