带有SQLite编码问题的Flask

时间:2012-11-09 19:27:30

标签: python sqlite encoding flask

我有以下代码将JSON数据插入SQLite数据库:

# POST request here
if request.headers['Content-Type'] == 'application/json':
    db = get_db()
    db.execute('insert into places (lat, long, address, name) values (?, ?, ?, ?)', [request.data[0], request.data[1], request.data[2], request.data[3]])
    db.commit()

并检索该数据:

# GET request here
if request.method == 'GET':
    db = get_db()
    cur = db.execute('select * from places order by id')
    entries = [dict(id=row[0], lat=row[1], long=row[2], address=row[3], name=row[4]) for row in cur.fetchall()]
    return repr(entries)

以及上面使用的get_db()方法:

def get_db():
    op = _app_ctx_stack.top
    if not hasattr(top, 'sqlite_db'):
        top.sqlite_db = sqlite3.connect(app.config['DATABASE'])
    return top.sqlite_db

以下是我正在做的示例cURL请求:

curl -H "Content-type: application/json" -X POST http://127.0.0.1:5000/location -d '{'lat':5, 'long':10, 'address':'street', 'name':'work'}'

尝试执行GET时如下:curl -X GET http://127.0.0.1:5000/location,我得到:

[{'lat': u'{', 'address': u'a', 'id': 1, 'long': u'l', 'name': u't'}]

我认为这是一个编码问题。关于我应该如何存储数据以避免这种情况的任何建议?这究竟是什么问题?

谢谢!

2 个答案:

答案 0 :(得分:0)

你可以尝试

repr(x).decode("utf-8") where x is your value

答案 1 :(得分:0)

以下代码是您要实现的功能的完整功能版本。有许多地方造成了问题。它们如下:

卷曲问题

您使用过单引号的json字符串,这是无效的json。 json字符串必须使用双引号。正确的电话应该是:

curl -H "Content-type: application/json" -X POST http://localhost:5000/location -d '{"lat":5, "long":10, "address":"street", "name":"work"}'

当我尝试解码json数据时,我在代码中遇到了这个问题,因为解码最初失败时它是无效的json。

插入数据问题

在您的代码中引用request.data[0],这实际上是您的json数据的第一个字符恰好是{字符,这就是为什么您一直将其视为lat字段的值。在下面的代码中,request.data被引用并反序列化为python字典。然后我们可以通过访问每个必需的字段来插入数据库行。要创建此代码中使用的数据库,您可以运行以下命令:

echo "CREATE TABLE places (id INTEGER PRIMARY KEY, lat text, long text, address text, name  text);" | sqlite3 places.db

您访问http://127.0.0.1:5000/location时获得的回复将是:

[(1, u'5', u'10', u'street', u'work')]

<强>码

from flask import Flask, request
import json, sqlite3

app = Flask(__name__)
@app.route('/location', methods=['GET', 'POST'])
def hello_world():
    conn = sqlite3.connect("places.db")
    cur = conn.cursor()
    if request.method == 'GET':
        cur.execute('SELECT * FROM places ORDER BY id')
        return repr(cur.fetchall())
    else:
        d = json.loads(request.data)
        row = (d['lat'], d['long'], d['address'], d['name'])
        cur.execute("""INSERT INTO places (lat, long, address, name)
                VALUES (?,?,?,?)""", row)
        conn.commit()
        return 'done\n'

app.run(debug=True)