0、前言:
- ★這部分內(nèi)容是基于之前Flask學(xué)習(xí)內(nèi)容的一個(gè)實(shí)戰(zhàn)項(xiàng)目梳理內(nèi)容,沒(méi)有可以直接抄下來(lái)跑的代碼,是學(xué)習(xí)了之前Flask基礎(chǔ)知識(shí)之后,再來(lái)看這部分內(nèi)容,就會(huì)對(duì)Flask項(xiàng)目開發(fā)流程有更清楚的認(rèn)知,對(duì)一些開發(fā)細(xì)節(jié)可以進(jìn)一步的學(xué)習(xí)。
- 項(xiàng)目功能,通過(guò)Flask制作個(gè)人博客。
- 項(xiàng)目架構(gòu):項(xiàng)目分為兩部分,第一部分是展示給別人的前端頁(yè)面,第二部分是展示給自己的后臺(tái)數(shù)據(jù)管理頁(yè)面。
- 該項(xiàng)目是前后端不分離項(xiàng)目
- 在搭建一個(gè)項(xiàng)目之前一定要先把數(shù)據(jù)庫(kù)設(shè)計(jì)好,把數(shù)據(jù)庫(kù)中的表設(shè)計(jì)好,表和表之間的關(guān)系弄清楚
1、項(xiàng)目設(shè)計(jì)流程:
- 數(shù)據(jù)庫(kù)設(shè)計(jì) > 架構(gòu)設(shè)計(jì) > 代碼實(shí)現(xiàn)
2、架構(gòu)設(shè)計(jì):
- 1、由于項(xiàng)目中視圖函數(shù)可能會(huì)有多個(gè),因此最好是通過(guò)設(shè)計(jì)views的python包來(lái)管理視圖函數(shù),因此在views包中有兩個(gè)視圖函數(shù)文件一個(gè)是views管理展示給別人的視圖函數(shù),views_admin管理展示給自己的后臺(tái)數(shù)據(jù)管理的視圖函數(shù)。
- 2、同理由于該項(xiàng)目需要也設(shè)置了models的python包將數(shù)據(jù)分為前端展示數(shù)據(jù)(models)和后臺(tái)數(shù)據(jù)(models_admin)兩部分。做完這兩部分修改后,注意在初始化中修改導(dǎo)包,修改app綁定的藍(lán)圖,有了兩個(gè)視圖函數(shù)文件,就會(huì)有兩個(gè)藍(lán)圖,一個(gè)藍(lán)圖叫blog管理前端頁(yè)面,一個(gè)藍(lán)圖叫admin管理博客后臺(tái)管理系統(tǒng)。
3、數(shù)據(jù)庫(kù)設(shè)計(jì):
- 1、models中數(shù)據(jù)表設(shè)計(jì):【分類表(1):文章表(N)、相冊(cè)表】
- 2、models_admin中數(shù)據(jù)表設(shè)計(jì):【用戶信息表】

4、項(xiàng)目框架展示

- 1、注意項(xiàng)目中用到的圖片有兩種添加方式,圖片在數(shù)據(jù)表中是通過(guò)url的方式存儲(chǔ)的,添加圖片第一種方式是數(shù)據(jù)服務(wù)器,第二種方式是使用靜態(tài)文件,一般正規(guī)公司項(xiàng)目開發(fā)都是使用靜態(tài)文件的方式,通過(guò)數(shù)據(jù)服務(wù)器存放圖片url。
- 2、因?yàn)関iews和models都分為了兩個(gè)包,分別存放展示頁(yè)面與后臺(tái)管理頁(yè)面相關(guān)內(nèi)容,所以這兩部分的頁(yè)面和這兩部分的數(shù)據(jù)庫(kù)是分開的,因此這兩部分視圖函數(shù)也是分開的,功能上互不干預(yù)。
5、項(xiàng)目主要文件代碼展示
from App import creat_app
app = creat_app()
if __name__ == '__main__':app.run(debug=True)
'''模型 === 數(shù)據(jù)庫(kù)類 ——> 表結(jié)構(gòu)類屬性 ——> 表字段一個(gè)對(duì)象 ——> 表的一行數(shù)據(jù)
'''
from ..exts import db
class CategoryModel(db.Model):__tablename__ = 'tb_category' id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(30), unique=True)describe = db.Column(db.Text(), default='describe')articles = db.relationship('ArticleModel', backref='category', lazy='dynamic')
class ArticleModel(db.Model):__tablename__ = 'tb_article' id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(30), unique=True)keyword = db.Column(db.String(255), default='keyword')content = db.Column(db.Text(), default='content')img = db.Column(db.Text(), default='img')category_id = db.Column(db.Integer, db.ForeignKey(CategoryModel.id))
class PhotoModel(db.Model):__tablename__ = 'tb_photo'id = db.Column(db.Integer, primary_key=True, autoincrement=True)url = db.Column(db.Text())name = db.Column(db.String(30), unique=True)describe = db.Column(db.Text(), default='describe')
from ..exts import db
class AdminUserModel(db.Model):__tablename__ = 'tb_adminuser' id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(30), unique=True)passwd = db.Column(db.String(30))
from flask import Blueprint, render_template, request
from ..models.models import *
blog = Blueprint('blog', __name__)
@blog.route('/')
@blog.route('/index/')
def index():photos = PhotoModel.query.limit(6)categories = CategoryModel.query.all()articles = ArticleModel.query.all()commend_arc = articles[:4]return render_template('home/index.html',photos=photos,categories=categories,articles=commend_arc,arts = articles)
@blog.route('/photos/')
def blog_photos():photos = PhotoModel.query.all()return render_template('home/photos.html', photos = photos)
@blog.route('/article/')
def blog_aritcle():articles = ArticleModel.query.all()categories = CategoryModel.query.all()return render_template('home/article.html', articles = articles, categories = categories)
@blog.route('/about/')
def blog_about():photos1 = PhotoModel.query.all()categories = CategoryModel.query.all()photos = photos1[:6]return render_template('home/about.html', photos = photos, categories = categories)
from flask import Blueprint, render_template, request, redirect, jsonify
from ..models.models_admin import *
from ..models