当前位置:   article > 正文

Python全栈 Web(基于Flask框架的完整项目、项目搭建)

搭建项目后端flask框架




个人博客项目  前端模板目录结构

将动态网页放在templates模板目录中

将静态文件以及静态页面放在static目录中

3d95cacd2da40895ad1de8bd65d74c3921316fe0



项目的整体效果














搭建后端Flask项目    


数据库的建模




初始化数据库


1 创建项目数据库




2 将构建好的表进行初始化  输入密码即可导入




验证数据库



blog.sql文件



  1. /*
  2. Navicat MySQL Data Transfer
  3. Source Server : localhost
  4. Source Server Version : 50721
  5. Source Host : localhost:3306
  6. Source Database : blog
  7. Target Server Type : MYSQL
  8. Target Server Version : 50721
  9. File Encoding : 65001
  10. Date: 2018-10-09 00:03:02
  11. */
  12. SET FOREIGN_KEY_CHECKS=0;
  13. -- ----------------------------
  14. -- Table structure for `blogtype`
  15. -- ----------------------------
  16. DROP TABLE IF EXISTS `blogtype`;
  17. CREATE TABLE `blogtype` (
  18. `id` int(11) NOT NULL AUTO_INCREMENT,
  19. `type_name` varchar(20) NOT NULL,
  20. PRIMARY KEY (`id`)
  21. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='博客类型 - 个人博客,公开博客,其他博客';
  22. -- ----------------------------
  23. -- Records of blogtype
  24. -- ----------------------------
  25. INSERT INTO `blogtype` VALUES ('1', '个人博客');
  26. INSERT INTO `blogtype` VALUES ('2', '公开博客');
  27. INSERT INTO `blogtype` VALUES ('3', '其他博客');
  28. -- ----------------------------
  29. -- Table structure for `category`
  30. -- ----------------------------
  31. DROP TABLE IF EXISTS `category`;
  32. CREATE TABLE `category` (
  33. `id` int(11) NOT NULL AUTO_INCREMENT,
  34. `cate_name` varchar(50) NOT NULL,
  35. PRIMARY KEY (`id`)
  36. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='文章分类';
  37. -- ----------------------------
  38. -- Records of category
  39. -- ----------------------------
  40. INSERT INTO `category` VALUES ('1', 'Python');
  41. INSERT INTO `category` VALUES ('2', 'Python Web');
  42. INSERT INTO `category` VALUES ('3', '爬虫');
  43. INSERT INTO `category` VALUES ('4', '人工智能');
  44. -- ----------------------------
  45. -- Table structure for `reply`
  46. -- ----------------------------
  47. DROP TABLE IF EXISTS `reply`;
  48. CREATE TABLE `reply` (
  49. `id` int(11) NOT NULL,
  50. `user_id` int(11) NOT NULL,
  51. `topic_id` int(11) NOT NULL,
  52. `content` text NOT NULL,
  53. `reply_time` datetime DEFAULT NULL,
  54. PRIMARY KEY (`id`),
  55. KEY `FK_Reply_User` (`user_id`),
  56. KEY `FK_Reply_Topic` (`topic_id`),
  57. CONSTRAINT `FK_Reply_Topic` FOREIGN KEY (`topic_id`) REFERENCES `topic` (`id`),
  58. CONSTRAINT `FK_Reply_User` FOREIGN KEY (`user_id`) REFERENCES `user` (`ID`)
  59. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='博客回复';
  60. -- ----------------------------
  61. -- Records of reply
  62. -- ----------------------------
  63. -- ----------------------------
  64. -- Table structure for `topic`
  65. -- ----------------------------
  66. DROP TABLE IF EXISTS `topic`;
  67. CREATE TABLE `topic` (
  68. `id` int(11) NOT NULL AUTO_INCREMENT,
  69. `title` varchar(200) NOT NULL,
  70. `pub_date` datetime NOT NULL,
  71. `read_num` int(11) DEFAULT NULL,
  72. `content` text NOT NULL,
  73. `images` text,
  74. `blogtype_id` int(11) DEFAULT NULL,
  75. `category_id` int(11) DEFAULT NULL,
  76. `user_id` int(11) DEFAULT NULL,
  77. PRIMARY KEY (`id`),
  78. KEY `FK_Topic_User` (`user_id`),
  79. KEY `FK_Topic_Blogtype` (`blogtype_id`),
  80. KEY `FK_Topic_Category` (`category_id`),
  81. CONSTRAINT `FK_Topic_Blogtype` FOREIGN KEY (`blogtype_id`) REFERENCES `blogtype` (`id`),
  82. CONSTRAINT `FK_Topic_Category` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`),
  83. CONSTRAINT `FK_Topic_User` FOREIGN KEY (`user_id`) REFERENCES `user` (`ID`)
  84. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='博客文章';
  85. -- ----------------------------
  86. -- Records of topic
  87. -- ----------------------------
  88. INSERT INTO `topic` VALUES ('1', '简单而直接的Python Web框架', '2018-08-08 20:37:20', '123', 'From:https://www.oschina.net/question/5189_4306\r\n\r\nFrom:https://www.oschina.net/question/5189_4306\r\n\r\n\r\n\r\nWeb.py Cookbook 简体中文版:http://webpy.org/cookbook/index.zh-cn\r\n\r\nweb.py 0.3 新手指南:http://webpy.org/docs/0.3/tutorial.zh-cn\r\n\r\n\r\n\r\nwebpy 官网文档:http://webpy.org/ web.py 十分钟创建简易博客:http://blog.csdn.net/freeking101/article/details/53020728\r\n\r\nweb.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。而且相当的小巧,应当归属于轻量级的web 框架。但这并不影响web.py 的强大,而且使用起来很简单、很直接。在实际应用上,web.py 更多的是学术上的价值,因为你可以看到更多web 应用的底层,这在当今“抽象得很好”的web 框架上是学不到的 :) 如果想了解更多web.py,可以访问web.py 的官方文档。 先感受一下web.py 的简单而强大:\r\n\r\n上面就是一个基于web.py 的完整的Web 应用。将上面的代码保存为文件code.py,在命令行下执行python code.py。然后打开你的浏览器,打开地址:http://localhost:8080 或者 http://localhost:8080/test 没有意外的话(当然要先安装web.py,下面会有介绍),浏览器会显示“Hello, world”或者 “Hello, test”。 \r\n\r\n\r\n\r\n1. 安装 下载 web.py 的安装文件,将下载得到的文件 web.py 解压,进入解压后的文件夹,在命令行下执行:python setup.py install,在Linux 等系统下,需要root 的权限,可以执行:sudo python setup.py install。 2. URL 处理 对于一个站点来说,URL 的组织是最重要的一个部分,因为这是用户看得到的部分,而且直接影响到站点是如何工作的,例如:www.baidu.com ,其URLs 甚至是网页界面的一部分。而web.py 以简单的方式就能够构造出一个强大的URLs。 在每个web.py 应用,必须先import web 模块:', 'images/banner01.jpg', '1', '2', '1');
  89. INSERT INTO `topic` VALUES ('2', 'Python-win10下使用定时任务执行程序', '2017-10-01 00:00:00', '4567', 'webpy 官网文档:http://webpy.org/ web.py 十分钟创建简易博客:http://blog.csdn.net/freeking101/article/details/53020728\r\n\r\nweb.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。而且相当的小巧,应当归属于轻量级的web 框架。但这并不影响web.py 的强大,而且使用起来很简单、很直接。在实际应用上,web.py 更多的是学术上的价值,因为你可以看到更多web 应用的底层,这在当今“抽象得很好”的web 框架上是学不到的 :) 如果想了解更多web.py,可以访问web.py 的官方文档。 先感受一下web.py 的简单而强大:\r\n\r\n上面就是一个基于web.py 的完整的Web 应用。将上面的代码保存为文件code.py,在命令行下执行python code.py。然后打开你的浏览器,打开地址:http://localhost:8080 或者 http://localhost:8080/test 没有意外的话(当然要先安装web.py,下面会有介绍),浏览器会显示“Hello, world”或者 “Hello, test”。 \r\n\r\n\r\n\r\n1. 安装 下载 web.py 的安装文件,将下载得到的文件 web.py 解压,进入解压后的文件夹,在命令行下执行:python setup.py install,在Linux 等系统下,需要root 的权限,可以执行:sudo python setup.py install。 2. URL 处理 对于一个站点来说,URL 的组织是最重要的一个部分,因为这是用户看得到的部分,而且直接影响到站点是如何工作的,例如:www.baidu.com ,其URLs 甚至是网页界面的一部分。而web.py 以简单的方式就能够构造出一个强大的URLs。 在每个web.py 应用,必须先import web 模块:\r\nwebpy 官网文档:http://webpy.org/ web.py 十分钟创建简易博客:http://blog.csdn.net/freeking101/article/details/53020728\r\n\r\nweb.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。而且相当的小巧,应当归属于轻量级的web 框架。但这并不影响web.py 的强大,而且使用起来很简单、很直接。在实际应用上,web.py 更多的是学术上的价值,因为你可以看到更多web 应用的底层,这在当今“抽象得很好”的web 框架上是学不到的 :) 如果想了解更多web.py,可以访问web.py 的官方文档。 先感受一下web.py 的简单而强大:\r\n\r\n上面就是一个基于web.py 的完整的Web 应用。将上面的代码保存为文件code.py,在命令行下执行python code.py。然后打开你的浏览器,打开地址:http://localhost:8080 或者 http://localhost:8080/test 没有意外的话(当然要先安装web.py,下面会有介绍),浏览器会显示“Hello, world”或者 “Hello, test”。 \r\n\r\n\r\n\r\n1. 安装 下载 web.py 的安装文件,将下载得到的文件 web.py 解压,进入解压后的文件夹,在命令行下执行:python setup.py install,在Linux 等系统下,需要root 的权限,可以执行:sudo python setup.py install。 2. URL 处理 对于一个站点来说,URL 的组织是最重要的一个部分,因为这是用户看得到的部分,而且直接影响到站点是如何工作的,例如:www.baidu.com ,其URLs 甚至是网页界面的一部分。而web.py 以简单的方式就能够构造出一个强大的URLs。 在每个web.py 应用,必须先import web 模块:\r\nwebpy 官网文档:http://webpy.org/ web.py 十分钟创建简易博客:http://blog.csdn.net/freeking101/article/details/53020728\r\n\r\nweb.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。而且相当的小巧,应当归属于轻量级的web 框架。但这并不影响web.py 的强大,而且使用起来很简单、很直接。在实际应用上,web.py 更多的是学术上的价值,因为你可以看到更多web 应用的底层,这在当今“抽象得很好”的web 框架上是学不到的 :) 如果想了解更多web.py,可以访问web.py 的官方文档。 先感受一下web.py 的简单而强大:\r\n\r\n上面就是一个基于web.py 的完整的Web 应用。将上面的代码保存为文件code.py,在命令行下执行python code.py。然后打开你的浏览器,打开地址:http://localhost:8080 或者 http://localhost:8080/test 没有意外的话(当然要先安装web.py,下面会有介绍),浏览器会显示“Hello, world”或者 “Hello, test”。 \r\n\r\n\r\n\r\n1. 安装 下载 web.py 的安装文件,将下载得到的文件 web.py 解压,进入解压后的文件夹,在命令行下执行:python setup.py install,在Linux 等系统下,需要root 的权限,可以执行:sudo python setup.py install。 2. URL 处理 对于一个站点来说,URL 的组织是最重要的一个部分,因为这是用户看得到的部分,而且直接影响到站点是如何工作的,例如:www.baidu.com ,其URLs 甚至是网页界面的一部分。而web.py 以简单的方式就能够构造出一个强大的URLs。 在每个web.py 应用,必须先import web 模块:\r\nFrom:https://www.oschina.net/question/5189_4306\r\n\r\nFrom:https://www.oschina.net/question/5189_4306\r\n\r\n\r\n\r\nWeb.py Cookbook 简体中文版:http://webpy.org/cookbook/index.zh-cn\r\n\r\nweb.py 0.3 新手指南:http://webpy.org/docs/0.3/tutorial.zh-cn\r\n\r\n\r\n\r\nwebpy 官网文档:http://webpy.org/ web.py 十分钟创建简易博客:http://blog.csdn.net/freeking101/article/details/53020728\r\n\r\nweb.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。而且相当的小巧,应当归属于轻量级的web 框架。但这并不影响web.py 的强大,而且使用起来很简单、很直接。在实际应用上,web.py 更多的是学术上的价值,因为你可以看到更多web 应用的底层,这在当今“抽象得很好”的web 框架上是学不到的 :) 如果想了解更多web.py,可以访问web.py 的官方文档。 先感受一下web.py 的简单而强大:\r\n\r\n上面就是一个基于web.py 的完整的Web 应用。将上面的代码保存为文件code.py,在命令行下执行python code.py。然后打开你的浏览器,打开地址:http://localhost:8080 或者 http://localhost:8080/test 没有意外的话(当然要先安装web.py,下面会有介绍),浏览器会显示“Hello, world”或者 “Hello, test”。 \r\n\r\n\r\n\r\n1. 安装 下载 web.py 的安装文件,将下载得到的文件 web.py 解压,进入解压后的文件夹,在命令行下执行:python setup.py install,在Linux 等系统下,需要root 的权限,可以执行:sudo python setup.py install。 2. URL 处理 对于一个站点来说,URL 的组织是最重要的一个部分,因为这是用户看得到的部分,而且直接影响到站点是如何工作的,例如:www.baidu.com ,其URLs 甚至是网页界面的一部分。而web.py 以简单的方式就能够构造出一个强大的URLs。 在每个web.py 应用,必须先import web 模块:', 'images/banner02.jpg', '1', '2', '1');
  90. INSERT INTO `topic` VALUES ('3', '爬虫微课5小时 python学习路线', '2015-10-01 00:00:00', '0', 'Python 安装配置及基本语法篇 Python 语言速成 Python 基本知识 Python 常用表达式 Python 基础语法 Python 语法篇:菜鸟的Python笔记 Python精要参考:快速入门 《Python标... ', 'images/banner03.jpg', '1', '2', '1');
  91. INSERT INTO `topic` VALUES ('4', 'linux升级Pip3,安装pip svn', '2016-09-21 00:00:00', '234', 'python中打开TXT文件报错2017年03月09日 14:30:57 阅读数:676 在IDLE命令行引用一文件夹下的函数,来了条错误提示:FileNotFoundError: [Errno 2] No such ...', 'images/toppic01.jpg', '1', '2', '1');
  92. INSERT INTO `topic` VALUES ('5', '精通python变成', '2017-12-04 00:00:00', '999', '随便写点内容吧', 'images/zd01.jpg', '1', '2', '1');
  93. -- ----------------------------
  94. -- Table structure for `user`
  95. -- ----------------------------
  96. DROP TABLE IF EXISTS `user`;
  97. CREATE TABLE `user` (
  98. `ID` int(11) NOT NULL AUTO_INCREMENT,
  99. `loginname` varchar(50) NOT NULL,
  100. `uname` varchar(30) NOT NULL,
  101. `email` varchar(200) NOT NULL,
  102. `url` varchar(200) DEFAULT NULL,
  103. `upwd` varchar(30) NOT NULL,
  104. `is_author` tinyint(4) DEFAULT '0',
  105. PRIMARY KEY (`ID`)
  106. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='用户信息表';
  107. -- ----------------------------
  108. -- Records of user
  109. -- ----------------------------
  110. INSERT INTO `user` VALUES ('1', 'piye', 'Paris', 'wei5218023@gmail.com', null, '123456', '1');
  111. INSERT INTO `user` VALUES ('2', 'weiye', '魏爷', 'weimz@163.com', null, '123456', '0');
  112. INSERT INTO `user` VALUES ('3', 'lvye', '吕爷', 'lvye@163.com', null, '123456', '0');
  113. -- ----------------------------
  114. -- Table structure for `voke`
  115. -- ----------------------------
  116. DROP TABLE IF EXISTS `voke`;
  117. CREATE TABLE `voke` (
  118. `id` int(11) NOT NULL,
  119. `user_id` int(11) NOT NULL,
  120. `topic_id` int(11) NOT NULL,
  121. PRIMARY KEY (`id`),
  122. KEY `FK_Voke_User` (`user_id`),
  123. KEY `FK_Voke_Topic` (`topic_id`),
  124. CONSTRAINT `FK_Voke_Topic` FOREIGN KEY (`topic_id`) REFERENCES `topic` (`id`),
  125. CONSTRAINT `FK_Voke_User` FOREIGN KEY (`user_id`) REFERENCES `user` (`ID`)
  126. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='点赞';
  127. -- ----------------------------
  128. -- Records of voke
  129. -- ----------------------------




项目的整体划分





搭建目录结构





整体结构搭建好以后当然是要疯狂调试了


1 首先创建一个app构建函数  并将app连接到mysql数据库并做主要配置



  1. # blogapp下的__init__.py文件
  2. # 将整个应用初始化
  3. # 主要工作
  4. # 1:构建flask应用以及各种配置
  5. # 2:构建SQLAlchemy的应用
  6. from flask import Flask
  7. from flask_sqlalchemy import SQLAlchemy
  8. import pymysql
  9. pymysql.install_as_MySQLdb()
  10. db = SQLAlchemy()
  11. def create_app():
  12. app = Flask(__name__)
  13. # 配置启动模式为调试模式
  14. app.config["DEBUG"] = True
  15. # 配置数据库的连接
  16. app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:ParisPython@127.0.0.1:3306/blog"
  17. # 配置数据库内容在更新时自动提交
  18. app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True
  19. # 配置session所需要的秘钥
  20. app.config["SECRET_KEY"] = "Paispasswordkey"
  21. # 数据库的初始化
  22. db.init_app(app)
  23. return app



2 将数据库中的所有表映射到Python中



  1. # 当前项目相关的模型文件 所有 实体类
  2. from . import db
  3. # 博客分类
  4. class Category(db.Model):
  5. __tablename__ = "category"
  6. id = db.Column(db.Integer, primary_key=True)
  7. cate_name = db.Column(db.String(50), nullable=False)
  8. # 反向引用 topic表 每个category对象都有一个topic属性
  9. topic = db.relationship("Topic", backref="category", lazy="dynamic")
  10. # 博客类型
  11. class BlogType(db.Model):
  12. __tablename__ = "blogtype"
  13. id = db.Column(db.Integer, primary_key=True)
  14. type_name = db.Column(db.String(20), nullable=False)
  15. # 反向引用 topic表 每个blogtype对象都有一个topic属性
  16. topic = db.relationship("Topic", backref="blogtype", lazy="dynamic")
  17. # 用户信息
  18. class User(db.Model):
  19. __tablename__ = "user"
  20. id = db.Column(db.Integer, primary_key=True)
  21. loginname = db.Column(db.String(50), nullable=False)
  22. uname = db.Column(db.String(30), nullable=False)
  23. email = db.Column(db.String(200), nullable=False)
  24. url = db.Column(db.String(200))
  25. upwd = db.Column(db.String(30), nullable=False)
  26. is_author = db.Column(db.String(4), default=0)
  27. # 反向引用 topic表 每个user对象都有一个topic属性
  28. topic = db.relationship("Topic", backref="user", lazy="dynamic")
  29. # 反向引用 reply表 每个user对象都有一个reply属性
  30. reply = db.relationship("Reply", backref="user", lazy="dynamic")
  31. # 关系:多对多
  32. # 增加与topic之间的关联关系
  33. voke_topic = db.relationship("Topic",
  34. secondary="voke",
  35. backref=db.backref("voke_user", lazy="dynamic"),
  36. lazy="dynamic"
  37. )
  38. # 主题内容
  39. class Topic(db.Model):
  40. __tablename__ = "topic"
  41. id = db.Column(db.Integer, primary_key=True)
  42. title = db.Column(db.String(200), nullable=False)
  43. pub_date = db.Column(db.DateTime, nullable=False)
  44. read_num = db.Column(db.Integer, default=0)
  45. content = db.Column(db.Text, nullable=False)
  46. images = db.Column(db.Text)
  47. # 关系:一(blogtyp,category,user)对多 (topic)
  48. # 外键关联blogtype表每个topic对象都有一个blogtype属性
  49. blogtype_id = db.Column(db.Integer, db.ForeignKey("blogtype.id"))
  50. # 外键关联category表每个topic对象都有一个category属性
  51. category_id = db.Column(db.Integer, db.ForeignKey("category.id"))
  52. # 外键关联user表每个topic对象都有一个user属性
  53. user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
  54. # 反向引用 reply表 每个topic对象都有一个reply属性
  55. reply = db.relationship("Reply", backref="topic", lazy="dynamic")
  56. # 回复内容信息
  57. class Reply(db.Model):
  58. __tablename__ = "reply"
  59. id = db.Column(db.Integer, primary_key=True)
  60. content = db.Column(db.Text, nullable=False)
  61. reply_time = db.Column(db.DateTime)
  62. # 关系:一(topic,user)对多 (reply)
  63. # 外键关联user表 reply对象都有一个user属性
  64. user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
  65. # 外键关联topic表 reply对象都有一个topic属性
  66. topic_id = db.Column(db.Integer, db.ForeignKey("topic.id"), nullable=False)
  67. # 多对多 第三张关联关系表
  68. Voke = db.Table(
  69. "voke",
  70. db.Column("id", db.Integer, primary_key=True),
  71. db.Column("user_id", db.Integer, db.ForeignKey("user.id")),
  72. db.Column("topic_id", db.Integer, db.ForeignKey("topic.id"))
  73. )



3 在项目管理文件中创建一个APP 并作为项目的启动文件


  1. # 主目录 manage.py
  2. # 启动和管理项目
  3. from blogapp import create_app
  4. app = create_app()
  5. if __name__ == "__main__":
  6. app.run()


4  将user业务和main业务 利用蓝图关联到app  并且让app能够处理users和main的视图函数



  1. # users针对用户逻辑处理的目录
  2. # __init__.py 针对用户业务逻辑的初始化操作
  3. # 将flask框架的蓝图导入
  4. from flask import Blueprint
  5. # 构建蓝图程序
  6. users = Blueprint("users", __name__)
  7. # 导入当前包的路由和视图函数
  8. from . import views


  1. # main 包含主要的业务逻辑的路由和视图函数
  2. # __init__.py 对主业务逻辑程序的初始化操作
  3. # 将flask框架的蓝图导入
  4. from flask import Blueprint
  5. # 构建蓝图程序
  6. main = Blueprint("main", __name__)
  7. # 导入当前包的路由和视图函数
  8. from . import views



  1. # blogapp下的__init__.py文件
  2. # 将整个应用初始化
  3. # 主要工作
  4. # 1:构建flask应用以及各种配置
  5. # 2:构建SQLAlchemy的应用
  6. from flask import Flask
  7. from flask_sqlalchemy import SQLAlchemy
  8. import pymysql
  9. pymysql.install_as_MySQLdb()
  10. db = SQLAlchemy()
  11. def create_app():
  12. app = Flask(__name__)
  13. # 配置启动模式为调试模式
  14. app.config["DEBUG"] = True
  15. # 配置数据库的连接
  16. app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:ParisPython@127.0.0.1:3306/blog"
  17. # 配置数据库内容在更新时自动提交
  18. app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True
  19. # 配置session所需要的秘钥
  20. app.config["SECRET_KEY"] = "Paispasswordkey"
  21. # 数据库的初始化
  22. db.init_app(app)
  23. # 将main蓝图程序与app关联到一起
  24. from .main import main as main_blueprint
  25. # 注册名为main的app
  26. app.register_blueprint(main_blueprint)
  27. # 将users蓝图程序与APP关联到一起
  28. from .users import users as users_blueprint
  29. # 注册名为users的app
  30. app.register_blueprint(users_blueprint) # url_prefix="/user"
  31. return app


5 接下来就是路由、视图函数、数据库的CRUD、模板 的配置了


先将所有模板的基本路由配置好 确保 在点击网页button时能够实现正常跳转


  1. # main主业务逻辑中的视图和路由的定义
  2. from flask import render_template, request
  3. # 导入蓝图程序用于构建路由
  4. from . import main
  5. # 导入db用于操作数据库
  6. from .. import db
  7. # 导入实体列 用户操作数据库
  8. from ..models import *
  9. @main.route("/")
  10. @main.route("/index")
  11. @main.route("/index.html")
  12. def main_index():
  13. return render_template("index.html")
  14. @main.route("/list")
  15. @main.route("/list.html")
  16. def main_list():
  17. return render_template("list.html")
  18. @main.route("/photo")
  19. @main.route("/photo.html")
  20. def main_photo():
  21. return render_template("photo.html")
  22. @main.route("/time")
  23. @main.route("/time.html")
  24. def mian_time():
  25. return render_template("time.html")
  26. @main.route("/gbook")
  27. @main.route("/gbook.html")
  28. def main_gbook():
  29. return render_template("gbook.html")
  30. @main.route("/about")
  31. @main.route("/about.html")
  32. def main_about():
  33. return render_template("about.html")
  34. @main.route("/release")
  35. @main.route("/release.html")
  36. def main_release():
  37. return render_template("release.html")
  38. @main.route("/info")
  39. @main.route("/info.html")
  40. def main_info():
  41. return render_template("info.html")



  1. # users针对用户业务逻辑处理的视图和路由
  2. from flask import render_template
  3. # 导入蓝图程序用于构建路由
  4. from . import users
  5. # 导入db用于操作数据库
  6. from .. import db
  7. # 导入实体列 用户操作数据库
  8. from ..models import *
  9. @users.route("/login")
  10. @users.route("/login.html")
  11. def users_login():
  12. return render_template("login.html")
  13. @users.route("/register")
  14. @users.route("/register.html")
  15. def users_register():
  16. return render_template("register.html")



启动主程序  确保URL可以正常request





首页





确保没问题就可以 其他的就不截图了





6  CRUD模板的动态配置



首页加载完成后从数据库读取当前hover的div显示内容

默认有5个分类

数据库的数据只写了4个这样可以看出是否修改成功






上图5个分类都是静态的 先将静态html修改成模板嵌入Python代码

这里我没删只是将原来的注释掉了

不知道是不是Mac系统的原因pycharm的快捷键注释 都是单行 不是文本注释

看起来别扭 


后端将查询结构传递给前端


  1. @main.route("/")
  2. @main.route("/index")
  3. @main.route("/index.html")
  4. def main_index():
  5. # 查询所有的Category的信息
  6. categories = Category.query.all()
  7. return render_template("index.html", **locals())



前端进行显示



  1. <ul class="sub-nav">
  2. <!--<li><a href="list.html">Python</a></li>-->
  3. <!--<li><a href="list.html">python Web</a></li>-->
  4. <!--<li><a href="list.html">爬虫</a></li>-->
  5. <!--<li><a href="list.html">人工智能</a></li>-->
  6. <!--<li><a href="list.html">JS实例索引</a></li>-->
  7. {% for category in categories %}
  8. <li>
  9. <a href="/list?cateid={{category.id}}">{{category.cate_name}}</a>
  10. </li>
  11. {% endfor %}
  12. </ul>


刷新网页 查看是否修改成功







7轮播图以及侧边置顶的动态配置




大体和上面一样  几乎相同的配置


后端查询数据  查询的方式有很多种 看个人喜好


  1. @main.route("/")
  2. @main.route("/index")
  3. @main.route("/index.html")
  4. def main_index():
  5. # 查询所有的Category的信息
  6. categories = Category.query.all()
  7. # 查询所有的topic的信息
  8. # topics = Topic.query.all()[0:5]
  9. topics = Topic.query.limit(5).all()
  10. return render_template("index.html", **locals())



找到轮播图的html

进行动态创建



  1. <!--<li class="slide"><a href="info.html" target="_blank"><img src="../static/images/banner01.jpg"><span class="imginfo">爬虫微课5小时-->
  2. <!--python学习路线!</span></a></li>-->
  3. <!--<li class="slide"><a href="info.html" target="_blank"><img src="../static/images/banner02.jpg"><span class="imginfo">干货|如何优雅的在手机上进行Python编程</span></a></li>-->
  4. <!--<li class="slide"><a href="info.html" target="_blank"><img src="../static/images/banner03.jpg"><span class="imginfo">python-win10下使用定时任务执行程序</span></a></li>-->
  5. {% for topic in topics[:3] %}
  6. <li class="slide">
  7. <a href="/info?topic_id={{ topic.id }}" target="_blank">
  8. <img src="../static/{{ topic.images }}">
  9. <span class="imginfo">{{ topic.title }}</span>
  10. </a>
  11. </li>
  12. {% endfor %}

侧边置顶  这里是采用的是前5条数据 以切片的方式进行遍历的数据

还有一个注意点就是模型对象的外键关联以及反向引用 都有对应的属性或隐式属性

所以这里我用了 topic模型对象的反向引用隐式属性category

也就是在Category模型中反向引用Topic模型时为Topic模型创建的隐式属性category


  1. <div class="toppic">
  2. <!--<li> <a href="info.html" target="_blank"> <i><img src="../static/images/toppic01.jpg"></i>-->
  3. <!--<h2>linux升级py3,安装pip,svn</h2>-->
  4. <!--<span>Linux</span>-->
  5. <!--</a> </li>-->
  6. <!--<li> <a href="info.html" target="_blank"> <i><img src="../static/images/zd01.jpg"></i>-->
  7. <!--<h2>精通Python编程——Python深入浅出教程</h2>-->
  8. <!--<span>python</span>-->
  9. <!--</a> </li>-->
  10. {% for topic in topics[3:5] %}
  11. <li>
  12. <a href="info?topic_id={{ topic.id }}" target="_blank">
  13. <i>
  14. <img src="../static/{{ topic.images }}">
  15. </i>
  16. <h2>{{ topic.title }}</h2>
  17. <span>{{ topic.category.cate_name }}</span>
  18. </a>
  19. </li>
  20. {% endfor %}
  21. </div>


刷新网页依然可以正常显示








未完待续。。。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/51703
推荐阅读
相关标签
  

闽ICP备14008679号