果然跟着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 文件。
- 最上層FirstFlask目錄是項目名稱,一個項目下可以包括多個模塊,也就是應用,每個應用下有自己的配置文件,初始化文件,MVC架構。
- runserver.py:與應用模塊平級,作爲項目啓動文件
- 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文件就可以看到效果了
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文件
- 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
- 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() #創建數據表