6

URL の変更に関して非常に基本的な質問があります。http://example.com/createいくつかの入力フィールドを持つフォームを含むHTML ページがあるとします。http://example.com/show_listこの入力フィールドから、python のリスト値に基づいたリストを含む別の HTML ページを生成するために使用する python リストを作成したいと考えています。

したがって、ビューhttp://example.com/createは次のとおりです。

@app.route('/create', methods=['GET', 'POST']) 
def create():

if request.method == 'POST':
    some_list = parse_form_data_and_return_list(...)
    return render_template( "show_list.html", some_list=some_list)  #here's the problem!

return render_template( "create.html")

がユーザー入力をparse_form_data_and_return_list(...)受け取り、いくつかの値を含むリストを返すとしstringます。気になる行にコメントを追加しました。すぐに戻ってきますが、最初にhttp://example.com/show_list、ユーザー入力の後にロードする必要があるページ ( )のテンプレートを提供します。

{% block content %}
<ul class="list">       
  {% for item in some_list %}
    <li>
        {{ item }}
    </li>
  {% endfor %}
</ul>
{% endblock content %}

基本的にこれでうまくいきます。リストの値が Jinja テンプレートに「渡され」、リストが表示されます。

render_templateもう一度ルート メソッドを確認すると、ページを表示するためだけに行っていることがわかりshwo_listます。私にとって、これには1つの欠点があります。URL は に変更されませんがhttp://example.com/show_list、 のままhttp://example.com/createです。

そこで、次のテンプレートを直接レンダリングする代わりに、メソッド呼び出しで独自のrouteforshow_listと inを作成することを考えました。このような:create()redirect

@app.route('/show_list')
def tasklist_foo():
return render_template( "show_list.html" )

listしかし、この場合、オブジェクトを に渡す方法がわかりませんshow_list()。もちろん、リストのすべての項目を URL に解析することもできます (したがって、に投稿しますhttp://example.com/show_list) が、それは私がやりたいことではありません。

すでにお気づきかもしれませんが、私は Web 開発に関してかなりの初心者です。間違ったパターンを使用しただけか、トリックを実行する単純な API 関数が見つからなかったと思います。そこで、私の問題を解決する方法を教えてください (簡単に要約します): テンプレートをレンダリングし、メソッド/ルートで作成されたリストを使用するshow_listように URL を変更します。http://example.com/createhttp://example.com/show_listcreate()

4

2 に答える 2

10

リストがそれほど長くない場合は、クエリ文字列で渡すことができます。たとえば、カンマで区切られます。

comma_separated = ','.join(some_list)
return redirect(url_for('show_list', some_list=comma_separated))
# returns something like 'http://localhost/show_list?some_list=a,b,c,d'

次に、ビューのテンプレートで、次のように反復できます。

{% for item in request.args.get('some_list', '').split(',') %}
    {{ item }}
{% endfor %}

より長いリストの場合、またはクエリ文字列で公開したくない場合は、リストをセッションに保存することもできます。

session['my_list'] = some_list
return redirect(url_for('show_list'))

次に、テンプレートで:

{% for item in session.pop('my_list', []) %}
    {{ item }}
{% endfor %}
于 2013-08-13T10:33:36.620 に答える
0

リストをセッションに保存するだけでなく、フォーム アクションを変更して新しいルートに投稿することもできます。次に、「show_list」ルート内からフォーム データを処理し、テンプレートをレンダリングします。

フォームの見出し:

<form action="{{ url_for('show_list') }}" method="post">

更新された show_list ルート:

@app.route('/show_list', methods=['GET', 'POST']) 
def show_list():
    if request.method == 'POST':
        some_list = parse_form_data_and_return_list(...)
        return render_template("show_list.html")
    else:
        # another way to show your list or disable GET
        return render_template("show_list.html")

私は必ずしもセッション ストレージの使用に反対しているわけではありませんが、セッション変数のクリアについて心配する必要がないため、使用しない方がクリーンだと思います。

于 2014-08-12T15:29:35.050 に答える