Flask:在视图之间传递列表变量而不使用会话

时间:2015-11-15 19:15:00

标签: python session flask

我想在Flask中的视图之间传递一个大的列表但是我不能把它放在会话中,因为它超过了4096字节的限制。有没有办法通过诸如此类的表格之类的方式在页面之间传递列表?

的Python:

@app.route('/send')
def send():
  list = ['item1', 'item2', 'item3', 'item4']
  return render_template('send.html', list=list)

@app.route('/receive', methods=['POST', 'GET'])
def receive():
  list = request.form['list']
  return render_template('receive.html')

send.html:

<form method="POST" action="{{ url_for('receive') }}">
  <input type="text" name="list" value="{{ list }}">
  <submit>Submit</submit>
</form>

这会有用吗?感谢。

2 个答案:

答案 0 :(得分:3)

我在视图之间传递一个大的列表时遇到了类似的问题。这就是我的所作所为:

import tempfile
import pickle
import shutil

mylist = ['a', 'b', 'c']

session['tempdir'] = tempfile.mkdtemp()
outfile = open(session['tempdir'] + '/filename', 'wb')
pickle.dump(mylist, outfile)
outfile.close()

要在另一个视图中检索列表:

infile = open(session['tempdir'] + '/filename', 'rb')
mylist = pickle.load(infile)
infile.close()

然后记得在完成后删除临时目录,文件和清除会话:

shutil.rmtree(session['tempdir'])
session.pop('tempdir', None)

答案 1 :(得分:2)

是的,它会起作用。

但是我认为这是不好的做法。 根据您的使用场景,我会在会话中存储唯一标识符,然后将其保存到本地存储。然后,您可以在第二个视图中恢复列表。但是,您需要一个方案来处理存储的列表。什么时候应该删除?在第二个视图中使用后?什么时候应该删除保存到磁盘但从未在第二个视图中使用的列表?哪个过程对此负责?