一个Flask项目经验总结

问题整理

Error: While importing ‘run_app_dev’, an ImportError was raised

网上说是循环调用的问题,但这个项目在我笔记本上是可以运行的,怀疑是不是flask的版本问题,因为我直接安装了最新的flask==2.0.2,把最新的flask卸载后,安装1.1.2的flask 此问题解决。

当flask_migrate没有MigrateCommand时

出现这个情况的原因是最新的flask_migrate,已经去除了MigrateCommand,可以直接在命令行中使用,如果需要使用MigrateCommand的话:

1
2
3
可用 pip install flask_migrate==xx 命令
把flask_migrate降低一个版本
这里用的2.7.0版本的把问题解决了

ModuleNotFoundError: No module named ‘Crypto’解决方案

方案一:

1
2
3
pip3 uninstall pycryptodome
pip3 uninstall crypto
Pip3 install pycrypto

方案二:

1
2
Pip3 install pycrypto
#然后手动修改 site-packages/crypto 目录改为Crypto即可

如何转义JSON

飞书更新的接口文档,要求卡片信息格式必须为转移后的JSON,和普通JSON的区别就是必须加转义符“\”。这个就很麻烦了。
实现方式:

1
2
3
4
5
6
7
import json
s1 = {"elements":[{"content":"hi","tag":"markdown"},{"tag":"hr"},{"elements":[{"content":"hi text","tag":"plain_text"}],"tag":"note"}]}
s2 = json.dumps(s1)
print(json.dumps(s2))

# 打印结果
"{\"elements\": [{\"content\": \"hi\", \"tag\": \"markdown\"}, {\"tag\": \"hr\"}, {\"elements\": [{\"content\": \"hi text\", \"tag\": \"plain_text\"}], \"tag\": \"note\"}]}"

简单来说就是通过两次json.dumps()来实现自动增加转义符的。

模糊查询

在模糊查询的时候经常会遇到字段不确定的情况,因此使用原生SQL更为简单,并且能结合模糊查询来实现。

1
2
3
4
5
6
7
if request.args.get('key') and request.args.get('value'):
sql = """select * from user where %s like '%s'""" % (key, "%" + value + "%")
c = db.session.execute(sql).fetchall()
if c:
res_obj = c[0]
else:
res_obj = False

单独动态查询的话也容易实现,但是模糊查询不太容易结合,只能使用下面的方式。

1
2
3
params = {key: value}
res_obj = db.session.query(User).filter_by(**params).all()

二次优化

将查询记录转变为非list类型的数据

1
2
3
4
5
6
7
sql = """select * from user where %s like '%s'""" % (key, "%" + value + "%")
c = db.session.execute(sql).fetchall()
if c:
res_obj = tuple(c)
else:
res_obj = False

增加判断条件

1
2
3
4
elif isinstance(res, tuple):  # 针对于模糊查询的情况
for col in res:
lst.append(dict(zip(col.keys(), col)))

当为tuple类型的时候,单独处理,独立于之前的list处理模式。

flask_apscheduler 上下文的问题

最近调试apscheduler的时候出现以下的错误:

RuntimeError: Working outside of application context.
This typically means that you attempted to use functionality that needed to interface with the current application object in some way. To solve this, set up an application context with app.app_context(). See the documentation for more information.

其主要原因是由于调用到了公共变量,而flask引入了应用上下文管理,但是并没有获取到上下文导致。
解决方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from app import scheduler
...

class SyncAssets(object):
"""
同步资产信息
"""

def __init__(self):
with scheduler.app.app_context():
access_key_id = current_app.config.get('ALI_KEY_ID')
access_key = current_app.config.get('ALI_KEY')
access_r = current_app.config.get('ALI_R')
self.client = AcsClient(access_key_id, access_key, access_r)

vue 时间格式化的问题

时间格式化处理使用moment.js。

1
npm install moment

需要注意在格式化时间戳的时候检查是多少位,考虑是否除以1000和UTC的问题。