Flask框架實現MVC架構+sqlalchemy連接數據庫

果然跟着python2的項目學習Flask有點讓人煩躁- - ,除了今天藍橋杯模擬賽,搞了一天才這麼點進度。我去!

什麼是MVC架構

完成後的目錄結構是這樣的:非常簡單,一個static文件夾,一個templates文件夾,一個py文件。

以上的目錄結構是flask初始時的結構,這個只能應對很小的項目,對於大型複雜的項目,我們需要引入包的管理,MVC架構設計。

  • Model(模型)
    是應用程序中用於處理應用程序數據邏輯的部分。通常模型對象負責在數據庫中存取數據。
  • View(視圖)
    是應用程序中處理數據顯示的部分,通常視圖是依據模型數據創建的。
  • Controller(控制器)
    是應用程序中處理用戶交互的部分,通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。
    在這裏插入圖片描述

目錄結構重構,引入包管理

  • 新建一個runserver.py文件,作爲項目統一入口文件
  • 新建blog2文件夾,把已存在的static,templates,app.py移到blog文件夾下,然後分別建controller、model包(右擊blog2,選擇python package)。把app.py改名爲__init__.py,新建setting.py 文件。
  1. 最上層FirstFlask目錄是項目名稱,一個項目下可以包括多個模塊,也就是應用,每個應用下有自己的配置文件,初始化文件,MVC架構。
  2. runserver.py:與應用模塊平級,作爲項目啓動文件
  3. blog文件夾:

    model: MVC中的M,負責在數據庫中存取數據。
    templates:MVC中的V,處理數據顯示的部分。
    controller: MVC中的C,控制器負責控制用戶輸入,併發送數據。

開發代碼

__init__.py文件

#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
#@Time  : 2020/3/10 11:39
#@Author: ChenZIDu
#@File  : __init__.py.py


from flask import Flask

#創建項目對象
app = Flask(__name__)

runserver.py文件

# _*_ coding: utf-8 _*_

from blog import app

@app.route('/')     #路由
def index():
    return 'Please login~'


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

運行runserver.py文件就可以看到效果了

http://127.0.0.1:5000

setting.py配置文件

添加配置數據庫連接信息,如下:

#!/usr/bin/env python3
# _*_ coding: utf-8 _*__ * _
# @Time  : 2020/3/10 11:39
# @Author: ChenZIDu
# @File  : setting.py.py

# 調試模式是否開啓
DEBUG = True

# session 必須要設置key
SECRET_KEY = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

DIALECT = 'mysql'  # 要用的什麼數據庫
DRIVER = 'mysqlconnector' # 連接數據庫驅動   官方驅動解決1366問題
USERNAME = 'root'  # 用戶名
PASSWORD ='root'  # 密碼
HOST = 'localhost'  # 服務器
PORT ='3306' # 端口
DATABASE = 'flask' # 數據庫名

SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT, DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False

注意可能會有1366錯誤

Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 484") result = self._query(query)

錯誤要換成MySQL自己的驅動mysqlconnector,不過我代碼已經換好了- -

ModuleNotFoundError: No module named 'mysql’錯誤

要安裝驅動`pip install mysql-connector`

__init__.py讀取配置文件

因爲有順序問題,我直接把源碼放出來-.-多刪少補

#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
# @Time  : 2020/3/10 11:39
# @Author: ChenZIDu
# @File  : __init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# import  os
# print(os.environ.keys())
# print(os.environ.get('FLASKR_SETTINGS'))


# 加載配置文件內容
app.config.from_object('blog.setting')      # 模塊下的setting文件名,不用加py後綴
app.config.from_envvar('FLASKR_SETTINGS')    # 環境變量,指向配置文件setting的路徑

db = SQLAlchemy(app)
# 創建數據庫對象

from blog.model import User,Category    ##下面兩句都要在db下面,因爲要先創建才能用
db.create_all()

FLASKR_SETTINGS環境變量要自己設置

可以手動設置,或者再powershell裏面設置

set FLASKR_SETTINGS=C:\***\FirstFlask\blog\setting.py
後面放絕對路徑就行了

設計數據庫

建兩個表:User、Category表,一個放文章一個放用戶,採用python的orm框架flask-sqlalchemy實現表的創建、增刪改查功能。

  • 在model文件夾中添加User.py和Category.py文件
  1. User.py
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
#@Time  : 2020/3/10 18:17
#@Author: ChenZIDu
#@File  : User.py

from blog import db

class User(db.Model):
    __tablename__ = 'b_user'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(10),unique=True)
    password = db.Column(db.String(16))

    def __init__(self,username,password):
        self.username  = username
        self.password = password
    def __repr__(self):
        return '<User %r>' % self.username
  1. Category.py
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
#@Time  : 2020/3/10 19:07
#@Author: ChenZIDu
#@File  : Category.py

from blog import db

class Category(db.Model):
    __tablename__ = 'b_category'
    id = db.Column(db.Integer,primary_key=True)
    title = db.Column(db.String(20),unique=True)
    content = db.Column(db.String(100))

    def __init__(self,title,content):
        self.title = title
        self.content = content
    def __repr__(self):
        return '<Category %r>' % self.title

創建數據表的語句已經再__init__.py裏面了,也可以在Python Console裏面搞

from blog2 import db  #建立連接
db.create_all()   #創建數據表

在這裏插入圖片描述
查看更多內容可以看我個人博客-歡迎友鏈~

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