flask - Flask Route:返回 JSON 并同时写入数据库
问题描述
我是 Flask 的新手,所以也许我的方法是错误的,但我使用一条路由写入 sqlite 数据库并返回 JSON,然后将其显示在表格中。该路由按预期工作,但在用户端相当慢,因为写入数据库发生在返回 JSON 之前。写入数据库需要 0.1-0.4 秒,所以这不是一个大问题,但如果我能消除这种延迟,那就太好了。
下面是我的路线。我删除了 new_entry 中的列名,但代码再次按预期运行,只是定时部分比预期的要慢。
注意:我尝试使用 add_all 进行批量插入,但在测试时它比 for 循环慢。
@app.route('/api/data/<string:from_port>/<string:to_port>/')
def data(from_port,to_port):
# this calls the cargosmart sailing schedule api and converts the json return into the desired format
api_url = helpers.get_api_url(int(un_to_int_dict[from_port]),int(un_to_int_dict[to_port]), api_key=SECRETS.get("big_schedules_api_key"))
df = helpers.create_df(requests.get(url = api_url
, proxies=SECRETS.get("proxies")
),scac_dict = scac_dict)
bigitems = [helpers.create_big_item(df[df['Route ID']==i]) for i in df['Route ID'].unique()]
api_results = {"data":[x.to_dict() for x in bigitems]}
origin_port = from_port
destination_port = to_port
current_date = date.today().strftime("%m/%d/%Y")
new_user_entry = user_data(ip_address = request.remote_addr,
origin_port = origin_port,destination_port = destination_port,date = current_date)
db.session.add(new_user_entry)
request_id = max([x[0] for x in db.session.query(user_data.id).all()])
new_sailing_entry = [cargosmart_sailings(
from_port = df['From Port'].iloc[i],to_port= df['To Port'].iloc[i],terminal = df['To Terminal'].iloc[i],
etd = convert_date(df['ETD'].iloc[i]),
eta = convert_date(df['ETA'].iloc[i]),
vessel_name = df['Vessel Name'].iloc[i],service= df['Service'].iloc[i],
external_voyage_number = df['External Voyage Number'].iloc[i],
direct = df['Direct'].iloc[i],carrier = df['Carrier'].iloc[i],
cutoff = convert_date(df['Cutoff'].iloc[i]),
transit_time = df['Transit Time'].iloc[i],
request_id = request_id
) for i in range(df.shape[0])]
for x in new_sailing_entry:
db.session.add(x)
db.session.commit()
return jsonify(api_results) ```
解决方案
我没有看到你在使用request_id
,但是随着更多条目进入表格,它会随着时间的推移而减慢。你可能想要的是
db.session.add(new_user_entry)
db.session.commit()
request_id = new_user_entry.id
因为这将在提交到数据库后具有分配的 ID。但是在这种情况下很难看出你的意图是什么。
推荐阅读
- angular - Angular-Protractor-Headless Chromium:使用 APP_INITIALIZE 时,在页面上找不到 Angular
- c# - 在c#中抛出404去customerror.aspx没有302和301
- react-native - 如何在手机上下载资产并在 React Native 应用程序中使用它
- pyomo - 如何将 bonmin 添加到 pyomo 求解器?
- php - 登录仅在谷歌浏览器上无法在我的网站上工作
- java - 如何在 Java 8 中显示最后修改的 LocalDateTime?
- php - 在mysql中将UTF8数据转换为latin1
- linux - 如何在 systemd Ubuntu 18.04 上启动时自动执行 shell 脚本
- python - Python - 识别用户输入中的某些关键字,然后得出答案
- node.js - kafka-node:消费者组成员/实例