как использовать метод множественных запросов в Flask

#python #flask

#python #flask

Вопрос:

У меня есть текстовое поле и функции загрузки файлов. Теперь, когда я хочу использовать загрузку файла, method.request ссылается на текстовую область и выдает сообщение об ошибке, как справиться с этой проблемой.

 @app.route('/',methods = ['GET','POST'])
def upload_route_summary():
    if request.method == 'POST':
        if request.files['file'] is True:
           # Create variable for uploaded file
            file = request.files['file']
            file.save(os.path.join("uploaded", file.filename))
            return render_template('home.html', message='uploaded successfully')
    return render_template('home.html', message='upload')
 

и вторая функция предназначена для того, чтобы текстовая область принимала ввод и отображалась в таблице.

 @app.route('/', methods=['GET', 'POST'])
def root():
    if request.method == 'GET':
        return render_template('home.html')
    elif request.method == 'POST':
        results = []

        user_csv = request.form.get('user_csv').split('n')
        reader = csv.DictReader(user_csv)

        for row in reader:
            results.append(dict(row))

        fieldnames = [key for key in results[0].keys()]

        return render_template('home.html', results=results, fieldnames=fieldnames, len=len)
 

Вот home.html файл:

 <div class="card">
<div class="card-body" >
<form method="post" enctype=multipart/form-data>
  <textarea class="form-control" rows="5" name="user_csv"> 
 </textarea>
  <button class="btn btn-success mt-2">Render CSV</button>
  <input class="btn btn-success mt-2" type="file" name='file'/>
  <input class="btn btn-success mt-2" type="submit">
 </form>
 <p>
 {{message}}
 </p>
 <div class="mt-4">
  {% if request.method == 'POST'%}
    <table id="proxies" class="display table nowrap responsive" 
    style="width: 100%">
      <thead>
        <tr>
          {% for header in results[0].keys() %}
            <th>{{header}}</th>
          {% endfor %}
        </tr>
      </thead>
      <tbody>
        {% for row in results %}
          <tr>
            {% for index in range(0, len(fieldnames)) %}
              <td>{{row[fieldnames[index]]}}</td>
            {% endfor %}
          </tr>
        {% endfor %}
      </tbody>
    </table>
  {% endif %}
 </div>
 </div>
</div>
</body>
 

и вот ошибка, которую я получаю, когда я использовал для загрузки файла. Поскольку обе функции имеют один и тот же POST-запрос, и когда я нажимаю на кнопку отправки, это ссылается на POST-запрос, который принадлежит текстовой области.

 AttributeError
AttributeError: 'NoneType' object has no attribute 'split'
 

Ответ №1:

Из того, что вы опубликовали, эта строка вызывает эту конкретную проблему:

 user_csv = request.form.get('user_csv').split('n')
 

Я предполагаю request.form , что это дает вам a dict , для которого вы вызываете get метод.

get — это безопасный метод для запроса dict , который имеет два параметра keyname и value .

Все, что было сказано, в случае, если ваш request.form не содержит 'user_csv' его, вернет значение по умолчанию, которое None — таким образом, ошибка:

 AttributeError: 'NoneType' object has no attribute 'split'
 

Решение — отправить полный запрос со всеми параметрами.

Комментарии:

1. Что означает «полный запрос со всеми параметрами» У меня есть параметр для загружаемого файла, и я упомянул это внутри метода. Можете ли вы объяснить на примере?

Ответ №2:

Вы правы, ошибка возникает из-за того, что у вас есть две формы на одной странице, и ваш post-запрос заканчивается пустым. В общем, распространенной ошибкой является использование нескольких форм и кнопок отправки на одной HTML-странице. Либо разделите свои формы на разные Html-страницы, либо используйте атрибут action следующим образом.

 <form name="demo" action="/target_location" method="post">