一、日志集成
将日志集成写入init文件中
1 import logging 2 from logging.handlers import RotatingFileHandler 3 4 # 设置日志的记录等级 5 logging.basicConfig(level=logging.DEBUG) # 调试debug级 6 # 创建日志记录器,指明日志保存的路径(前面的logs为文件的名字,需要我们手动创建,后面则会自动创建)、每个日志文件的最大大小、保存的日志文件个数上限。 7 file_log_handler = RotatingFileHandler("../logs/log", maxBytes=1024*1024*100, backupCount=10) 8 # 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息 9 formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s') 10 # 为刚创建的日志记录器设置日志记录格式 11 file_log_handler.setFormatter(formatter) 12 # 为全局的日志工具对象(flask app使用的)添加日志记录器 13 logging.getLogger().addHandler(file_log_handler)
在项目里新建名为logs的Directory文件

运行如果报错就删日志文件中的一个点

创建一个日志类并且调用

用level来接收参数

在工厂环境中设置日志等级
1 import logging 2 3 class DevConfig(Config): 4 """开发环境""" 5 log = logging.DEBUG 6 7 class ProConfig(Config): 8 """生产环境""" 9 DEBUG = False 10 SQLALCHEMY_DATABASE_URI = 'mysql://root:123321@127.0.0.1:3306/xiangmu' 11 LOG_LEVEL = logging.WARNING
在函数app里写入下面代码就能运行了
set_log(configs[config].LOG_LEVEL)
二、蓝图的抽取
首先在info文件下创建所模块文件

然后在模块文件里创建python package文件

在index文件中创建views.py文件

index中的__init__创建蓝图
from flask import Blueprint blue_index = Blueprint("index",__name__) from . import views
将主页的视图函数放在views中并注册路由
from . import blue_index @blue_index.route('/') def hello_world(): return 'Hello World!'
在manage导入index中blue——index的包,并注册蓝图
from info.modules.index import blue_index app.register_blueprint(blue_index)
三、模型类
表间结构示意图:

在info文件夹新建一个名为models.py的python文件,来储存以下代码
1 from datetime import datetime 2 from werkzeug.security import generate_password_hash, check_password_hash 3 4 from info import constants 5 from . import db 6 7 8 class BaseModel(object): 9 """模型基类,为每个模型补充创建时间与更新时间""" 10 create_time = db.Column(db.DateTime, default=datetime.now) # 记录的创建时间 11 update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) # 记录的更新时间 12 13 14 # 用户收藏表,建立用户与其收藏新闻多对多的关系 15 tb_user_collection = db.Table( 16 "info_user_collection", 17 db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True), # 新闻编号 18 db.Column("news_id", db.Integer, db.ForeignKey("info_news.id"), primary_key=True), # 分类编号 19 db.Column("create_time", db.DateTime, default=datetime.now) # 收藏创建时间 20 ) 21 22 tb_user_follows = db.Table( 23 "info_user_fans", 24 db.Column('follower_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True), # 粉丝id 25 db.Column('followed_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True) # 被关注人的id 26 ) 27 28 29 class User(BaseModel, db.Model): 30 """用户""" 31 __tablename__ = "info_user" 32 33 id = db.Column(db.Integer, primary_key=True) # 用户编号 34 nick_name = db.Column(db.String(32), unique=True, nullable=False) # 用户昵称 35 password_hash = db.Column(db.String(128), nullable=False) # 加密的密码 36 mobile = db.Column(db.String(11), unique=True, nullable=False) # 手机号 37 avatar_url = db.Column(db.String(256)) # 用户头像路径 38 last_login = db.Column(db.DateTime, default=datetime.now) # 最后一次登录时间 39 is_admin = db.Column(db.Boolean, default=False) 40 signature = db.Column(db.String(512)) # 用户签名 41 gender = db.Column( # 订单的状态 42 db.Enum( 43 "MAN", # 男 44 "WOMAN" # 女 45 ), 46 default="MAN") 47 48 # 当前用户收藏的所有新闻 49 collection_news = db.relationship("News", secondary=tb_user_collection, lazy="dynamic") # 用户收藏的新闻 50 # 用户所有的粉丝,添加了反向引用followed,代表用户都关注了哪些人 51 followers = db.relationship('User', 52 secondary=tb_user_follows, 53 primaryjoin=id == tb_user_follows.c.followed_id, 54 secondaryjoin=id == tb_user_follows.c.follower_id, 55 backref=db.backref('followed', lazy='dynamic'), 56 lazy='dynamic') 57 58 # 当前用户所发布的新闻 59 news_list = db.relationship('News', backref='user', lazy='dynamic') 60 61 def to_dict(self): 62 resp_dict = { 63 "id": self.id, 64 "nick_name": self.nick_name, 65 "avatar_url": constants.QINIU_DOMIN_PREFIX + self.avatar_url if self.avatar_url else "", 66 "mobile": self.mobile, 67 "gender": self.gender if self.gender else "MAN", 68 "signature": self.signature if self.signature else "", 69 "followers_count": self.followers.count(), 70 "news_count": self.news_list.count() 71 } 72 return resp_dict 73 74 def to_admin_dict(self): 75 resp_dict = { 76 "id": self.id, 77 "nick_name": self.nick_name, 78 "mobile": self.mobile, 79 "register": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 80 "last_login": self.last_login.strftime("%Y-%m-%d %H:%M:%S"), 81 } 82 return resp_dict 83 84 85 class News(BaseModel, db.Model): 86 """新闻""" 87 __tablename__ = "info_news" 88 89 id = db.Column(db.Integer, primary_key=True) # 新闻编号 90 title = db.Column(db.String(256), nullable=False) # 新闻标题 91 source = db.Column(db.String(64), nullable=False) # 新闻来源 92 digest = db.Column(db.String(512), nullable=False) # 新闻摘要 93 content = db.Column(db.Text, nullable=False) # 新闻内容 94 clicks = db.Column(db.Integer, default=0) # 浏览量 95 index_image_url = db.Column(db.String(256)) # 新闻列表图片路径 96 category_id = db.Column(db.Integer, db.ForeignKey("info_category.id")) 97 user_id = db.Column(db.Integer, db.ForeignKey("info_user.id")) # 当前新闻的作者id 98 status = db.Column(db.Integer, default=0) # 当前新闻状态 如果为0代表审核通过,1代表审核中,-1代表审核不通过 99 reason = db.Column(db.String(256)) # 未通过原因,status = -1 的时候使用 100 # 当前新闻的所有评论 101 comments = db.relationship("Comment", lazy="dynamic") 102 103 def to_review_dict(self): 104 resp_dict = { 105 "id": self.id, 106 "title": self.title, 107 "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 108 "status": self.status, 109 "reason": self.reason if self.reason else "" 110 } 111 return resp_dict 112 113 def to_basic_dict(self): 114 resp_dict = { 115 "id": self.id, 116 "title": self.title, 117 "source": self.source, 118 "digest": self.digest, 119 "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 120 "index_image_url": self.index_image_url, 121 "clicks": self.clicks, 122 } 123 return resp_dict 124 125 def to_dict(self): 126 resp_dict = { 127 "id": self.id, 128 "title": self.title, 129 "source": self.source, 130 "digest": self.digest, 131 "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 132 "content": self.content, 133 "comments_count": self.comments.count(), 134 "clicks": self.clicks, 135 "category": self.category.to_dict(), 136 "index_image_url": self.index_image_url, 137 "author": self.user.to_dict() if self.user else None 138 } 139 return resp_dict 140 141 142 class Comment(BaseModel, db.Model): 143 """评论""" 144 __tablename__ = "info_comment" 145 146 id = db.Column(db.Integer, primary_key=True) # 评论编号 147 user_id = db.Column(db.Integer, db.ForeignKey("info_user.id"), nullable=False) # 用户id 148 news_id = db.Column(db.Integer, db.ForeignKey("info_news.id"), nullable=False) # 新闻id 149 content = db.Column(db.Text, nullable=False) # 评论内容 150 parent_id = db.Column(db.Integer, db.ForeignKey("info_comment.id")) # 父评论id 151 parent = db.relationship("Comment", remote_side=[id]) # 自关联 152 like_count = db.Column(db.Integer, default=0) # 点赞条数 153 154 def to_dict(self): 155 resp_dict = { 156 "id": self.id, 157 "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 158 "content": self.content, 159 "parent": self.parent.to_dict() if self.parent else None, 160 "user": User.query.get(self.user_id).to_dict(), 161 "news_id": self.news_id, 162 "like_count": self.like_count 163 } 164 return resp_dict 165 166 167 class CommentLike(BaseModel, db.Model): 168 """评论点赞""" 169 __tablename__ = "info_comment_like" 170 comment_id = db.Column("comment_id", db.Integer, db.ForeignKey("info_comment.id"), primary_key=True) # 评论编号 171 user_id = db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True) # 用户编号 172 173 174 class Category(BaseModel, db.Model): 175 """新闻分类""" 176 __tablename__ = "info_category" 177 178 id = db.Column(db.Integer, primary_key=True) # 分类编号 179 name = db.Column(db.String(64), nullable=False) # 分类名 180 news_list = db.relationship('News', backref='category', lazy='dynamic') 181 182 def to_dict(self): 183 resp_dict = { 184 "id": self.id, 185 "name": self.name 186 } 187 return resp_dict
在info文件夹中新建一个constants.py文件用来存储以下代码
1 # 图片验证码Redis有效期, 单位:秒 2 IMAGE_CODE_REDIS_EXPIRES = 300 3 4 # 短信验证码Redis有效期,单位:秒 5 SMS_CODE_REDIS_EXPIRES = 300 6 7 # 七牛空间域名 8 QINIU_DOMIN_PREFIX = "http://oyucyko3w.bkt.clouddn.com/" 9 10 # 首页展示最多的新闻数量 11 HOME_PAGE_MAX_NEWS = 10 12 13 # 用户的关注每一页最多数量 14 USER_FOLLOWED_MAX_COUNT = 4 15 16 # 用户收藏最多新闻数量 17 USER_COLLECTION_MAX_NEWS = 10 18 19 # 其他用户每一页最多新闻数量 20 OTHER_NEWS_PAGE_MAX_COUNT = 10 21 22 # 点击排行展示的最多新闻数据 23 CLICK_RANK_MAX_NEWS = 10 24 25 # 管理员页面用户每页多最数据条数 26 ADMIN_USER_PAGE_MAX_COUNT = 10 27 28 # 管理员页面新闻每页多最数据条数 29 ADMIN_NEWS_PAGE_MAX_COUNT = 10
导入测试数据
在控制台生成迁移文件
python manage.py mysql init

把models导入到manage.py文件中
from info import models
生成迁移表
python manage.py mysql migrate

在控制台中运行迁移文件
python manage.py mysql upgrade

cmd进入utf-8模式

导入测试数据

浙公网安备 33010602011771号