⑴ 用flask或django還需要防sql注入嗎
sql注入跟你使用什麼框架沒有關系,但是如果是你使用了django自帶的orm或者sqllachemy來連接資料庫,一般可以降低被注入的危險。
如果解決了您的問題請~~!
如果未解決請繼續追問
⑵ 用flask或django還需要防sql注入嗎
sql注入跟你使用什麼框架沒有關系,但是如果是你使用了django自帶的orm或者sqllachemy來連接資料庫,一般可以降低被注入的危險。
如果解決了您的問題請採納!
如果未解決請繼續追問
⑶ 在python3下怎樣用flask-sqlalchemy對mysql資料庫操作
這個問題經常難道新手一下,因為大部分教程里(包括經典的《Flask
Web開發》一書),告訴了我們如何使用flask-sqlalchemy操作sqlite,稿旁但在生產環境(線上網站)上,我們肯定是使用MySQL或其
他,而大部分的教程里,又告訴我們flask-sqlalchemy使用MySQL的方式是:
mysql://username:password@server/db
結果我們照葫蘆畫瓢的來一下,發現壓根不行蘆敗,寫好的網站一跟資料庫沾邊就報陪敬顫錯。
Python和MySQL是「兩個國家的人」,他們互不相通,因而需要一個中間代理,讓雙方互通有無,跟翻譯一樣(這比喻不準確,但足夠你明白意思就行)。翻譯又有很多選擇,不同的翻譯各有特色。
題
主解決問題選擇的翻譯是「flask-mysqldb」,其背後的主子是「MySQL-python」。恩,說到這里你應該知道,「flask-xxx」
這樣的包都是對背後主子進行了適合Flask封裝的插件,跟包子皮一樣,裡面的餡才是重點,「flask-mysqldb」的餡是「MySQL-
python」。
而我要推薦的是另一個翻譯:PyMySQL,這玩意的好處是可以做非同步(「MySQL-python」也可以,個人口味罷了),簡而言之,網站訪問量大了就需要考慮非同步,現在別管這是啥子。這玩意的安裝方式是:
pip install PyMySQL
之後,資料庫連接由:
mysql://username:password@server/db
改為
mysql+pymysql://username:password@server/db
就可以了。
⑷ Flask SQL性能測試:使用flask-sqlalchemy檢測慢SQL語句
摘要: Flask , flask-sqlalchemy , SQL
flask-sqlalchemy 可以記錄下在客戶端請求應用的過程中,後台涉及的SQL語句,以及SQL語句執行的時長,主要基於flask-sqlalchemy下的 get_debug_queries 實現。在主視圖腳本中加入一個 after_request 視圖如下。
其中開啟SQL Debug模式 app.config['SQLALCHEMY_RECORD_QUERIES'] = True , get_debug_queries 返回請求涉及的所有SQL語句,調用 ration 獲得SQL執行時長,只要大於0.2就用logging模塊記錄到磁碟。
啟動程序,點擊應用功能,logging會把大於時間閾值的SQL寫入本地文件query_log.log
直接搜索Slow query,得到以下幾條記錄
三張表pira_ent_alias,pira_score,pira_senti_stats都是簡單的filter查詢,沒有復雜的邏輯,查看MySQL explain執行計劃
explain結果解析
增加索引
三張表都進行陵陸沖了全表掃描,先加上索引再說,給pira_ent_alias增加ent_name和ent_shortname的普通索引
給pira_score,pira_senti_stats增加尺殲ent_name和datetime的復合索引,復合索引從字悉隱段組合的 最左邊開始就要走 ,否則無效,因此如果filter條件只有datetime還是全表掃描,filter條件是ent_name或者ent_name和datetime有效。
給三張表增加索引之後,再次運行get_debug_queries,閾值降低為0,查看日誌如下,執行時間都有很大降低
⑸ 為什麼在python的flask框架中要使用SQLAlchemy而不使用MySQLdb
SQLAlchemy是御胡ORM框架,
MySQLdb是資料庫驅動,這兩個是不沖突的
用ORM框架可以降低資料庫查詢的難度,鎮睜攔用面向對象的方法處理數早賣據,而且可以降低資料庫操作跟業務邏輯的耦合度
⑹ 簡單分析Flask 資料庫遷移詳情
1、使用 Flask-Migrate 實現資料庫遷移
db.create_all()不會重新創建表或是更新表,需要先使用db.drop_all()刪除資料庫中所有的表之後再調用db.create_all()才能重新創建表,但是這樣的話,原來表中的數據就都被刪除了,這肯定是不行的,這時就出現了資料庫遷移的概念。
在開發過程中,隨著需求的變化,有可能需要添加或修改表的一些欄位,但是原表中的數據不能刪除,此時就需要創建新表,並將舊表中的數據遷移至新表中,Flask-Migrate這個擴展就可以在不破壞數據的情況下更新資料庫表的結構,並完成數據從舊表到新表的遷移。
2、Flask-Migrate的使用
可以使用pip install flask-migrate進行安裝。在程序中,我們實例化 Flask_Migrate 提供的 Migrate 類,進行初始化操作。
實例化 Migrate 類,需要傳入 Flask 實例 app 和 SQLAlchemy創建的實例 db。
2.1 資料庫的遷移過程
先定義 User 模型類。
創建遷移環境
在開始遷移數據之前,需要先使用下面的命令創建一個遷移環境:
遷移環境只需創建一次,創建後會在項目根目錄下生成一個 migrations 目錄,其中包含了自動生成的配置文件和遷移版本目錄。
生成遷移腳本
使用如下命令自動生成遷移腳本:
-m 選項添加備注信息,執行後遷移版本目錄生成了遷移腳本。
遷移腳本內有兩個函數:
upgrade():把遷移中的改動應用到資料庫中
downgrade():將改動撤銷
自動生成的遷移腳本會根據模型定義和資料庫當前狀態的差異,生成upgrade()和downgrade()函數的內容,不一定完全正確,有必要再進行檢查一下。
更新資料庫
生成了遷移腳本後,使用flask db upgrade命令可完成對資料庫的更新。執行後即可生成資料庫及表。
如果之後我們需要改動 user 表中的欄位,比如添加一個mobile欄位,我們只需在 User 模型類中添加該屬性,之後執行flask db migrate -m '注釋'和flask db upgrade命令即可。
如果想要回滾遷移的話,可以執行flask db downgrade命令。
3、總結
這里只是介紹如何在 Flask 中進行資料庫遷移,關於在生產環境下,是否需要使用遷移工具或者使用何種工具進行遷移,這里不做討論,至於我的話,在生產環境中,我沒有使用過Flask-Migrate,而是選擇編寫 SQL 腳本來處理資料庫及表的更新或改動,我覺得這樣更不容易出錯,其實各有各的好處,看自己選擇。
⑺ 為什麼在python的flask框架中要使用SQLAlchemy而不使用MySQLdb
當然可以自己寫代碼連接到資料庫,並操作之。
使備大扒用Sqlalchmy的目的主要是ROM吧。工作重心可以放在業務處理上,而不用太操心資料庫的具體操作和sql語法,特別是多表的join~
Flask的仿信文檔里,就有說怎麼直接通過Python操作資料庫的內容。仿昌
⑻ 在 Flask-SQLAlchemy 中聯表查詢
SQLAlchemy 是一個功能強大的 ORM 。 Flask-SQLAlchemy 是一個 Flask 插件,它讓我們在 Flask 框架中使用 SQLAlchemy 變得更容易。
本篇介紹我在使用 Flask-SQLAlchemy 2.1 時進行聯表查詢的一些經驗
這里有兩個表,account 表保存帳號 ID 和昵稱,bind 表保存 account 之間的綁定關系。
對應的 Model 如下:
先來看一個簡單的例子:查詢 gameuid 1000 賬號下綁定的所有帳號。
看一看生成的 SQL 語句:
這里的聯表查詢使用的是 WHERE 語句。如果希望使用 JOIN 語句,可以這樣寫:
可以看出,現在生成的 SQL 語句已經使用 JOIN 語句了。但上面的語意有點奇怪,既然已經在 query 中使用了 Bind 和 Account,後面再 join 一次 Account 總覺得有點多餘。那麼 SQLAlchemy 如何選擇 JOIN 的時候誰先誰後呢?看看這個錯誤就知道了:
這個錯誤顯然說明,query 中參數的順序很重要,第一個參數所代表的 table 就是 JOIN 時放在前面的那運孫亮個 table。因此,此處 JOIN 的目標應該是 Account, 而不應該是 Bind 自身。
上面的例子已經解決了大多數需求了。我們再來看看分頁。在 Flask-SQLAlchemy 中封裝了一個 paginate 方法,可以方便地將查詢記錄進行分頁:
報錯的原因是 db.session.query 默認返回的是 orm.Query 對象,這個對象凱早並不包含 paginate 方法。要解決這個問題,需要修改 Flask-SQLAlchemy 的源碼。
找到 SQLAlchemy 對象的 __init__ 定義,在其中加入 session_options['query_cls'] = BaseQuery 即可:
在 Flask-SQLAlchemy 提供的 Model 對象中,可以使用 Model.query 這樣的語法來直接得到一個查詢對象,這是由於 Flask-SQLAlchemy 中存在一個 _QueryProperty 類,每次調用 Model.__get__ 時,會自動生成一個基於當前 session 的 query 對象:
使用 Model.query 得到的這個 query 對象可以直接進行 JOIN 操作,得到的結果是 Model 對象。這樣就方便多了:
轉換成 SQL 是這樣的:
可以看出,這樣的查詢結果和使用 db.session.query 並沒有什麼不同。由於返回的是 Model 對象,使用上可能還更加方便了。
如何使用 Model.query.join 語法得到部分欄位呢?這里可以使用 SQLAlchemy 提供的 with_entities 方法:
注意,列表中的項 (2, '玩家10001') 並不是標準的 Python tuple。你如果查看它的類型,會發現一個奇怪的名稱: <class 'sqlalchemy.util._collections.result'> 。它是一個 AbstractKeyedTuple 對象,擁有一個 keys() 方法,這樣可以很容易將其轉換成 dict :
想了解 AbstractKeyedTuple ,可以看看這篇文檔 New KeyedTuple implementation dramatically faster 。
除了篩選欄位外,還可以用另一個方法獲取多個 Model 的記錄。那就是,返回兩個 Model 的所有欄位:
使用上面的語法直接返回 Account 和 Bind 對象,可以進行更加靈活的操作。
要聯結超過 2 張以上的表,可以直接在 join 得到的結果之後鏈式調用 join 。也可以在 filter 的結果後面鏈式調用 join 。join 和 filter 返回的旁寬都是 query 對象,因此可以無限鏈式調用下去。
寫完查詢後,應該列印生成的 SQL 語句查看一下有沒有性能問題。
⑼ flask sqlalchemy需要安裝mysql嗎
一、當然是把必備的包給安裝上才行:
Flask-SQLAlchemy
pip install flask-sqlalchemy1
MySQL
windows下64位壓縮包的安裝方式可以參考:
http://blog.csdn.net/werewolf_st/article/details/45932771
還有就是直接指仔去下載安裝包即升雀可
Flask-MySQLdb
pip install flask-mysqldb1
二、配置flask-sqlalchemy連接MySQL資料庫
from flask import Flask
from flask.ext.sqlalchemy import SQLALchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root@localhost:3306/test?charset=utf8mb4'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'吵逗早] = True
⑽ flask+flask_sqlalchemy 使用pyinstaller打包
如果你想使用 PyInstaller 打包 Flask 和 Flask-SQLAlchemy 應用,滲大你可以這樣做:
安裝 PyInstaller:在命令行中輸入 "pip install pyinstaller"。
創建 Flask 應用。
在應用中導入 Flask-SQLAlchemy。
使用 PyInstaller 打包應用。在命令行中輸入 "pyinstaller your_app.py",其中 "your_app.py" 是你的應用的文件名。
PyInstaller 會創建一個新的文件夾,其蔽陸中包含你的應用的可執行文件和所有依賴的文件。
注意:在使用 PyInstaller 打包 Flask 應用時,你需要在命令行中使用 "--hidden-import" 參數來指定所有需要導入的 Flask 模塊。例如:"pyinstaller your_app.py --hidden-import flask.ext.sqlalchemy"。
希望這些信息對你宏喊頃有幫助。