flask.session正在将数据从一个视图丢失到另一个视图

时间:2019-08-28 10:17:39

标签: python flask

我正在编写一个非常简单的flask网络应用程序,以便来自我工作地点的测试人员可以在不下载项目的情况下测试我的深度学习模型。 它具有一个视图,该视图接收pdf文件和格式形式的字符串(深度学习模型的输入),另一个视图显示另一个字符串(深度学习模型的输出)。 我试图使用flask.session对象从第一个视图中选取数据并将其传递给第二个视图,然后将其存储在flask.g对象中,以便可以在神社模板。 我的问题是flask.session对象正在将数据从一个视图丢失到另一个视图。如何避免呢? 我对安全问题不是很担心,因为只有我工作中的测试人员才能访问该Web应用程序。 很抱歉,如果这个问题很愚蠢,我是一个新手。

我知道可能有最好的方法,但是我想使其尽可能简单,因为我只是在这样做,以便轻松地测试深度学习模型。

from flask import (
    Blueprint, flash, g, redirect, render_template, request, session, url_for
)

bp = Blueprint('book', __name__, url_prefix='/book')

@bp.route('/initialpage', methods=('GET', 'POST'))
def initialpage():
    if request.method == 'POST':
        book_file = request.form['book']
        parsed = parser.from_file(book_file)
        book = parsed["content"]

        question = request.form['question']
        error = None

        if not book:
            error = 'Book is required.'
        elif not question:
            error = 'Question is required.'

        if error is None:
            session.clear()
            session['book'] = book
            session['question'] = question
            print(session['question'])
            return redirect(url_for('book.finalpage'))

        flash(error)

    return render_template('book/initialpage.html')


@bp.route('/finalpage')
def finalpage():
    book_body = session.get('book')
    book_question = session.get('question')

    if book_body is None:
        g.book = None
    elif book_question is None:
        g.question = None
    else:
        g.book = book_body
        g.question = book_question

    return render_template('book/finalpage.html')

session['book']session['question']传递时,存储在'/initialpage''/finalpage'中的数据丢失。

1 个答案:

答案 0 :(得分:1)

我终于设法解决了这个问题! 以我为例,我认为问题在于我的数据太大,无法通过flask.session传递。我发现大多数浏览器不支持大于4000字节的会话cookie,我的数据约为10 MB。 所以我的想法是创建一个数据库来存储数据,并通过flask.session仅传递一个ID(允许在数据库中查找数据)。 作为数据库,我使用了Python SQLite3。 连接到数据库和初始化数据库的功能被编码在一个单独的文件中。 代码如下:

from flask import (
    Blueprint, flash, g, redirect, render_template, request, session, url_for
)

from flaskr.db import get_db

bp = Blueprint('book', __name__, url_prefix='/book')

@bp.route('/initialpage', methods=('GET', 'POST'))
def initialpage():
    if request.method == 'POST':
        book_file = request.form['book']
        parsed = parser.from_file(book_file)
        book = parsed["content"]
        question = request.form['question']
        db = get_db()
        error = None

        if not book:
            error = 'Book is required.'
        elif not question:
            error = 'Question is required.'

        if error is None:
            if db.execute('SELECT book, question FROM bq').fetchone() is None:
                db.execute('INSERT INTO bq (book, question) VALUES (?, ?)',(book, question))
                db.commit()

            bq = db.execute('SELECT * FROM bq WHERE (book, question) = (?, ?)',(book, question)).fetchone()
            session.clear()
            session['bq_id'] = bq['id']
            print(bq['id'])
            return redirect(url_for('book.finalpage'))

        flash(error)

    return render_template('book/initialpage.html')


@bp.route('/finalpage')
def finalpage():
    bq_id = session.get('bq_id')
    print(bq_id)

    if bq_id is None:
        g.bq = None
    else:
        g.bq = get_db().execute('SELECT * FROM bq WHERE id = ?', (bq_id,)).fetchone()

    return render_template('book/finalpage.html')```
相关问题