0

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'}'

次のように a を実行しようとすると、GET次のようcurl -X GET http://127.0.0.1:5000/locationになります。

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

それはエンコーディングの問題だと思います。これを回避するためにデータを保存する方法について何かアドバイスはありますか? ここでの問題は正確には何ですか?

ありがとう!

4

2 に答える 2

0

あなたが試すことができます

repr(x).decode("utf-8") where x is your value
于 2012-11-09T19:48:26.157 に答える
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)
于 2012-11-09T22:04:05.593 に答える