关于直接执行数据库查询字符串的解决方案 eval getattr等flask sqlalchemy

python eval()

eval(expression, globals=None, locals=None)  --- 官方文档中的解释是,将字符串str当成有效的表达式来求值并返回计算结果。globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。

eval()使用原因:

1)在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。

2)在machin learning里根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。

>>> a = 'User.query.filter(User.'+a+'== "admin").all()'
>>> eval(a)
[<用户名:admin>]

直接可以用eval直接执行查询语句字符串,这样就可以直接将接收到的变量放入到查询语句中拼接成真正的语句字符串,然后执行字符串就可以了。

Python getattr() 函数

getattr() 函数用于返回一个对象属性值。

>>>class A(object):
...     bar = 1
... 
>>> a = A()
>>> getattr(a, 'bar')        # 获取属性 bar 值
1
>>> getattr(a, 'bar2')       # 属性 bar2 不存在,触发异常
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'A' object has no attribute 'bar2'
>>> getattr(a, 'bar2', 3)    # 属性 bar2 不存在,但设置了默认值
3
>>>

后期特别注意这两个函数的处理

你可能感兴趣的:(Python,Flask)