flask项目

Posted PythonKnowledge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask项目相关的知识,希望对你有一定的参考价值。

前期准备

环境搭建

git的作用

1、方便多人协同开发

2、版本控制

与SVN相比特点

svn(集中式版本控制系统)

1、服务端与客户端都有版本控制能力(集中式的客户端没有版本控制能力),都能进行代码提交合并

2、客户端有本地代码仓库(在当前项目的.git文件内,保存本地的版本记录)

工作区 暂存区 仓库区

git命令

创建git仓库并添加忽略文件

 
   
   
 
  1. # 初始化 会自动创建.git、.idea文件夹

  2. git init

  3. # 克隆文件

  4. git clone 路径

  5. # 查看当前文件状态

  6. git status

  7. # 将文件添加至缓存区

  8. git add .(git add 要添加的文件名)

  9. # 添加修改人的信息

  10. git congif user.name "陈东发"

  11. git config user.emai "chendongfa@163.com"

  12. # 将文件上传到本地的代码仓库

  13. git commit -m "修改的信息"

  14. # 将文件上传至服务器代码仓库

  15. git push 路径

创建忽略文件

创建.gitignore 里面保存不用上传的文件

 
   
   
 
  1. .idea/

  2. *.py[cod]

回退版本与撤销修改

 
   
   
 
  1. 尽量使用ctrl + Z

  2. 没有 add .(直接从仓库区直接下载下来,覆盖当前的文件)

  3. git checkout 文件名

  4. add .但没有 commit(先将暂存区代码撤销到工作区,在覆盖文件)

  5. git reset HEAD  文件名

  6. git checkout 文件名

  7. 已经commit

  8.  git reset --hard 版本号

  9.  git reset --hard HEAD(尖括号)

对比版本

 
   
   
 
  1. git diff HEAD HEAD^ -- login.py

删除

 
   
   
 
  1. rm 文件名(从工作目录删除文件)

  2. git rm 文件名(从仓库区删除文件)

误删处理

 
   
   
 
  1. 从仓库区下载

  2. git checkout 文件名

远程仓库

使用github或者码云自己搭建服务器

使用github或者码云自己搭建服务器

标签

作用 记录大版本、备份大版本代码

 
   
   
 
  1. git tag -a 标签名 -m '标签描述'

  2. git tag -a v1.0 -m 'version 1.0'

分支

应用场景:1、开发时不影响主分支上的代码运行 2、 开发测试新功能

主分支主要保存 生产环境代码 主分支不进行代码开发

分支创建 代码合并提交

 
   
   
 
  1. // 查看分支

  2. git branch

  3. // 创建分支

  4. checkout -b dev(分支名)

  5. // 查看分支

  6. git branch

  7. //提交分支

  8. git push -u origin dev

  9. // 提交编辑过的分支内容

  10. git push

  11. // 合并到主分支(1、切换至主分支 2、合并到主分支 3、提交)

  12. git checkout master

  13. git merge dev

  14. git push

数据库创建

数据表分析

数据表模型创建

models.py(数据表模型)

 
   
   
 
  1. from datetime import datetime

  2. from werkzeug.security import generate_password_hash, check_password_hash

  3. from info import constants

  4. from . import db

  5. class BaseModel(object):

  6.    """模型基类,为每个模型补充创建时间与更新时间"""

  7.    create_time = db.Column(db.DateTime, default=datetime.now)  # 记录的创建时间

  8.    update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)  # 记录的更新时间

  9. # 用户收藏表,建立用户与其收藏新闻多对多的关系

  10. tb_user_collection = db.Table(

  11.    "info_user_collection",

  12.    db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True),  # 新闻编号

  13.    db.Column("news_id", db.Integer, db.ForeignKey("info_news.id"), primary_key=True),  # 分类编号

  14.    db.Column("create_time", db.DateTime, default=datetime.now)  # 收藏创建时间

  15. )

  16. tb_user_follows = db.Table(

  17.    "info_user_fans",

  18.    db.Column('follower_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True),  # 粉丝id

  19.    db.Column('followed_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True)  # 被关注人的id

  20. )

  21. class User(BaseModel, db.Model):

  22.    """用户"""

  23.    __tablename__ = "info_user"

  24.    id = db.Column(db.Integer, primary_key=True)  # 用户编号

  25.    nick_name = db.Column(db.String(32), unique=True, nullable=False)  # 用户昵称

  26.    password_hash = db.Column(db.String(128), nullable=False)  # 加密的密码

  27.    mobile = db.Column(db.String(11), unique=True, nullable=False)  # 手机号

  28.    avatar_url = db.Column(db.String(256))  # 用户头像路径

  29.    last_login = db.Column(db.DateTime, default=datetime.now)  # 最后一次登录时间

  30.    is_admin = db.Column(db.Boolean, default=False)

  31.    signature = db.Column(db.String(512))  # 用户签名

  32.    gender = db.Column(  # 订单的状态

  33.        db.Enum(

  34.            "MAN",  # 男

  35.            "WOMAN"  # 女

  36.        ),

  37.        default="MAN")

  38.    # 当前用户收藏的所有新闻lazy="dynamic"

  39.    collection_news = db.relationship("News", secondary=tb_user_collection, lazy="dynamic")  # 用户收藏的新闻

  40.    # 用户所有的粉丝,添加了反向引用followed,代表用户都关注了哪些人

  41.    followers = db.relationship('User',

  42.                                secondary=tb_user_follows,

  43.                                primaryjoin=id == tb_user_follows.c.followed_id,

  44.                                secondaryjoin=id == tb_user_follows.c.follower_id,

  45.                                backref=db.backref('followed', lazy='dynamic'),

  46.                                lazy='dynamic')

  47.    @property

  48.    def password(self):

  49.        raise AttributeError("当前属性不允许读取")

  50.    @password.setter

  51.    def password(self, value):

  52.        # self.password_hash = 对value加密

  53.        self.password_hash = generate_password_hash(value)

  54.    def check_password(self, password):

  55.        """校验密码"""

  56.        return check_password_hash(self.password_hash, password)

  57.    # 当前用户所发布的新闻

  58.    news_list = db.relationship('News', backref='user', lazy='dynamic')

  59.    def to_dict(self):

  60.        resp_dict = {

  61.            "id": self.id,

  62.            "nick_name": self.nick_name,

  63.            "avatar_url": constants.QINIU_DOMIN_PREFIX + self.avatar_url if self.avatar_url else "",

  64.            "mobile": self.mobile,

  65.            "gender": self.gender if self.gender else "MAN",

  66.            "signature": self.signature if self.signature else "",

  67.            "followers_count": self.followers.count(),

  68.            "news_count": self.news_list.count()

  69.        }

  70.        return resp_dict

  71.    def to_admin_dict(self):

  72.        resp_dict = {

  73.            "id": self.id,

  74.            "nick_name": self.nick_name,

  75.            "mobile": self.mobile,

  76.            "register": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),

  77.            "last_login": self.last_login.strftime("%Y-%m-%d %H:%M:%S"),

  78.        }

  79.        return resp_dict

  80. class News(BaseModel, db.Model):

  81.    """新闻"""

  82.    __tablename__ = "info_news"

  83.    id = db.Column(db.Integer, primary_key=True)  # 新闻编号

  84.    title = db.Column(db.String(256), nullable=False)  # 新闻标题

  85.    source = db.Column(db.String(64), nullable=False)  # 新闻来源

  86.    digest = db.Column(db.String(512), nullable=False)  # 新闻摘要

  87.    content = db.Column(db.Text, nullable=False)  # 新闻内容

  88.    clicks = db.Column(db.Integer, default=0)  # 浏览量

  89.    index_image_url = db.Column(db.String(256))  # 新闻列表图片路径

  90.    category_id = db.Column(db.Integer, db.ForeignKey("info_category.id"))

  91.    user_id = db.Column(db.Integer, db.ForeignKey("info_user.id"))  # 当前新闻的作者id

  92.    status = db.Column(db.Integer, default=0)  # 当前新闻状态 如果为0代表审核通过,1代表审核中,-1代表审核不通过

  93.    reason = db.Column(db.String(256))  # 未通过原因,status = -1 的时候使用

  94.    # 当前新闻的所有评论

  95.    comments = db.relationship("Comment", lazy="dynamic")

  96.    def to_review_dict(self):

  97.        resp_dict = {

  98.            "id": self.id,

  99.            "title": self.title,

  100.            "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),

  101.            "status": self.status,

  102.            "reason": self.reason if self.reason else ""

  103.        }

  104.        return resp_dict

  105.    def to_basic_dict(self):

  106.        resp_dict = {

  107.            "id": self.id,

  108.            "title": self.title,

  109.            "source": self.source,

  110.            "digest": self.digest,

  111.            "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),

  112.            "index_image_url": self.index_image_url,

  113.            "clicks": self.clicks,

  114.        }

  115.        return resp_dict

  116.    def to_dict(self):

  117.        resp_dict = {

  118.            "id": self.id,

  119.            "title": self.title,

  120.            "source": self.source,

  121.            "digest": self.digest,

  122.            "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),

  123.            "content": self.content,

  124.            "comments_count": self.comments.count(),

  125.            "clicks": self.clicks,

  126.            "category": self.category.to_dict(),

  127.            "index_image_url": self.index_image_url,

  128.            "author": self.user.to_dict() if self.user else None

  129.        }

  130.        return resp_dict

  131. class Comment(BaseModel, db.Model):

  132.    """评论"""

  133.    __tablename__ = "info_comment"

  134.    id = db.Column(db.Integer, primary_key=True)  # 评论编号

  135.    user_id = db.Column(db.Integer, db.ForeignKey("info_user.id"), nullable=False)  # 用户id

  136.    news_id = db.Column(db.Integer, db.ForeignKey("info_news.id"), nullable=False)  # 新闻id

  137.    content = db.Column(db.Text, nullable=False)  # 评论内容

  138.    parent_id = db.Column(db.Integer, db.ForeignKey("info_comment.id"))  # 父评论id

  139.    parent = db.relationship("Comment", remote_side=[id])  # 自关联

  140.    like_count = db.Column(db.Integer, default=0)  # 点赞条数

  141.    def to_dict(self):

  142.        resp_dict = {

  143.            "id": self.id,

  144.            "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),

  145.            "content": self.content,

  146.            "parent": self.parent.to_dict() if self.parent else None,

  147.            "user": User.query.get(self.user_id).to_dict(),

  148.            "news_id": self.news_id,

  149.            "like_count": self.like_count

  150.        }

  151.        return resp_dict

  152. class CommentLike(BaseModel, db.Model):

  153.    """评论点赞"""

  154.    __tablename__ = "info_comment_like"

  155.    comment_id = db.Column("comment_id", db.Integer, db.ForeignKey("info_comment.id"), primary_key=True)  # 评论编号

  156.    user_id = db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True)  # 用户编号

  157. class Category(BaseModel, db.Model):

  158.    """新闻分类"""

  159.    __tablename__ = "info_category"

  160.    id = db.Column(db.Integer, primary_key=True)  # 分类编号

  161.    name = db.Column(db.String(64), nullable=False)  # 分类名

  162.    news_list = db.relationship('News', backref='category', lazy='dynamic')

  163.    def to_dict(self):

  164.        resp_dict = {

  165.            "id": self.id,

  166.            "name": self.name

  167.        }

  168.        return resp_dict

constants.py(数据库的常量)

 
   
   
 
  1. # 图片验证码Redis有效期, 单位:秒

  2. IMAGE_CODE_REDIS_EXPIRES = 300

  3. # 短信验证码Redis有效期,单位:秒

  4. SMS_CODE_REDIS_EXPIRES = 300

  5. # 七牛空间域名

  6. QINIU_DOMIN_PREFIX = "http://oyucyko3w.bkt.clouddn.com/"

  7. # 首页展示最多的新闻数量

  8. HOME_PAGE_MAX_NEWS = 10

  9. # 用户的关注每一页最多数量

  10. USER_FOLLOWED_MAX_COUNT = 4

  11. # 用户收藏显示最多新闻数量

  12. USER_COLLECTION_MAX_NEWS = 10

  13. # 其他用户每一页最多新闻数量

  14. OTHER_NEWS_PAGE_MAX_COUNT = 10

  15. # 点击排行展示的最多新闻数据

  16. CLICK_RANK_MAX_NEWS = 6

  17. # 管理员页面用户每页多最数据条数

  18. ADMIN_USER_PAGE_MAX_COUNT = 10

  19. # 管理员页面新闻每页多最数据条数

  20. ADMIN_NEWS_PAGE_MAX_COUNT = 10

前期配置

manage.py

 
   
   
 
  1. # 导入logging模块 不是flask中的logging模块

  2. import logging

  3. from logging.handlers import RotatingFileHandler

  4. from flask import Flask

  5. from flask_sqlalchemy import SQLAlchemy

  6. from flask_wtf import CSRFProtect

  7. from redis import StrictRedis

  8. from flask_session import Session

  9. from flask_script import Manager

  10. from flask_migrate import MigrateCommand

  11. from flask_migrate import Migrate

  12. class Config(object):

  13.    """项目配置"""

  14.    # app的配置

  15.    DEBUG = True

  16.    # mysql 的配置

  17.    SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/gitee"

  18.    SQLALCHEMY_TRACK_MODIFICATIONS = False

  19.    # redis的配置

  20.    REDIS_HOST = "127.0.0.1"

  21.    REDIS_PORT = 6379

  22.    # Session保存位置配置

  23.    SESSION_TYPE = "redis"

  24.    # 开启session签名

  25.    SESSION_USE_SIGNER = True

  26.    # 指定 Session 保存的 redis

  27.    SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT)

  28.    # 设置需要过期

  29.    SESSION_PERMANENT = False

  30.    # 设置过期时间

  31.    PERMANENT_SESSION_LIFETIME = 86400 * 2

  32.    # 要使用session必须要设置secrect_key

  33.    SECRET_KEY = "iECgbYWReMNxkRprrzMo5KAQYnb2UeZ3bwvReTSt+VSESW0OB8zbglT+6rEcDW9X"

  34.    # 设置日志的记录等级

  35.    logging.basicConfig(level=logging.DEBUG)  # 调试debug级

  36.    # 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限。需要再当前文件夹中穿件log文件夹,并且再文件夹内创建 .keepgit文件,要保证logs文件夹都能长传

  37.    file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)

  38.    # 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息

  39.    formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')

  40.    # 为刚创建的日志记录器设置日志记录格式

  41.    file_log_handler.setFormatter(formatter)

  42.    # 为全局的日志工具对象(flask app使用的)添加日志记录器

  43.    logging.getLogger().addHandler(file_log_handler)

  44. app = Flask(__name__)

  45. app.config.from_object(Config)

  46. # 初始化db

  47. db = SQLAlchemy(app)

  48. # 初始化redis

  49. redis_store = StrictRedis(host=Config.REDIS_HOST,port=Config.REDIS_PORT)

  50. # 开启当前的CSRF保护,只做服务器验证功能

  51. CSRFProtect(app)

  52. # 设置session的保存位置,执行下面的代码就会去app的设置中查询session的设置

  53. Session(app)

  54. # 生成主函数的manager对象

  55. manager = Manager(app)

  56. # 数据库迁移(当数据库中没有数据表时,可以直接使用数据库迁移命令进行数据库内数据表的生成)

  57. # 首先将数据库与app进行关联(注意先传app,再传db)

  58. Migrate(app, db)

  59. # 然后将迁移命令添加到manager中,这样就可以在命令行中进行命令创建数据库(这里的db是给迁移命令起的名字,可以任意起名字,不过我们默认起名字为db)

  60. manager.add_command("db", MigrateCommand)

  61. @app.route("/")

  62. def index():

  63.    session["name"] = "陈东发"

  64.    logging.debug("测试debug")

  65.    return "index"

  66. if __name__ == "__main__":

  67.    manager.run()

配置说明

配置一共有六个部分

1、初始化app以及app配置

2、初始化db以及db配置

3、初始化redisstore以及redisstore配置

4、开启CSRF保护

5、设置session 以及session配置

6、 集成命令行扩展

7、 log日志记录软件的运行状态,选择级别后 输出以选择级别和级别以上的日志进行输出,输出也可以使用current_app.logger.error("测试error"),如果开启debug 级别则是debug如果没有开启,则 输出的级别是设置级别

抽取文件

logic_operation.py

 
   
   
 
  1. import logging

  2. from logging.handlers import RotatingFileHandler

  3. from flask import Flask

  4. from flask_session import Session

  5. from flask_sqlalchemy import SQLAlchemy

  6. from flask_wtf import CSRFProtect

  7. from redis import StrictRedis

  8. from config import config

  9. # 初始化db

  10. # 在很多flask扩展里面,可以先初始化扩展的对象,然后调用init_app方法绑定app

  11. db = SQLAlchemy()

  12. # 在指定为空,没有只能提示方法,可以先加一个变量注释

  13. redis_store = None  # type:StrictRedis

  14. # 或者使用

  15. # redis_store:StrictRedis = None

  16. # https://www.cnblogs.com/xieqiankun/p/type_hints_in_python3.html

  17. def set_log(config_name):

  18.    """log生成以及配置"""

  19.    # 设置日志的记录等级

  20.    logging.basicConfig(level=config[config_name].LOG_LEVEL)  # 调试debug级

  21.    # 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限

  22.    file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)

  23.    # 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息

  24.    formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')

  25.    # 为刚创建的日志记录器设置日志记录格式

  26.    file_log_handler.setFormatter(formatter)

  27.    # 为全局的日志工具对象(flask app使用的)添加日志记录器

  28.    logging.getLogger().addHandler(file_log_handler)

  29. def create_app(config_name):

  30.    """创建falsk对象"""

  31.    # 进行log的配置

  32.    set_log(config_name)

  33.    app = Flask(__name__)

  34.    app.config.from_object(config[config_name])

  35.    # 通过app初始化

  36.    db.init_app(app)

  37.    # 初始化redis

  38.    # 先设置为空,再使用全局变量声明,去进行设置

  39.    global redis_store

  40.    redis_store = StrictRedis(host=config[config_name].REDIS_HOST, port=config[config_name].REDIS_PORT)

  41.    # 开启当前的CSRF保护,只做服务器验证功能

  42.    CSRFProtect(app)

  43.    # 设置session的保存位置,执行下面的代码就会去app的设置中查询session的设置

  44.    Session(app)

  45.    # 注册蓝图时,什么时候注册,什么时候导入

  46.    from info.modules.index.views import index_blu

  47.    # 3、注册蓝图路由

  48.    app.register_blueprint(index_blu)

  49.    return app

manage.py

 
   
   
 
  1. from flask_script import Manager

  2. from flask_migrate import MigrateCommand

  3. from flask_migrate import Migrate

  4. from info.logic_operation import create_app

  5. from info.logic_operation import db

  6. from info.logic_operation import models

  7. # 通过指定的运行环境,创建flask对象

  8. app = create_app("development")

  9. # 生成主函数的manager对象

  10. manager = Manager(app)

  11. # 数据库迁移(当数据库中没有数据表时,可以直接使用数据库迁移命令进行数据库内数据表的生成)

  12. # 首先将数据库与app进行关联(注意先传app,再传db)

  13. Migrate(app, db)

  14. # 然后将迁移命令添加到manager中,这样就可以在命令行中进行命令创建数据库(这里的db是给迁移命令起的名字,可以任意起名字,不过我们默认起名字为db)

  15. manager.add_command("db", MigrateCommand)

  16. if __name__ == "__main__":

  17.    manager.run()

config.py

 
   
   
 
  1. import logging

  2. from redis import StrictRedis

  3. class Config(object):

  4.    """项目配置"""

  5.    # app的配置

  6.    DEBUG = True

  7.    # mysql 的配置

  8.    SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/gitee"

  9.    SQLALCHEMY_TRACK_MODIFICATIONS = False

  10.    # redis的配置

  11.    REDIS_HOST = "127.0.0.1"

  12.    REDIS_PORT = 6379

  13.    # Session保存位置配置

  14.    SESSION_TYPE = "redis"

  15.    # 开启session签名

  16.    SESSION_USE_SIGNER = True

  17.    # 指定 Session 保存的 redis

  18.    SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT)

  19.    # 设置需要过期

  20.    SESSION_PERMANENT = False

  21.    # 设置过期时间

  22.    PERMANENT_SESSION_LIFETIME = 86400 * 2

  23.    # 要使用session必须要设置secret_key

  24.    SECRET_KEY = "iECgbYWReMNxkRprrzMo5KAQYnb2UeZ3bwvReTSt+VSESW0OB8zbglT+6rEcDW9X"

  25.    # 设置日志等级

  26.    LOG_LEVEL = logging.DEBUG

  27. class DevelopmentConfig(Config):

  28.    """开发环境下的配置"""

  29.    DEBUG = True

  30. class ProductionConfig(Config):

  31.    """生产环境下的配置"""

  32.    DEBUG = False

  33.    LOG_LEVEL = logging.WARNING

  34. class TestingConfig(Config):

  35.    """调试环境下的配置"""

  36.    DEBUG = True

  37.    TESTING = True

  38. # 将环境配置以字典的形式保存,方便后序使用

  39. config = {

  40.    "development": DevelopmentConfig,

  41.    "productiont": ProductionConfig,

  42.    "testing": TestingConfig

  43. }

.gitignore

 
   
   
 
  1. .idea/

  2. *.py[cod]

  3. logs/log*

views.py

 
   
   
 
  1. import logging

  2. # 1、导包

  3. from flask import Blueprint, session, current_app

  4. # 2、创建蓝图对象

  5. from info.logic_operation import redis_store

  6. index_blu = Blueprint("index",__name__)

  7. @index_blu.route("/")

  8. def index():

  9.    session["name"] = "陈东发"

  10.    session["class"] = "python3期"

  11.    # 测试打印日志

  12.    logging.warning("这是调试日志 warning")

  13.    logging.debug("这是调试日志")

  14.    # 或者使用

  15.    # 默认debug,再app中设置啥就是啥

  16.    current_app.logger.error("测试日志")

  17.    redis_store.set("name", "chendongfa")

  18.    return "index"

抽取说明

入口函数文件(manage.py):

只保存程序的运行(app的创建拿到manage.py中的原因是:入口函数文件的主要功能就是程序的开启,开启需要指定程序运行的环境,因此可以在业务逻辑文件中创建一个app的生成函数,将运行环境当作形参传递,这样在入口函数中传入实参(函数的运行环境)即可初始化)

业务逻辑文件:

保存业务逻辑的文件,即主要的执行文件。

其中的初始化业务逻辑文件中,主要有app初始化函数,db初始化(可以先进行初始化,然后再调用initapp方法绑定app),redisstore初始化,log日志的初始化

配置文件:保存关于配置的信息。

视图函数文件:使用蓝图管理(蓝图的使用步骤1、导包(Bluprint)2、创建蓝图对象3、注册蓝图路由)

数据库迁移

 
   
   
 
  1. 操作数据库 安装模块

  2. pip install flask-sqlalchemy

  3. pip install mysqlclient==1.3.12

  4. pip install flask-mysqldb

  5. # 1、 创建迁移文件夹(创建的迁移文件夹不用上传,忽略文件中添加)

  6. python manage.py db init

  7. # 2、创建当前版本的迁移文件(在manage.py中导入先前创建的数据库模型文件models.py)

  8. python manage.py db migrate -m "导入信息"

  9. # 3、创建数据库

  10. create database gitee charset=uft8

  11. # 4、 执行迁移

  12. python manage.py db upgrade

添加测试数据

 
   
   
 
  1. set names utf8

  2. source info_info_category.sql

  3. # 先添加新闻分类一方 再添加多方

导入静态文件

导入前端的文件


以上是关于flask项目的主要内容,如果未能解决你的问题,请参考以下文章

12_关于flask中的宏

Flask之模板之宏继承包含

Flask模板宏的概念和基本使用

Flask项目架构之代码抽取

Python Flask debug模式,代码更新无需重启项目

Flask Todo项目