当前位置: 首页 > news >正文

Python轻量级Web框架Flask(13)—— Flask个人博客项目

0、前言:

  • ★这部分内容是基于之前Flask学习内容的一个实战项目梳理内容,没有可以直接抄下来跑的代码,是学习了之前Flask基础知识之后,再来看这部分内容,就会对Flask项目开发流程有更清楚的认知,对一些开发细节可以进一步的学习。
  • 项目功能,通过Flask制作个人博客。
  • 项目架构:项目分为两部分,第一部分是展示给别人的前端页面,第二部分是展示给自己的后台数据管理页面。
  • 该项目是前后端不分离项目
  • 在搭建一个项目之前一定要先把数据库设计好,把数据库中的表设计好,表和表之间的关系弄清楚

1、项目设计流程:

  • 数据库设计 > 架构设计 > 代码实现

2、架构设计:

  • 1、由于项目中视图函数可能会有多个,因此最好是通过设计views的python包来管理视图函数,因此在views包中有两个视图函数文件一个是views管理展示给别人的视图函数,views_admin管理展示给自己的后台数据管理的视图函数。
  • 2、同理由于该项目需要也设置了models的python包将数据分为前端展示数据(models)和后台数据(models_admin)两部分。做完这两部分修改后,注意在初始化中修改导包,修改app绑定的蓝图,有了两个视图函数文件,就会有两个蓝图,一个蓝图叫blog管理前端页面,一个蓝图叫admin管理博客后台管理系统。

3、数据库设计:

  • 1、models中数据表设计:【分类表(1):文章表(N)、相册表】
  • 2、models_admin中数据表设计:【用户信息表】
    在这里插入图片描述

4、项目框架展示

在这里插入图片描述

  • 1、注意项目中用到的图片有两种添加方式,图片在数据表中是通过url的方式存储的,添加图片第一种方式是数据服务器,第二种方式是使用静态文件,一般正规公司项目开发都是使用静态文件的方式,通过数据服务器存放图片url。
  • 2、因为views和models都分为了两个包,分别存放展示页面与后台管理页面相关内容,所以这两部分的页面和这两部分的数据库是分开的,因此这两部分视图函数也是分开的,功能上互不干预。

5、项目主要文件代码展示

  • 1、app
# Flask个人博客项目
from App import creat_app
app = creat_app()
if __name__ == '__main__':app.run(debug=True)
  • 2、models
# models.py : 模型,数据库'''模型      ===      数据库类        ——>     表结构类属性     ——>    表字段一个对象   ——>    表的一行数据
'''
from ..exts import db # 导入db对象就能通过python实现ORM技术,避免了写SQL语句。# 分类数据表
class CategoryModel(db.Model):# 表名__tablename__ = 'tb_category'   # 数据迁移就是让模型变成表,ORM就是让类变成模型# 定义表字段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'   # 数据迁移就是让模型变成表,ORM就是让类变成模型# 定义表字段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')
  • 3、models_admin
from ..exts import db # 导入db对象就能通过python实现ORM技术,避免了写SQL语句。# 模型Model:类
# 必须继承 db.Model User才能从普通的类变成模型
class AdminUserModel(db.Model):# 表名__tablename__ = 'tb_adminuser'   # 数据迁移就是让模型变成表,ORM就是让类变成模型# 定义表字段id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(30), unique=True)passwd = db.Column(db.String(30))# 通过orm技术得到的db,就是用于替代数据库,后面用到数据库相关操作,可以检索。
  • 4、views
# 在views.py中放路由和视图函数from flask import Blueprint, render_template, request
from ..models.models import * #后面是用views来控制数据库的,所以要在views中导入models文件# 蓝图(蓝图可以有多个,方便对路径进行区分)
blog = Blueprint('blog', __name__)# 博客首页
@blog.route('/')
@blog.route('/index/')
def index():# 修改首页中“我的相册”当中的6张图,调用photos数据库中前6张图片# 修改首页中“文章分类”# 修改首页中“iKun推荐”# 修改首页中右侧的文章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)
  • 4、views_admin
# 在views.py中放路由和视图函数from flask import Blueprint, render_template, request, redirect, jsonify
from ..models.models_admin import * #后面是用views来控制数据库的,所以要在views中导入models文件
from ..models
http://www.lryc.cn/news/347245.html

相关文章:

  • 电商技术揭秘营销相关系列文章合集(4)
  • LeetCode-2391. 收集垃圾的最少总时间【数组 字符串 前缀和】
  • 再有人说数字孪生大屏没有用,用这8条怼回去。
  • 蓝桥杯练习系统(算法训练)ALGO-946 Q神的足球赛
  • 【Android】Kotlin学习之Kotlin方法的声明和传参
  • 微信小程序 17:小程序使用 npm 包和组件应用
  • 【mysql篇】执行delete删除大量数据后,磁盘未清空,为什么?
  • 【Qt 学习笔记】Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍
  • 在Mars3d实现cesium的ImageryLayer自定义瓦片的层级与原点
  • logback日志持久化
  • 函数原型(Function Prototype)、函数定义(Function Definition)和函数声明(Function Declaration)
  • Go有无缓冲channel的区别
  • 【全开源】Fastflow工作流系统(源码搭建/上线/运营/售后/维护更新)
  • 超越传统游戏:生成式人工智能对游戏的变革性影响
  • SpringCloud微服务之Eureka、Ribbon、Nacos详解
  • 五角钱的程序员 | Kafka 是什么?
  • C++中合成的默认构造函数的访问权限
  • 【前端】桌面版docker并部署前端项目
  • 发布GPT-5的方式可能会与以往不同;开源vocode使用 AI 自动拨打电话;开源gpt智能对话客服工具;AI自动写提示词
  • Linux 作业管理 (bg, fg, jobs, kill)
  • springboot Redis 支持星号(*) 包括注解@Cache
  • 2023.5.12 第43周周报
  • JavaEE 多线程详细讲解(2)
  • Flask-HTTP请求、响应、上下文、进阶实验
  • springboot 设置response和request的默认格式 驼峰或者SNAKE_CASE
  • VR全景技术在养老院的应用优势浅析
  • [Spring Cloud] (6)gateway整体加解密
  • RUST编程语言入门基础2024
  • Linux进程控制——Linux进程终止
  • 利用IP地址查询解决被“薅羊毛”的方法