Flask筆記三之連接使用數據庫

本文首發于公眾號:Hunter后端

原文鏈接:Flask筆記三之連接使用數據庫

這一節介紹 Flask 與數據庫的連接,以及接口里查詢數據的操作。

這里使用的是 SQLAlchemy + pymysql 實現與數據庫的連接,SQLAlchemy 的詳細介紹見之前的筆記有過一篇基礎的介紹,這里只介紹與 Flask 的嵌入使用。

本篇筆記的代碼都已經提交到 github 上,可使用下面的操作獲取代碼:

git clone https://github.com/x1204604036/flask_backend.git

以下是本篇筆記目錄:

  1. 安裝依賴
  2. 定義和連接數據庫
  3. 接口使用數據庫

0、安裝依賴

安裝相關依賴:

pip3 install sqlalchemy==2.0.19
pip3 install pymysql==1.1.0

1、定義和連接數據庫

首先,在 app/config/development.py 里定義我們的數據庫相關變量,內容如下:

# app/config/development.pyMYSQL_CONNECT_TYPE = "mysql+pymysql"
MYSQL_USERNAME = "root"
MYSQL_PASSWORD = "123456"
MYSQL_HOST = "192.168.1.3"
MYSQL_PORT = 3306
MYSQL_DB_NAME = "flask_db"

接下來定義 user 相關的 model,在 app/ 文件夾下創建一個 models/ 文件夾,其下創建一個 user.py 文件,內容如下:

# app/models/user.pyfrom sqlalchemy import Column, Integer, String
from app.database import Baseclass User(Base):__tablename__ = "user"id = Column(Integer, primary_key=True, autoincrement=True)username = Column(String(50), unique=True)email = Column(String(120), default="", comment="郵箱")password = Column(String(120))

在 app/ 文件夾下創建一個文件 database.py,其內容如下:

# app/database.py from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from app.config import configengine_str = "%s://%s:%s@%s:%s/%s?charset=utf8" % (config.MYSQL_CONNECT_TYPE,config.MYSQL_USERNAME,config.MYSQL_PASSWORD,config.MYSQL_HOST,config.MYSQL_PORT,config.MYSQL_DB_NAME,
)engine = create_engine(engine_str)db_session = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine,)
)Base = declarative_base()
Base.query = db_session.query_property()def init_db(app):import app.models.userBase.metadata.create_all(bind=engine)

在這里,從 config 配置文件中獲取 MySQL 的連接信息,然后創建 engine

最后定義一個初始化數據庫的函數,用于創建所有定義了的數據庫模型,在這里是引入了 User 這個 model

然后在 app/init.py 里引入數據庫,文件內容如下:

# app/__init__.pyfrom flask import Flaskdef create_app():app = Flask(__name__)app.config.from_object("app.config.config")app.secret_key = b'f0e97d3012eed1c2939ac1a62ce1e8d455e86fa9da47b26c94a9af4119be29d6'from . import databasedatabase.init_db(app)from .user import bp_userapp.register_blueprint(bp_user.bp)return app

啟動 Flask 服務,運行 flask run,就可以看到對應的數據庫下多了我們創建的 user 表了。

接下來,我們改寫上一篇筆記中的接口定義,從數據庫中獲取數據

2、接口使用數據庫

以下是 app/user/bp_user.py 的內容:

from flask import Blueprint, request, session, jsonify
from werkzeug.security import generate_password_hash, check_password_hash
from app.models.user import User
from app.database import db_sessionbp = Blueprint("user", __name__, url_prefix="/user")@bp.route("/register", methods=("POST",))
def register():request_json = request.jsonusername = request_json.get("username")password = request_json.get("password")email = request_json.get("email")if not username or not password or not email:return {"code": -1, "msg": "請傳遞用戶名、密碼、郵件等必要信息"}user = User.query.filter(User.username == username, User.email == email).first()if user:return {"code": -1, "msg": "用戶已存在"}new_user = User(username=username,email=email,password=generate_password_hash(password))db_session.add(new_user)db_session.commit()return {"code": 0, "msg": "注冊成功"}@bp.route("/login", methods=("POST",))
def login():username = request.form.get("username")password = request.form.get("password")if not username or not password:return {"code": -1, "msg": "請上傳用戶名和密碼"}user = User.query.filter(User.username == username).first()if not user:return {"code": -1, "msg": "用戶不存在"}if not check_password_hash(user.password, password):return {"code": -1, "msg": "密碼驗證失敗"}session.clear()session["user_id"] = user.idreturn {"code": 0, "msg": "success"}def login_required(func):def wrapped(*args, **kwargs):if session.get("user_id") is None:return jsonify({"code": -1, "msg": "請先登錄系統"}), 401return func(*args, **kwargs)return wrapped@bp.route("/logout", methods=("POST",))
def logout():session.clear()return {"code": 0, "msg": "logout success"}@bp.route("/user_info", methods=("POST",))
@login_required
def get_user_info():user_id = session.get("user_id")user_info = {"user_id": user_id}return {"code": 0, "msg": "success", "user_info": user_info}

在這里實現了四個接口:

  1. /register 為注冊接口,用于注冊用戶
  2. /login 為登錄接口,記錄了登錄信息
  3. /user_info 為獲取用戶信息接口,使用到自己寫的一個需要登錄的裝飾器
  4. /logout 為登出接口

以上就完成了 Flask 連接使用數據庫的示例。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212506.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212506.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯2021年5月青少組Python程序設計國賽真題

30 個人在一條船上,超載,需要 15 人下船于是人們排成一隊,排隊的位置即為他們的編號。報數,從1開始,數到9的人下船。如此循環,直到船上僅剩15 人為止,問都有哪些編號的人下船了呢? 2】判斷101-200之間有多少個素數,并輸出所有素數…

Maven上傳Jar到Nexus遠程倉庫的兩種方式

Maven上傳Jar到Nexus遠程倉庫的兩種方式 文章目錄 前言通過mvn clean deploy指令上傳第一步 配置maven的setting.xml文件第二步 配置pom文件第三步 執行打包指令 手動上傳 jar到遠程倉庫第一步 配置setting文件第二步 執行上傳命令 前言 各個公司在開發項目時,一般…

Linux C/C++并發編程實戰(8)CAS機制的ABA問題

文章目錄 無鎖隊列中的ABA問題ABA問題解決方案 ABA問題:CAS在操作的時候會檢查變量的值是否被更改過,如果沒有則更新值,但是帶來一個問題,最開始的值是A,接著變成B,最后又變成了A。經過檢查這個值確實沒有修…

Leetcode每日一題

https://leetcode.cn/problems/binary-tree-preorder-traversal/ 這道題目需要我們自行進行創建一個數組,題目也給出我們需要自己malloc一個數組來存放,這樣能達到我們遍歷的效果,我們來看看他的接口函數給的是什么。 可以看到的是這個接口函…

說說webpack中常見的loader?解決了什么問題?

在Webpack中,Loader是用于處理各種文件類型的模塊加載器,它們用于對文件進行轉換、處理和加載。常見的Loader解決了以下問題: 處理 JavaScript 文件:Babel Loader用于將最新的JavaScript語法轉譯為瀏覽器兼容的版本,以…

5_CSS三大特性盒子模型

第5章-盒子模型【比屋教育】 本課目標(Objective) 掌握CSS三大特性理解什么是盒子模型掌握內邊距padding的用法掌握外邊距margin的用法 1. CSS的層疊,繼承,優先級 1.1 CSS層疊 層疊:是指多個CSS樣式疊加到同一個元…

Web(8)SQL注入

Web網站(對外門戶) 原理:not>and>or(優先級) 一.低級注入 order by的作用是對字段進行排序,如order by 5,根據第五個字段 進行排序,如果一共有4個字段,輸入order by 5系統就會報錯不 …

詳細介紹開源固件-TF-A

什么是TF-A? TF-A(Trusted Firmware-A)是一種用于嵌入式系統的開源固件,而不是Linux的一部分。TF-A主要用于ARM架構的處理器和設備,它提供了一組安全和可信任的軟件組件,用于引導和初始化系統。 如下是其…

GD32F30X-RT-Thread學習-線程管理

1. 軟硬件平臺 GD32F307E-START Board開發板MDK-ARM Keil 2.RT-Thread Nano 3.RT-Thread 內核學習-線程管理 ? 在多線程操作系統中,可以把一個復雜的應用分解成多個小的、可調度的、序列化的程序單元,當合理地劃分任務并正確地執行時,這…

qt可以詳細寫的項目或技術

1.QT 圖形視圖框架 2.QT 模型視圖結構 3.QT列表顯示大量信息 4.QT播放器 5.QT 編解碼 6.QT opencv

Linux--RedHat--安裝和配置C++環境

百度下載,安裝包: 鏈接:https://pan.baidu.com/s/1IgBfCCRxGYZ_PPiedad0xQ 提取碼:ffff 下載后,建個目錄,先解壓好安裝包! (兩種方法)執行如下命令: 參考…

Bypass open_basedir

講解 open_basedir是php.ini中的一個配置選項,可用于將用戶訪問文件的活動范圍限制在指定的區域。 假設open_basedir/var/www/html/web1/:/tmp/,那么通過web1訪問服務器的用戶就無法獲取服務器上除了/var/www/html/web1/和/tmp/這兩個目錄以外的文件。…

Java——面試:String 和 StringBuffer 的區別?

相同點: String 和 StringBuffer,它們可以儲存和操作字符串, 即包含多個字符的字符數據。 String 和 StringBuffer 的區別有以下幾點: 1.String 類提供了數值不可改變的字符串。而 StringBuffer 類提供的字符串進行修改。 當你知…

洛谷 P8674 [藍橋杯 2018 國 B] 調手表

文章目錄 [藍橋杯 2018 國 B] 調手表題目描述輸入格式輸出格式樣例 #1樣例輸入 #1樣例輸出 #1 提示 題意解析CODE分析一下復雜度 [藍橋杯 2018 國 B] 調手表 題目描述 小明買了塊高端大氣上檔次的電子手表,他正準備調時間呢。 在 M78 星云,時間的計量…

JVM虛擬機:命令行查看JVM垃圾回收器的執行信息

在eclipse中打開命令行窗口 window->show view->Terminal 這樣就打開了Terminal窗口,效果如下所示: java -XX:PrintCommandLineFlags -version 這個命令可以查看一些配置信息,其中最重要的配置信息就是,當前使用的G1回收器…

什么是漏洞掃描

漏洞掃描是指基于漏洞數據庫,通過掃描等手段對指定的遠程或者本地計算機系統的安全脆弱性進行檢測,發現可利用漏洞的一種安全檢測的 行為,也是一類重要的網絡安全技術。它和防火墻、入侵檢測系統互相配合,能夠有效提高網絡的安全性…

鍵盤打字盲打練習系列之成為大師——5

一.歡迎來到我的酒館 盲打,成為大師! 目錄 一.歡迎來到我的酒館二.關于盲打你需要知道三.值得收藏的練習打字網站 二.關于盲打你需要知道 盲打系列教程,終于寫到終章了。。。一開始在看網上視頻,看到up主熟練的打字技巧&#xff…

LabVIEW與Tektronix示波器實現電源測試自動化

LabVIEW與Tektronix示波器實現電源測試自動化 在現代電子測試與測量領域,自動化測試系統的構建是提高效率和精確度的關鍵。本案例介紹了如何利用LabVIEW軟件結合Tektronix MDO MSO DPO2000/3000/4000系列示波器,開發一個自動化測試項目。該項目旨在自動…

javascript中Reflect是什么?三分鐘初識

目錄 1. Reflect是什么?2. 為什么會出現Reflect?3. 需要怎么去使用Reflect?4. 最終的結果解決什么?5. 使用的注意點6. 常用的技巧 Reflect是Javascript中的一個內置對象,它提供了一組用于操作對象的方法,可…

Spring - BeanFactory和FactoryBean的理解

BeanFactory是什么? BeanFactory是Spring 容器的根接口,它是IOC的基本容器,負責管理和加載Bean,它為具體的IOC容器提供了最基本的規范,比如DefaultListableBeanFactory和ConfigurableBeanFactory,BeanFact…