新闻项目-日志蓝图及模型类

一丶日志的集成

在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
View Code

在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
View Code

导入测试数据

生成迁移文件基本配置

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文件不能在中文路径下

 

posted @ 2022-06-15 20:32  yoo丿  阅读(45)  评论(0)    收藏  举报