(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)
以上是期望的意图,其中filename
被刮除功能所知。显然情况还不是这样。如果upload_file()
已经在肯定的情况下(确认页面)具有返回值,我该如何使filename
可用? UPLOAD_FOLDER
将不仅包含上传的文件,因此我无法加入此路径中的任何内容。
如果这是一个非Flask程序,我可能会返回locals()
然后访问相应的密钥,但我想如果我想维持确认页面的提供,那么这里是不可能的
答案 0 :(得分:1)
您需要以某种方式连接两个请求。如果许多用户请求第一个用户,则有人请求/scrape
,您如何知道哪个用户正在请求,以及他属于哪个文件名?
/scrape
时,您可以从用户会话中检索文件名。在任何一种情况下,尤其是后者,考虑文件的所有权非常重要:哪个用户可以访问系统中的哪个文件?
答案 1 :(得分:0)
在upload_file()
中挑选文件名,在scrape()
中取消选中。
PICKLED_CSV_FILENAME = 'pickled_csv_file_name'
def pickle_filename(filename, pickle_file):
with open(os.path.join(UPLOAD_FOLDER, pickle_file),'wb') as p:
pickle.dump(filename, p)
def load_pickled_filename(pickle_file):
return pickle.load(open(os.path.join(UPLOAD_FOLDER, pickle_file), 'rb'))
upload_file()
中的:
pickle_filename(filename, PICKLED_CSV_FILENAME)
然后在scrape()
:
jobs = scraper.scrape(os.path.join(app.config['UPLOAD_FOLDER'], load_pickled_filename(PICKLED_CSV_FILENAME)), keywords)
pickle_filename(filename,PICKLED_CSV_FILENAME)
对于许多用户/文件来说,显然不是一个可持续的解决方案,但它是单个用户,单个文件的场景,所以它是可以接受的。