關於直接執行數據庫查詢字符串的解決方案 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 "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'bar2'
>>> getattr(a, 'bar2', 3)    # 屬性 bar2 不存在,但設置了默認值
3
>>>

後期特別注意這兩個函數的處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章