(Flask新手提醒)
按照以下步骤在 Flask 中上传和保存文件:
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return render_template_string('''
{% extends "base.html" %}
{% block content %}
<h4>File uploaded</h4>
<p><a href={{ url_for('members_page') }}>Back</a></p>
{% endblock %}
''')
elif not allowed_file(file.filename):
return render_template_string('''
{% extends "base.html" %}
{% block content %}
<h3>Please try again</h3>
<h4>File must be a .csv</h4>
<p><a href={{ url_for('upload_file') }}>Back</a></p>
{% endblock %}
''')
return render_template_string('''
{% extends "base.html" %}
{% block content %}
<h4>Upload CSV of Company/URL data</h2>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" />
</form>
{% endblock %}
''')
我希望使filename
在另一个函数中可用:
@app.route('/scrape', methods=['GET', 'POST'])
@login_required # Use of @login_required decorator
def scrape():
parser = ConfigParser()
parser.read('config.ini')
keywords = parser.get('scrape', 'keywords').replace(' ', '').split(',')
jobs = scraper.scrape(os.path.join(app.config['UPLOAD_FOLDER'], filename), keywords)
以上是期望的意图,其中文件名
由scrape函数已知。显然情况还不是这样。由于 upload_file()
在肯定情况下(确认页面)已经有返回值,如何使 filename
可用? UPLOAD_FOLDER
将不仅仅包含上传的文件,因此我不能只将该路径与其中的任何内容连接起来。
如果这是一个非 Flask 程序,我可能会返回 locals()
然后访问适当的 key ,但我想如果我想维持确认的服务,这是不可能的页。
您需要以某种方式连接两个请求。如果很多用户请求第一个,然后有人请求 /scrape
,你怎么知道是哪个用户在请求,他属于哪个文件名?
- 您可以使用 session (例如 Cookie session ,请参阅 http://pythonhosted.org/Flask-Session/ )来跟踪上传的文件。将文件名存储在 session 中,当同一用户(具有相同的 cookie)请求
/scrape
时,您可以从用户 session 中检索文件名。
- 您可以在第二个请求中包含要使用的文件名。这样,用户自己就必须跟踪他上传的文件。
无论哪种情况,尤其是后者,考虑文件的所有权都很重要:哪个用户有权访问系统上的哪个文件?
我是一名优秀的程序员,十分优秀!