flask微视频网站(环境准备)

文章目录

简介

  • 跟着做一个微电影视频网站
  • Windows
  • Python3.9.6
  • MySQL8.0
  • pycharm
  • 安装py虚拟环境
    # 不添加源就会失败,还提示你要升级pip,千万别升级!
    pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com virtualenv
    # 安装flask
    virtualenv flask_env	# 默认创建在当前目录,dir可以看到,可以跳转到指定目录
    # 如果使用pycharm创建工程默认带venv,这里只是演示一下
    # 后面就选择pycharm创建的venv解释器!
    
  • 使用pycharm的terminal可以自动进入venv环境
    flask微视频网站(环境准备)
    • 不太对,这个terminal会使用其他工程的venv,垃圾!
    • 不过在Settings中设置好即可,不用在意;整理好venv环境,不用的和重复的删掉
    • OK,还是用在venvs目录下单独建立的虚拟环境吧,进入Scripts直接activate,可以看到(flask_mv) D:\pythonDemo\pycWorks\venvs\flask_mv\Scripts>
    • 退出虚拟环境直接使用deactivate
  • 安装flask
    pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com flask
    # pip list 查看安装的包
    # pip freeze > packages.txt	可以导出安装的环境
    # pip install -r packages.txt	就能安装相同的环境
    
  • 测试一下环境
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return '<h1>Roy Handsome</h1>'
    
    if __name__ == '__main__':
        app.run()
    

项目结构

  • 前台home
    • 数据模型:models.py
    • 表单处理
    • 视图文件
    • 模板目录
    • 静态资源目录:static
  • 后台admin
    • 和前台类似,数据模型、静态资源、模板可以共用,其他独立
    • 还是MVC模型,但这里叫MVT,视图文件V等价于控制器C,前端模板属于T
      flask微视频网站(环境准备)
    • 照着这个创建目录吧!具体的可以通过我的这篇笔记了解

蓝图

  • 使用蓝图管理项目
    • 蓝图可以理解为管理路由和视图的模块,需要在app注册使用
    • 可以直接将蓝图定义在视图函数中
    • 我们这里定义在init文件,所以需要将视图再导入,底层使用了装饰器原理
    # admin/init.py
    from flask import Blueprint
    
    admin = Blueprint('admin', __name__)
    
    import app.admin.views
    
    # admin/views.py
    from . import admin
    
    @admin.route('/view')
    def index():
        return '<h1>admin views</h1>'
    # home也是同样
    
    # app/init.py
    from flask import Flask
    
    app = Flask(__name__)
    app.debug = True
    
    from app.home import home as home_bp
    from app.admin import admin as admin_bp
    
    app.register_blueprint(home_bp) # 默认/路径进入到home
    app.register_blueprint(admin_bp, url_prefix='/admin')   # /admin 下归admin蓝图管理
    
    # manage.py
    from app import app
    
    if __name__ == '__main__':
        app.run()
    
    • 此后,我们前后台的路由就可以分别由home/admin蓝图分别来管理了
    • 但是一定要记得在app注册并设置前缀

数据库

  • 使用数据库
    # 还是使用数据库扩展
    pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com flask-sqlalch
    emy
    
    • 配置参数可以根据官方指导
    • 定义两个表模型瞧瞧,外键需要在主表关联(一对多,约束主表)
    from flask_sqlalchemy import SQLAlchemy
    from flask import Flask
    from datetime import datetime
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:123456@localhost:3306/flask_mv"   # show global variables like 'port';
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    
    db = SQLAlchemy(app)
    
    # 定义表模型
    
    class User(db.Model):
        """
        用户信息表
        """
        __tablename__ = 'user'  # 表名,都用小写
        # 可以查看官方的例子
        id = db.column(db.Integer, primary_key=True)
        name = db.column(db.String(100), unique=True)   # 用户名 唯一
        pwd = db.column(db.String(100))
        email = db.column(db.String(100), unique=True)
        phone = db.column(db.String(100), unique=True)
        info = db.column(db.Text)
        face = db.column(db.String(255), unique=True)    # 头像
        addtime = db.column(db.DateTime, index=True, default=datetime.now)   # 注册时间
        uuid = db.column(db.String(255), unique=True)   # 唯一标志符
        userlogs = db.relationship('UserLog', backref='user')   # 外键关系的关联
    
        def __repr__(self):
            return "<User %r>"%self.name    # 定义对象的描述
    
    class UserLog(db.Model):
        """
        用户日志表
        """
        __tablename__ = 'userlog'
        id = db.column(db.Integer, primary_key=True)
        user_id = db.column(db.Integer, db.ForeignKey('user.id'))   # 外键约束   表.字段   还要在类User中关联!
        ip = db.column(db.String(100))
        addtime = db.column(db.DateTime, index=True, default=datetime.now)
    
        def __repr__(self):
            return '<UserLog %r>'%self.id
    
  • 剩余表的模型,表之间的关系后面会在使用时说明
    # 电影标签
    class Tag(db.Model):
        __tablename__ = 'tag'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(100), unique=True)
        addtime = db.Column(db.DateTime, index=True, default=datetime.now)
        movies = db.relationship('Movie', backref='tag')
    
        def __repr__(self):
            return '<UserLog %r>'%self.name
    
    class Movie(db.Model):
        __tablename__ = 'movie'
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(255), unique=True)  # 电影名称
        url = db.Column(db.String(100), unique=True)
        info = db.Column(db.Text)
        logo = db.Column(db.String(255), unique=True)   # 封面
        star = db.Column(db.SmallInteger)   # 星级
        playnum = db.Column(db.BigInteger)  # 播放量
        commentnum = db.Column(db.BigInteger)
        tag_id = db.Column(db.Integer, db.ForeignKey('tag.id'))
        area = db.Column(db.String(100))
        release_time = db.Column(db.Date)   # 上映时间
        length = db.Column(db.String(100))  # 总时长
        addtime = db.Column(db.DateTime, index=True, default=datetime.now)
        comments = db.relationship('Comment', backref='movie')  # 主表,关联评论表
        movcoll = db.relationship('MovCollection', backref='movie') # 关联收藏表
    
        def __repr__(self):
            return '<Movie %r>'%self.title
    
    class Preview(db.Model):
        __tablename__ = 'preview'
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(255), unique=True)
        logo = db.Column(db.String(255), unique=True)  # 封面
        addtime = db.Column(db.DateTime, index=True, default=datetime.now)
    
        def __repr__(self):
            return '<Preview %r>' % self.title
    
    # 评论表
    class Comment(db.Model):
        __tablename__ = 'comment'
        id = db.Column(db.Integer, primary_key=True)
        content = db.Column(db.Text)
        movie_id = db.Column(db.Integer, db.ForeignKey('movie.id')) # 多端外键,约束主表
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'))   # 哪个用户评论的
        addtime = db.Column(db.DateTime, index=True, default=datetime.now)
    
        def __repr__(self):
            return '<Comment %r>' % self.id
    
    # 电影收藏
    class MovCollection(db.Model):
        __tablename__ = 'movcollec'
        id = db.Column(db.Integer, primary_key=True)
        content = db.Column(db.Text)
        movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))  # 多端外键,约束主表
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'))   # 哪个用户收藏的
        addtime = db.Column(db.DateTime, index=True, default=datetime.now)
    
        def __repr__(self):
            return '<MovCollection %r>' % self.id
    
    # 权限
    class Auth(db.Model):
        __tablename__ = 'auth'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(255), unique=True)  # 名称
        url = db.Column(db.String(100), unique=True)
        addtime = db.Column(db.DateTime, index=True, default=datetime.now)
    
        def __repr__(self):
            return '<Auth %r>' % self.name
    
    # 角色
    class Role(db.Model):
        __tablename__ = 'role'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(255), unique=True)  # 名称
        auths = db.Column(db.String(100))
        addtime = db.Column(db.DateTime, index=True, default=datetime.now)
        admin = db.relationship('Admin', backref='role') # 关联管理员
    
        def __repr__(self):
            return '<Role %r>' % self.name
    # 什么关系呢?
    
    # 管理员
    class Admin(db.Model):
        __tablename__ = 'admin'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(255), unique=True)  # 名称
        pwd = db.Column(db.String(300)) # 这里应该是byte为单位,设计的时候就给够,如果用hash生成至少255以上
        # alter table admin modify column pwd varchar(300);
        is_super = db.Column(db.SmallInteger)   # 0为超级管理员
        role_id = db.Column(db.Integer, db.ForeignKey('role.id'))
        addtime = db.Column(db.DateTime, index=True, default=datetime.now)
        adminlog = db.relationship('AdminLog', backref='admin') # 关联管理员日志
        operatelog = db.relationship('OperateLog', backref='admin') # 关联操作日志
    
        def __repr__(self):
            return '<Role %r>' % self.name
    
    # 管理员日志
    class AdminLog(db.Model):
        __tablename__ = 'adminlog'
        id = db.Column(db.Integer, primary_key=True)
        admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))
        ip = db.Column(db.String(100))  # 登录IP
        addtime = db.Column(db.DateTime, index=True, default=datetime.now)
    
        def __repr__(self):
            return '<Role %r>' % self.id
    
    # 操作日志
    class OperateLog(db.Model):
        __tablename__ = 'operatelog'
        id = db.Column(db.Integer, primary_key=True)
        admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))
        ip = db.Column(db.String(100))  # 登录IP
        reason = db.Column(db.String(500))  # 操作原因
        addtime = db.Column(db.DateTime, index=True, default=datetime.now)   # 这个index的具体作业是?
    
        def __repr__(self):
            return '<Role %r>' % self.id
    
    • 注意有些字段的长度要给够,这是设计阶段的问题,后期不建议修改!
  • 在MySQL中生成数据表,并演示插入操作
    if __name__ == '__main__':
        # 根据模型生成数据表
        # db.create_all() # desc admin 查看表
    
        # 插入数据
        """
        role = Role(
            name = '炒鸡管理员',
            auths = ''
        )
        db.session.add(role)
        db.session.commit()
        """
        from werkzeug.security import generate_password_hash
        admin = Admin(
            name = 'Allen',
            pwd=generate_password_hash('allen'),  # 密码就是roy,hash加密
            is_super = 0,
            role_id = 1
        )
        db.session.add(admin)
        db.session.commit()
    
上一篇:flask-RequestParser参数解析处理


下一篇:CentOS、Ubuntu minimal install 配置调优