falsk連接數據庫
我們整個項目采用vue+flask+mysql的框架,之前已經搭建好了mysql數據庫,現在要做的是使用flask連接到數據庫并測試
安裝flask
-
首先安裝flask
pip install flask
進行數據庫連接
數據庫連接需要使用到pymysql庫以及flask庫
連接數據庫的函數如下:
class Database:# 設置數據庫連接host='localhost'user='root'password = "123456"def __init__(self,db):connect=pymysql.connect(host=self.host,user=self.user,password=self.password,db=db)self.cursor = connect.cursor()# 執行sql語句def execute(self,command):try:# 執行command中的sql語句self.cursor.execute(command)except Exception as e:return eelse:return self.cursor.fetchall()
其中包含了連接數據庫以及執行sql語句,省去了每次執行sql語句重連數據庫的麻煩
編寫函數以測試是否連接成功數據庫
可以使用以下代碼,其中注意Database()中替換為自己的數據庫名,sql查詢語句根據自己情況編寫
sql = Database("xmsx")
result = sql.execute(f"SELECT company FROM companyandjob WHERE job_name='{job}' ")
print(result)
vue與flask通信
前端vue部分
解決跨域問題:
- 首先編寫vue.config.js
設置target為自己的后端flask的接口:
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,lintOnSave:false,
})
// 跨域配置
module.exports = {devServer: { //記住,別寫錯了devServer//設置本地默認端口 選填port: 8080,proxy: { //設置代理,必須填'/api': { //設置攔截器 攔截器格式 斜杠+攔截器名字,名字可以自己定target: 'http://127.0.0.1:8085', //代理的目標地址changeOrigin: true, //是否設置同源,輸入是的pathRewrite: { //路徑重寫'^/api': '' //選擇忽略攔截器里面的內容}}}}
}
- 其次編輯index.js(注意,這里是我們項目特有的,我們全局設置了axios,因此不用在每個vue中導入axios
設置baseUrl為后端flaskIP地址
- 編寫前端函數?
這里使用export const 是因為我們將所有的調用后端的函數寫在了一個文件中,這樣封裝性較強,前端需要獲取后端數據時調用這個函數即可
- 在.vue文件中調用訪問后端的函數
在methods中使用,并且由于改方法是異步操作,所以使用async聲明,并且在異步調用函數的位置聲明await,從而獲得后端返回的數據。相應的展示在前端
后端flask部分
后端需要與vue通信,同時要與數據庫連接,并且接受前端的參數,代碼如下:
# 前端顯示相應公司后端崗位的優秀面經
@app.route('/api/getExperienceWithOfset',methods=['POST'])
def showExperience():if request.method == "POST":company = request.json['company']# 如果之后添加”前端“崗位,則應前端再傳遞一個”崗位“信息,從而到數據庫中查詢相應的數據job = request.json['job']offset = request.json['offset']if request.method == "GET":company = request.args.get['company']job = request.json['job']offset = request.json['offset']# 創建Database類的對象sql,test為需要訪問的數據庫名字 具體可見Database類的構造函數sql = Database("xmsx")try:#執行sql語句 f+字符串的形式,可以在字符串里面以{}的形式加入變量名 結果保存在result數組中result = sql.execute(f"SELECT title,content FROM companyandexperience WHERE company='{company}' AND job='{job}' LIMIT 1 OFFSET {offset}")except Exception as e:return {'status':"error", 'message': "code error"}else:if not len(result) == 0:#返回查詢結果,根據需要進行處理return {'status':'success','title':result[0][0],'content':result[0][1],}else:return {'status':'success','title':"無",'content':"空",}
這里我們處理成,接受前端的company,job,offset字段,然后在數據庫中查詢相應的記錄并返回。offset的設置是為了可以在前端實現分頁展示。
并且,為了防止頻繁的發生error錯誤,我們設置,如果數據庫中查詢不到數據,則返回”空“,在前端添加邏輯判斷,如果返回的數據內容為”空“則表示沒有數據了,則不能再進行翻頁操作,并且提示”暫時沒有該信息“。
項目中編寫的后端函數如下:
- 根據公司和崗位查詢公司要求信息
# 根據公司崗位,這里的崗位是模糊查詢,即算法、數據等類別,查詢出公司要求,公司職責或描述
@app.route('/api/getCompanyJobInformationWithOfset',methods=['POST'])
def showCompanyJobInformationWithOfset():
- 根據公司和崗位查詢公司優質面經
# 前端顯示相應公司后端崗位的優秀面經
@app.route('/api/getExperienceWithOfset',methods=['POST'])
def showExperience():
- 根據jieba分詞統計得到的各公司的高頻考點,從數據庫中查詢一些技術問題作為模擬面試問答
- ?
總結
綜上,我們實現了vue+flask+mysql的整體框架。根據不同的前端展示需求,編寫不同的后端代碼及sql查詢即可。