新闻项目-日志蓝图及模型类
一丶日志的集成
在info中的__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的文件

由于开发环境的不同,日志的级别也会不一样,由此仿造工厂编写日志
在config中的工厂环境设置日志等级

在info中的__init__里创建函数写入日志并在create_app中运行日志
二丶蓝图
在info中创建一个modules的文件夹来存放所有模块

在modules中创建index来存放主页的相关内容,并创建views.py来存放主页的视图蓝图

在index中的__init__创建蓝图
1 from flask import Blueprint 2 3 blue_index = Blueprint("index",__name__) #初始化创建蓝图 4 5 from . import views #导包运行views
将主页的视图函数放入到views中并注册路由
1 from . import blue_index 2 3 @blue_index.route('/') #用蓝图注册路由 4 def hello_world(): 5 return 'Hello World!'
最后在manage中注册蓝图
1 from info.modules.index import blue_index 2 3 app.register_blueprint(blue_index)
三丶表间结构分析

四丶模型类分析
在info中创建一个models.py文件放入模型类定义源码:
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
导入测试数据
生成迁移文件基本配置
1 from flask_script import Manager 2 from flask_migrate import Migrate,MigrateCommand 3 4 Migrate(app,db) #使迁移和app与数据库产生关系 5 manager.add_command("mysql",MigrateCommand) #将数据库迁移的脚本添加到manager
在操作台生成迁移文件的文件夹
1 python manage.py mysql init

将models导入至启动目录才能生成迁移文件
1 from info import models
在操作台生成迁移文件
1 python manage.py mysql migrate

迁移完成后运行迁移文件开始建表
1 python manage.py mysql upgrade
表单建造成功后导入测试数据

注:这里如果导入失败的话可能是数据库没有在utf8编码下创建
注:2个sql文件不能在中文路径下

浙公网安备 33010602011771号