构造API的JSON请求

2024-09-30 20:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个小API,以便与其他项目的数据库进行交互。我已经建立了数据库,API运行良好,但是,我得到的数据并不是我想要的结构。你知道吗

我将Python与Flask/Flask Restful一起用于API。 下面是处理交互的Python片段:

class Address(Resource):
    def get(self, store):
        print('Received a request at ADDRESS for Store ' + store )
        conn = sqlite3.connect('store-db.db')
        cur = conn.cursor()
        addresses = cur.execute('SELECT * FROM Sites WHERE StoreNumber like ' + store)     
        for adr in addresses:
            return(adr, 200)

如果我向/sites/42端点发出请求,其中42是站点id,我将收到:

[
    "42",
    "5000 Robinson Centre Drive",
    "",
    "Pittsburgh",
    "PA",
    "15205",
    "(412) 787-1330",
    "(412) 249-9161",
    "",
    "Dick's Sporting Goods"
]

以下是它在数据库中的结构: enter image description here

最终,我希望使用列名作为接收到的JSON中的键,但是我需要一点正确方向的指导,这样我就不会在google上搜索模棱两可的术语,希望找到一些东西。你知道吗

下面是向该端点发出请求后希望接收的内容的示例:

{
    "StoreNumber": "42",
    "Street": "5000 Robinson Centre Drive",
    "StreetSecondary": "",
    "City": "Pittsburgh",
    "State": "PA",
    "ZipCode": "15205",
    "ContactNumber": "(412) 787-1330",
    "XO_TN": "(412) 249-9161",
    "RelocationStatus": "",
    "StoreType": "Dick's Sporting Goods"
}

我只是想得到一些指导,看看我是否应该改变我的数据在数据库中的结构(也就是说,我看到一些人只是把JSON放在他们的数据库中,但我认为这很混乱),或者是否有一个更直观的方法可以用来控制我的数据。你知道吗

使用接受答案更新代码

class Address(Resource):
    def get(self, store):
        print('Received a request at ADDRESS for Store ' + store )
        conn = sqlite3.connect('store-db.db')
        cur = conn.cursor()
        addresses = cur.execute('SELECT * FROM Sites WHERE StoreNumber like ' + store)     
        for r in res:
            column_names = ["StoreNumber", "Street", "StreetSecondary","City","State", "ZipCode", "ContactNumber", "XO_TN", "RelocationStatus", "StoreType"]
            data = [r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8]]            
            datadict = {column_names[itemindex]:item for itemindex, item in enumerate(data)}
            return(datadict, 200)

Tags: 数据storeinapi数据库flaskfordb
1条回答
网友
1楼 · 发布于 2024-09-30 20:28:32

您只需将列表转换为dict,然后将其解析为JSON字符串,然后再将其传回。你知道吗

// These are the names of the columns in your database
>>> column_names = ["storeid", "address", "etc"]

// This is the data coming from the database.
// All data is passed as you are using SELECT * in your query
>>> data = [42, "1 the street", "blah"]

// This is a quick notation for creating a dict from a list
// enumerate means we get a list index and a list item
// as the columns are in the same order as the data, we can use the list index to pull out the column_name
>>> datadict = {column_names[itemindex]:item for itemindex, item in enumerate(data)}

//This just prints datadict in my terminal
>>> datadict

我们现在有一个包含数据和列名的命名dict。你知道吗

{'etc': 'blah', 'storeid': 42, 'address': '1 the street'}

现在将datadict转储为一个字符串,以便可以将其发送到前端。你知道吗

>>> import json
>>> json.dumps(datadict)

dict现在已转换为字符串。你知道吗

'{"etc": "blah", "storeid": 42, "address": "1 the street"}'

这不需要对数据库进行任何更改,但脚本需要了解列名或使用一些SQL动态检索它们。你知道吗

如果数据库中的数据格式正确,可以传递到前端,则不需要更改数据库结构。如果它的格式不正确,那么您可以更改它的存储方式,也可以更改SQL查询来操作它。你知道吗

相关问题 更多 >