#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">