从Flask POST传递的结果不仅仅是结果页面

时间:2016-02-24 19:18:50

标签: python flask flask-wtforms werkzeug

(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()然后访问相应的密钥,但我想如果我想维持确认页面的提供,那么这里是不可能的

2 个答案:

答案 0 :(得分:1)

您需要以某种方式连接两个请求。如果许多用户请求第一个用户,则有人请求/scrape,您如何知道哪个用户正在请求,以及他属于哪个文件名?

  1. 您可以使用会话(例如,Cookie会话,请参阅http://pythonhosted.org/Flask-Session/)来跟踪上传的文件。将文件名存储在会话中,当同一用户(具有相同的cookie)请求/scrape时,您可以从用户会话中检索文件名。
  2. 您可以包含要在第二个请求中使用的文件名。这样,用户自己必须跟踪他上传的文件。
  3. 在任何一种情况下,尤其是后者,考虑文件的所有权非常重要:哪个用户可以访问系统中的哪个文件?

答案 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)

对于许多用户/文件来说,显然不是一个可持续的解决方案,但它是单个用户,单个文件的场景,所以它是可以接受的。