flask安裝 配置項文件 以及項目優化(配置文件settings manage model view ) 連接數據庫 字段類型 字段屬性 數據庫的使用 加載settings的方式

一、flask 數據庫操作


1. flask鏈接操作數據庫使用的框架


django 中使用ORM鏈接操作數據庫,如果不能夠用ORM 站點管理功能不能夠使用

python使用pymysql鏈接操作數據庫,flask中也可以使用pymysql鏈接

sqlalchemy: python的開源的ORM框架,在flask中使用flask-sqlalchemy;是通過flask對sqlalchemy 進行封裝


2. 安裝flask-sqlalchemy


pip install flask-sqlalchemy
pip install pymysql

3. 使用(配置mysql和sqlite鏈接並使用)


① 鏈接數據庫配置信息


這裏使用如下兩種數據庫:
sqlite3
mysql


  • 進入官方文檔查看相應配置
    在這裏插入圖片描述
  • 配置信息
    如下所示:
    在這裏插入圖片描述

② 配置sqlite數據庫


注意:////tmp/test.db 中;///固定格式/tmp代表linux環境下根目錄的文件夾目錄/test.db代表tmp目錄下的test.db文件;在windows下直接寫///後面接絕對路徑即可D:/flask/project

  • 找到文件所在路徑

獲取當前文件所在的根目錄
在這裏插入圖片描述

  • 找到當前文件 print(“file”)
    在這裏插入圖片描述

  • config類似於django中的settings
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 配置文件sqlite3數據庫在本機的位置
    在這裏插入圖片描述
    修改到本機後的配置
    BASE_DIR路徑和app.config[“SQLALCHEMY_DATABASE_URI”]打印結果
    在這裏插入圖片描述

  • 鏈接數據庫格式(sqlite3)

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os

app = Flask(__name__)

## 學習sqlalchemy
## 連接數據庫 sqlite3
BASE_DIR = os.path.abspath(os.path.dirname(__file__))##當前文件  項目所在根目錄
app.config["SQLALCHEMY_DATABASE_URI"]="sqlite:///" + os.path.join(BASE_DIR,"test.db")  ## 鏈接sqlite3配置
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True  ## 請求結束之後自動提交
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True   ## 跟蹤修改  flask 1.x 之後增加的配置項

db = SQLAlchemy(app)   ## 綁定flask項目

## 創建模型
class UserInfo(db.Model):
    ## 字段
    __tablename__ = "userinfo"   ##  指定表名
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(32))
    time = db.Column(db.DATETIME)

## 數據遷移
db.create_all()   ## 同步表結構

@app.route("/")
def index():
    return "ORM測試"

if __name__ == '__main__':
    app.run()
  • 生成表結構後查看
    在這裏插入圖片描述

③ 配置鏈接mysql文件


配置mysql與sqlite很相似,只是在獲取數據庫的地方有所區別
在這裏插入圖片描述
添加跟蹤修改配置的原因:
在這裏插入圖片描述
上面一行有錯跟蹤修改的單詞有誤,修改如下
在這裏插入圖片描述

  • 可以設置配置文件DEBUG爲True
app.config["DEBUG"] = True  # 修改後自動啓動項目,會報錯

4. 字段類型 和 字段屬性


__tablename__= "表名"  ##指定表名;相當於元數據設置表名

① 字段類型


在這裏插入圖片描述

db.Column接的字段 意義
String 字符串
Integer 整型
DATETIME 日期時間 datetime.datetime
Text str 可變大小的字符串類型
DATE 日期datetime.date
Boolean bool 布爾型
Time date time.time
Unicode unicode 可變長度的Unicode字符串類型
UnicodeText unicode 不限制長度
Enum 可以是任何類型的python對象 枚舉
BigInteger int 整型
Float float(當asdecimal=True時,強制轉換爲decimal.Decimal對象) 浮點型

② 字段屬性 flask --db-Column屬性


有如下一些:
使用datetime要導包

from datetime import datetime

在這裏插入圖片描述

db.Column接的屬性 意義
primary_key 如果設爲 True,這列就是表的主鍵
unique 如果設爲 True,這列不允許出現重複的值
index 如果設爲 True,爲這列創建索引,提升查詢效率
nullable 如果設爲 True,這列允許使用空值;如果設爲 False,這列不允許使用空值
default 爲這列定義默認值
default=datetime.now() 默認爲當前時間

enum舉例


import enum
class MyEnum(enum.Enum):
    one = 1
    two = 2
    three = 3

t = Table(
    'data', MetaData(),
    Column('value', Enum(MyEnum))
)

connection.execute(t.insert(), {"value": MyEnum.two})
assert connection.scalar(t.select()) is MyEnum.two


5. 使用create_all() 同步表結構


  • 表結構沒發生變化,再次執行不會報錯
  • 修改模型屬性,不同步表結構
  • 增加模型,同步表

數據遷移的應用:

  • django中,要使用數據遷移
  • flask可用可不用 create_all()
    • 用 少見,
    • 不用 先創建表和表結構
      • 創建模型 進行映射

django-》 makemigrations migrate


6. 使用配置文件的幾種方法


① 所有的代碼都寫在一個py文件中使用


from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os

app = Flask(__name__)

## 學習sqlalchemy
## 連接數據庫 sqlite3
BASE_DIR = os.path.abspath(os.path.dirname(__file__))##當前文件  項目所在根目錄
app.config["SQLALCHEMY_DATABASE_URI"]="sqlite:///" + os.path.join(BASE_DIR,"test.db")  ## 鏈接sqlite3配置
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True  ## 請求結束之後自動提交
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True   ## 跟蹤修改  flask 1.x 之後增加的配置項

db = SQLAlchemy(app)   ## 綁定flask項目

## 創建模型
class UserInfo(db.Model):
    ## 字段
    __tablename__ = "userinfo"   ##  指定表名
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(32))
    time = db.Column(db.DATETIME)

## 數據遷移
db.create_all()   ## 同步表結構

@app.route("/")
def index():
    return "ORM測試"

if __name__ == '__main__':
    app.run()

② 封裝settings配置文件


  • 第一種 直接編寫
    應用: 比較直觀,應用在小型的項目
    在這裏插入圖片描述
  • 第二種 編寫配置文件
    應用:作爲默認配置寫在文件中
    settings.py
    在這裏插入圖片描述
	app.config.from_pyfile("settings.py")  ## 使用python文件做配置文件
  • 第三種 使用類對象
    應用:在項目中使用固定的配置
    在這裏插入圖片描述
  • 第四種 使用環境變量
    環境變量: 操作系統運行環境的時候需要的變量信息
    應用場景: 配置文件的地址不固定,配置文件私密
    在linux 中配置 export KEY = VALUE

配置環境變量DEBUG舉例
在這裏插入圖片描述
報錯
在這裏插入圖片描述
添加環境變量
在這裏插入圖片描述
在這裏插入圖片描述
完整的正確寫法
在這裏插入圖片描述

silent: 決定加載環境變量的時候,是否報錯

  • True 安靜處理,如果沒有對應的環境變量,忽略
  • False 不安靜處理 當加載環境,沒有對應環境變量的時候,報錯

二、項目的優化


上面的代碼,將視圖和模型寫在了一個文件當中,在工作中,不能夠將模型和試圖寫在一個文件中,flask也是遵循MVC的設計模式,是一種解耦合

一般在項目中,創建子應用來方便管理項目 例如:
在這裏插入圖片描述


1. views視圖


用來編寫函數;大致部分如下:

  • 從封裝好的py文件中導包,將使用到的導入
    在這裏插入圖片描述
  • 接受的各種請求處理函數
    在這裏插入圖片描述
  • 運行文件(可寫可不寫,可以直接通過終端來運行文件:通過封裝好的方法)在這裏插入圖片描述

2. models 模型


from main import db
import datetime
class BaseModel(db.Model):
    ##
    __abstract__ = True    ###  聲明當前類爲抽象類,被繼承 調用不會被創建
    id = db.Column(db.Integer,primary_key=True)
    def save(self):
        db.session.add(self)
        db.session.commit()
    def merge(self):
        db.session.merge(self)
        db.session.commit()
    def delete(self):
        db.session.delete(self)
        db.session.commit()


class UserInfo(BaseModel):
    __tablename__ = 'userinfo'     ## 表名
    # id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(32))
    age = db.Column(db.Integer)
    time = db.Column(db.DATETIME,default=datetime.datetime.now())  ## auto_now = True
class User(BaseModel):
    __tablename__ = "user"
    name = db.Column(db.String(32))
    phone = db.Column(db.String(11))
  • 基類:
    在這裏插入圖片描述
  • 其他類
    在這裏插入圖片描述

3. manage.py 封裝如下(migrate和runserver)


在這裏插入圖片描述
通過判斷來達到預期效果
在這裏插入圖片描述
修改後:
在這裏插入圖片描述

  • 在flask中有自帶方法可以使我們更好的使用manage.py文件
    在這裏插入圖片描述

4. settings配置文件


在這裏插入圖片描述


5. main.py


主要用來和settings配合加載配置項和sqlalchemy綁定flask項目
在這裏插入圖片描述


三、 幾種加載settings方式


# app.config.from_pyfile("settings.py")  ## 使用python文件做配置文件
# app.config.from_object("settings.TestConfig")
# app.config.from_envvar()  ## 環境變量中加載
# app.config.from_json()  ## 從json串中加載
# app.config.from_mapping()  ## mapping  ---> 字典類型

發佈了107 篇原創文章 · 獲贊 43 · 訪問量 7073
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章