如何使用flask和python将字典列表写入文件?

时间:2017-11-24 13:43:03

标签: python flask

我想使用flask向文本文件(在磁盘上)添加/写入信息(只有python程序可以正常工作,但是当我实现它时,其余的都没有发生)。

view.py

@app.route('/add', methods=['GET','POST'])
def add_entry():

    if request.method == 'POST':
        filename = request.form['file_name']

        read_file(filename) #returns a dictionnary list 
        write_file(filename)
        return redirect(url_for('index'))
    else :
        return render_template("file_add.html",title='Add a file', items=items)

function.py

def write_file(filename):

    with open("app/static/DATA/{}".format(filename), "w") as f:
        global items

        items2 = [{ 'fixed_address': request.form['mac_address'],
                    'hardware': request.form['ip_address'],
                    'host': request.form['host_name'],
                    'comment': request.form['comment']}]
        items.append(items2)
        f.write(items)

提交时没有任何反应,文件保持不变。我究竟做错了什么? 我看到f.write()可能不适用于字符串旁边的其他内容,但即使其他解决方案也不起作用,f.write('random_string')也不会做任何事情。

1 个答案:

答案 0 :(得分:0)

1) request obj传递给您的函数,以便在其正文中使用它来检索POST参数。在你的代码中(当你没有将request obj传递给你的写函数时)你无法获得所需的参数,因为request不是写函数体中的烧瓶请求对象,只是一个未定义的var。要在函数体中使用flask请求obj,您需要将其作为第二个参数传递:

view.py:

@app.route('/add', methods=['GET','POST'])
def add_entry():

    if request.method == 'POST':
        filename = request.form['file_name']

        read_file(filename) #returns a dictionnary list 
        write_file(filename, request)
        return redirect(url_for('index'))
    else :
        return render_template("file_add.html",title='Add a file', items=items)

function.py:

def write_file(filename, request):

    with open("app/static/DATA/{}".format(filename), "w") as f:
        global items

        items2 = [{ 'fixed_address': request.form['mac_address'],
                    'hardware': request.form['ip_address'],
                    'host': request.form['host_name'],
                    'comment': request.form['comment']}]
        items.append(items2)
        f.write(items)

2)始终在with open("app/static/DATA/{}".format(filename), "w") as f:

使用完整路径

3)使用 json.dump()将数据写入文件:

import json

obj = [{"123": "123"}]    

with open("<full_path>", "w") as f:
    json.dump(obj, f, indent=4)

4)请勿使用filename = request.form['file_name'] - 改为使用filename = request.form.get('file_name')