[英]Python: automatize JSON request loading
我正在解析一個有很多攝像頭的 JSON 請求,我需要以某種方式從攝像頭加載所有變量並將它們傳遞給網絡服務器(HTML、JS)。 現在,我有大約 20 個攝像頭設備,我確實加載了所有攝像頭一次,你可以看到。 有沒有辦法讓它自動化? 我需要將變量傳遞給 HTML,例如-camera2_title、camera3_title……
如果我使用 - for x in range(total_cameras)
並使用像 camera_title 這樣的變量只會覆蓋,我該如何將這些變量返回到 HTML?
我正在加載的 JSON 格式
{
"status": "ok",
"total_cameras": 3,
"cameras": [
{
"camera_id": 3,
"camera_name": "hikvision 1",
"camera_ip": "73.2.51.0",
"camera_lat": 53.736406,
"camera_log": 15.11621,
"camera_street": "slezeviciaus g. 7",
"camera_lastUPD": "10 jan 16:04 2020"
},
{
"camera_id": 4,
"camera_name": "hikvision 2",
"camera_ip": "213.2.51.0",
"camera_lat": 51.67,
"camera_log": -5.06,
"camera_street": "Stanevy 4",
"camera_lastUPD": "10 Jan 2020 07:17:37"
},
{
"camera_id": 5,
"camera_name": "hikvision 3",
"camera_ip": "45.89.25.1",
"camera_lat": -42.683,
"camera_log": 41.856,
"camera_street": "Kudirkos st",
"camera_lastUPD": "10 jan 16:04 2020"
}
]
}
蟒蛇代碼:
@app.route('/<api_key>')
def main_screen2(api_key=None):
try:
api_key = api_key or 'None'
Reach_sr = Back_End()
xx = Reach_sr.GetCameras_Info(api_key)
Extra = False
Loaded_Cameras = 0
JSON_DATA = json.loads(xx)
try:
Camera_name_1 = JSON_DATA["cameras"][0]["camera_name"]
Camera_Lat_1 = JSON_DATA["cameras"][0]["camera_lat"]
Camera_Log_1 = JSON_DATA["cameras"][0]["camera_log"]
Camera_Street_1 = JSON_DATA["cameras"][0]["camera_street"]
Camera_IP_1 = JSON_DATA["cameras"][0]["camera_ip"]
Camera_ID_1 = JSON_DATA["cameras"][0]["camera_id"]
Camera_LASTUPDATED_1 = JSON_DATA["cameras"][0]["camera_lastUPD"]
Loaded_Cameras += 1
except Exception as er:
# Log error & make a return
#log.error("Camera 20 failed to load it's info... ERROR: {er}")
return "S"
try:
Camera_name_2 = JSON_DATA["cameras"][1]["camera_name"]
Camera_Lat_2 = JSON_DATA["cameras"][1]["camera_lat"]
Camera_Log_2 = JSON_DATA["cameras"][1]["camera_log"]
Camera_Street_2 = JSON_DATA["cameras"][1]["camera_street"]
Camera_IP_2 = JSON_DATA["cameras"][1]["camera_ip"]
Camera_ID_2 = JSON_DATA["cameras"][1]["camera_id"]
Camera_LASTUPDATED_2 = JSON_DATA["cameras"][1]["camera_lastUPD"]
Loaded_Cameras += 1
except Exception as er:
# Log error & make a return
#log.error("Camera 20 failed to load it's info... ERROR: {er}")
return "test"
return render_template('MAIN_index.html', camera2_title=camera2_title, camera2_lat=camera2_lat, camera2_log=camera2_log )
注意:下面所有寫的都是在上下文中寫的,讀者知道在使用動態方式之前驗證輸入數據結構的良好做法。 ( https://github.com/alectomas/voluptuous是眾多優秀跳棋之一)
當您確定 dict 的結構正確時,您可以使用解包將 dict 作為鍵值參數傳遞。
此外,在 jinja2 模板中使用循環/列表來為多個相機生成頁面也是一個好主意。 所以render_template 應該采用lst_camera_titles 之類的東西,而不是camera_(1 .. n)_title。 對其計數沒有任何約束力。
因此,您可以執行以下操作:
from collections import defaultdict
# Dict how calls dict[key] = list() if you trying to access non-existing key.
template_render_params = defaultdict(list)
for camera in JSON_DATA["cameras"]:
template_render_params['camera_names'].append(camera['camera_name'])
...
# etc for all args or if you've got too many args, you can rewrite it a function,
# who takes dict {input_json_key: template_render_argument_name}
# and returns a dict with key-value arguments for render_template
return render_template('MAIN_index.html', **template_render_params)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.