在Flask中获取用户创建的列表

时间:2018-04-08 16:56:55

标签: javascript python jquery html flask

我的目标是让用户在项目框中输入项目,点击"添加"并将该项添加到列表中。用户应输入X项目数量,然后单击“提交”。然后我想用python来操作那个项目列表。

这是我的HTML模板的样子:

<!DOCTYPE html>
<html>
    <head>
        <title> Foo </title>
    </head>
    <body>
        <form action="" method="post">
            <div class="input text" id = "items">
                {{ form.item.label }} {{form.item}}

            </div>

            <input type="button" id="btnAdd" value="Add" onclick="addItem()">

            <ul id = "itemlist" name = "itemlist">
            </ul>
            <script>
                function addItem(){
                    var ul = document.getElementById("itemlist");
                    var li = document.createElement("li")
                    var children = ul.children.length + 1
                    li.setAttribute("id", "item"+children)
                    var input = item.value;
                    li.appendChild(document.createTextNode(input));
                    ul.appendChild(li)

                }
            </script>

            <div class="input submit">
                <input type="submit" value="Submit" />
            </div>
        </form>
    </body>
</html>

这就是我目前的Python脚本:

from flask import Flask, render_template, flash, request
from wtforms import Form, TextField, TextAreaField, validators, StringField, SubmitField
from bs4 import BeautifulSoup
import requests

DEBUG = True
app = Flask(__name__)
app.config.from_object(__name__)

class ReusableForm(Form):
    item = TextField('Item:', validators=[validators.required()])



@app.route("/", methods=['GET', 'POST'])
def foo():
    form = ReusableForm(request.form)
    if request.method == 'POST':
        content = request.form['itemlist']
        print(content)
    return render_template('index.html', form=form)

if __name__ == "__main__":
    app.run()

主要问题在于我的&#34; content = request.form [&#39; itemlist&#39;]&#34;线。当单击“提交”按钮时,我似乎无法找到将列表从html传递到python的好方法。我后来的目标是为用户创建的列表中的项目抓取特定网站。

1 个答案:

答案 0 :(得分:0)

这是因为flask表单有item但不是itemlist,因此它无法识别您的请求。你可以这样做:

@app.route("/", methods=['GET', 'POST'])
def foo():
    form = ReusableForm(request.form)
    if request.method == 'POST':
        content = request.form['item']
        print(content)
    return render_template('index.html', form=form)

HOWEVER 这不起作用,因为它只会打印项目列表中的最后一项。因为输入flask表单的最后一件事是item列表中的最后一项。不幸的是,我无法找到解决这个确切问题的方法,因为有时烧瓶形式有一些奇怪的不良行为。但是,TextAreaForm如果您想要使用它,则会完成与您打算做的完全相同的事情:

from flask import Flask, render_template, flash, request
from wtforms import Form, TextField, TextAreaField, validators, StringField, SubmitField
from bs4 import BeautifulSoup
import requests

DEBUG = True
app = Flask(__name__)
app.config.from_object(__name__)

class ReusableForm(Form):
    items = TextAreaField('Item:', validators=[validators.required()])

@app.route("/", methods=['GET', 'POST'])
def foo():
    form = ReusableForm()
    if request.method == 'POST':
        items = [x.strip() for x in request.form["items"].split("\r\n") if x != '']
        print(items)
    return render_template('index.html', form=form)


if __name__ == "__main__":
    app.run()

使用以下HTML

<!DOCTYPE html>
<html>
    <head>
        <title> Foo </title>
    </head>
    <style>
            label.textarea-label { vertical-align: top; }
    </style>
    <body>
        <form action="" method="post">
            <label id="items" class="textarea-label">Items:</label>
                    {{ form.items(placeholder="Items", rows=8) }}
                    {% for error in form.items.errors %}
                         <span style="color: red;">[{{ error }}]</span>
                    {% endfor %}<br>
            <div class="input submit">
                <input type="submit" value="Submit" />
            </div>
        </form>
    </body>
</html>