Python Flask 构建微电影视频网站

Stella981
• 阅读 768

  “轻”是Flask的精髓,小型项目快速开发,大型项目毫无压力

  • 1-1 课程导学及介绍
  • 1-2 Windows环境搭建
  • 2-2 Mac OS环境搭建
  • 2-3 第一Flask程序
  • 3-1 项目分析及会员登录
  • 3-2 标签-电影-上映预告数据模型设计
  • 3-3 评论-收藏-权限-管理员-操作日志数据模型设计
  • 4-1 前台布局-会员登录页面搭建
  • 4-2 会员注册-会员中心页面搭建
  • 4-3 电影列表-搜索页面搭建
  • 4-4 电影详情页-404页面搭建
  • 5-1 管理员登录-后台布局搭建
  • 5-2 修改密码-控制面板-标签管理页面搭建
  • 5-3 电影管理-上映预告管理页面搭建
  • 5-4 会员-收藏-评论管理页面搭建
  • 5-5 收藏-日志-角色管理页面搭建
  • 5-6 管理员页面搭建
  • 6-1 管理员登录
  • 6-2 标签管理
  • 6-3 电影管理-添加电影
  • 6-4 电影管理-列表、删除、编辑
  • 6-5 预告管理
  • 6-6 会员管理
  • 6-7 评论-收藏管理
  • 6-8 修改密码
  • 6-9 日志管理
  • 7-1 权限管理
  • 7-2 角色管理
  • 7-3 管理员管理
  • 7-4 访问权限控制
  • 8-1 会员注册
  • 8-2 会员登录
  • 8-3 修改会员资料
  • 8-4 修改密码
  • 8-5 会员登录日志
  • 9-1 上映预告-标签筛选-电影分页
  • 9-2 电影搜索-电影详情
  • 10-1 电影评论-统计
  • 10-2 收藏电影
  • 10-3 电影弹幕-代码优化及Bug处理
  • 11-1 CentOS安装LNMP
  • 11-2 部署电影网站-流媒体访问限制

1-1 课程导学及介绍

  • 学会使用整型、浮点型、路径型、字符串型正则表达式路由转化器;

  • 学会使用post与get请求、上传文件、cookie获取与响应、404处理;

  • 学会使用模板自动转义、定义过滤器、定义全局上下文处理器、Jinja2语法、包含、继承、定义宏;

  • 学会使用Flask-wtf定义表单模型、字段类型、字段验证、视图处理表单、模板使用表单;

  • 学会使用flask-SQLAlchemy定义数据库模型、添加数据、修改数据、查询数据、删除数据、数据库事件、数据迁移;

  • 学会使用蓝图优化项目结构、实现微电影网站前后台业务逻辑;

  • 学会flask的部署方法、安装编译Nginx服务、安装编译Python3.6服务、安装MySQL服务以及通过Nginx反向代理对视频流媒体限制下载速率、限制单个IP能发起的播放连接数;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

 Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

1-2 Windows环境搭建

1.2.1 操作系统:Win7;

1.2.2 编程语言:Python3.6;

1.2.3 数据库:MySQL5.7;

1.2.4 虚拟化开发环境:virtualenv;

1.2.5 IDE:Pycharm;

使用豆瓣源安装pip install ,国内镜像地址,速度会快很多。用法:pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com flask

Python Flask 构建微电影视频网站

2-2 MacOS环境搭建

2.2.1 Python3.6;

2.2.2 Pycharm2018.3;

2.2.3 MySQL8.0.12;

2.2.4 注意pip install flask 以及pip3 install flask的区别;

2-3 第一Flask程序

2.3.1 virtualenv的使用;

  • virtualenv venv

2.3.2 flask的安装;

  • pip3 install flask
  • pip3 freeze
  • deactivate # 退出虚拟化环境

Python Flask 构建微电影视频网站

2.2.3 第一个flask程序的编写;

  • 安装flask==“0.12.2”

    #!/usr/bin/python3

    -- coding:utf-8 --

    Project: MicroFilm

    Software: PyCharm

    Time : 2018-09-28 16:29

    File : app.py

    Author : 天晴天朗

    Email : tqtl@tqtl.org

    from flask import Flask

    app = Flask(name)

    @app.route("/") def index(): return "

    Hello Flask!

    " if name == 'main': app.run()

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

3-1 项目分析及会员登录

3.1.1 项目分析、搭建目录及模型设计;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

3.1.2 前后目录结构分析;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

3.1.3 使用蓝图(蓝本Blueprint)来构建项目目录;

1)什么是蓝图?

  • 一个应用中或跨应用制作应用组件和支持通用的模式;

2)蓝图的作用?

  • 将不同的功能模块化;
  • 构建大型应用;
  • 优化项目结构;
  • 增强可读性、易于维护;

3.1.4 蓝图的使用步骤:

  • 定义蓝图;
  • 注册蓝图;
  • 调用蓝图;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

3.1.5 会员及会员登录日志数据模型设计;

1)安装数据库连接工具flask-SQLAlchemy(企业级Python的ORM对象关系映射框架,面向对象的思想);

2)定义MySQL数据库连接基于pymysql+ mysql;

3)pip3 install flask-sqlalchemy的安装;

Python Flask 构建微电影视频网站

3.1.5 定义数据模型;

  • pip3 install flask-sqlalchemy;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站 3.1.6 配置SQLAlchemy;

SQLAlchemy在线文档:http://www.pythondoc.com/flask-sqlalchemy/config.html

app/models.py的设计;

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:36
# File    : models.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import datetime

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:Tqtl911!@#)^@localhost:3306/MicroFilm/"
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), unique=True)  # 密码
    email = db.Column(db.String(100), unique=True)  # 邮箱
    phone = db.Column(db.String(11), unique=True)  # 手机号码
    info = db.Column(db.Text)  # 个性简介
    face = db.Column(db.String(255), unique=True)  # 头像
    addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 注册时间
    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'))  # 所属会员
    ip = db.Column(db.String(100))  # 登录IP
    addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 登录时间;

    def __repr__(self):
        return "<UserLog %r>" % self.id

3-2 标签-电影-上映预告数据模型设计

3.2.1 标签数据模型的设计;

3.2.2 电影数据模型设计;

3.2.3 上映预告数据模型的设计;

app/models.py; 

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:36
# File    : models.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:Tqtl911!@#)^@localhost:3306/MicroFilm/"
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), unique=True)  # 密码
    email = db.Column(db.String(100), unique=True)  # 邮箱
    phone = db.Column(db.String(11), unique=True)  # 手机号码
    info = db.Column(db.Text)  # 个性简介
    face = db.Column(db.String(255), unique=True)  # 头像
    addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 注册时间
    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'))  # 所属会员
    ip = db.Column(db.String(100))  # 登录IP
    addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 登录时间;

    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.utcnow)  # 添加时间
    movies = db.relationship("Movie", backref="tag")  # 电影外键关系的关联

    def __repr__(self):
        return "<Tag %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(255), 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(255))  # 上映地区
    release_time = db.Column(db.Date)  # 上映时间
    length = db.Column(db.String(100))  # 播放时间
    addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 添加时间

    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.utcnow)  # 添加时间

    def __repr__(self):
        return "<Preview %r>" % self.title

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

3-3 评论-收藏-权限-管理员-操作日志数据模型设计

3.3.1 定义评论数据模型;

3.3.2 定义收藏电影数据模型;

3.3.3 定义权限数据模型;

3.3.4 定义角色数据模型;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

3.3.5 定义管理员数据模型;

3.3.6 定义登录日志操作数据模型;

3.3.7 定义操作日志数据模型;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

3.3.8 ModuleNotFoundError: No module named 'MySQLdb'报错处理之pip3 install pymysql;

Python Flask 构建微电影视频网站

3.3.9 执行python3 models.py 进行生成数据表操作;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

app/models.py;

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:36
# File    : models.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import pymysql

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:Tqtl911!@#)^@localhost:3306/MicroFilm"
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), unique=True)  # 密码
    email = db.Column(db.String(100), unique=True)  # 邮箱
    phone = db.Column(db.String(11), 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")  # 会员日志外键关联
    comments = db.relationship("Comment", backref="user")  # 评论外键关联
    moviecols = db.relationship("MovieCol", 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'))  # 所属会员
    ip = db.Column(db.String(100))  # 登录IP
    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 "<Tag %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(255), 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(255))  # 上映地区
    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")  # 评论外键关系关联
    moviecols = db.relationship("MovieCol", 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 MovieCol(db.Model):
    """
    电影收藏表;
    """
    __tablename__ = "moviecol"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    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 "<MovieCol %4>" % self.id


class Auth(db.Model):
    """
    权限表;
    """
    __tablename__ = "auth"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True)
    url = db.Column(db.String(255), 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(100), unique=True)  # 名称
    auths = db.Column(db.String(600))  # 权限
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    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(100), unique=True)  # 昵称
    pwd = db.Column(db.String(100), unique=True)  # 密码
    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)  # 添加时间
    adminlogs = db.relationship("AdminLog", backref="admin")  # 管理员登录日志
    oplogs = db.relationship("OpLog", backref="admin")  # 操作日志

    def __repr__(self):
        return "<Admin %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))
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)

    def __repr__(self):
        return "<AdminLog %r>" % self.id


class OpLog(db.Model):
    """
    操作日志表;
    """
    __tablename__ = "oplog"
    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(600))  # 操作原因
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 创建时间;

    def __repr__(self):
        return "<OpLog %r>" % self.id


if __name__ == '__main__':
    """
        db.create_all()
    role = Role(
        name="超级管理员",
        auths="",
    )
    db.session.add(role)
    db.session.commit()
    """
    from werkzeug.security import generate_password_hash

    admin = Admin(
        name="ImoocMovie1",
        pwd=generate_password_hash("ImoocMovie1"),
        is_super=0,
        role_id=1
    )
    db.session.add(admin)
    db.session.commit()

4-1 前台布局-会员登录页面搭建

4.1.1 拷贝前端同事分享的static下的目录文件; 

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

4.1.2 templates新增index.html、home.html;

4.1.3 报错待处理block 后面添加content对象;

index.html;

{% extends "home/home.html" %}

{% block content %}
<h1>Hello Flask!!!</h1>
{% endblock %}

home.html;

<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1 , user-scalable=no">
    <title>微电影</title>
    <link rel="shortcut icon" href="{{ url_for('static',filename ='base/images/logo.png') }}">
    <link rel="stylesheet" href="{{ url_for('static',filename ='base/css/bootstrap.min.css') }}">
    <link rel="stylesheet" href="{{ url_for('static',filename ='base/css/bootstrap-movie.css') }}">
    <link rel="stylesheet" href="{{ url_for('static',filename ='base/css/animate.css') }}">
    <style>
        .navbar-brand > img {
            display: inline;
        }

    </style>
    <style>
        .media {
            padding: 3px;
            border: 1px solid #ccc
        }

    </style>
</head>

<body>
<!--导航-->
<nav class="navbar navbar-default navbar-fixed-top">
    <div class="container">
        <!--小屏幕导航按钮和logo-->
        <div class="navbar-header">
            <button class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a href="index.html" class="navbar-brand" style="width:250px;">
                <img src="{{ url_for('static',filename = 'base/images/logo.png') }}" style="height:30px;">&nbsp;微电影

            </a>
        </div>
        <!--小屏幕导航按钮和logo-->
        <!--导航-->
        <div class="navbar-collapse collapse">
            <form class="navbar-form navbar-left" role="search" style="margin-top:18px;">
                <div class="form-group input-group">
                    <input type="text" class="form-control" placeholder="请输入电影名!">
                    <span class="input-group-btn">
                        <a class="btn btn-default" href="search.html"><span class="glyphicon glyphicon-search"></span>&nbsp;搜索</a>
                    </span>
                </div>
            </form>
            <ul class="nav navbar-nav navbar-right">
                <li>
                    <a class="curlink" href="index.html"><span class="glyphicon glyphicon-film"></span>&nbsp;电影</a>
                </li>
                <li>
                    <a class="curlink" href="login.html"><span class="glyphicon glyphicon-log-in"></span>&nbsp;登录</a>
                </li>
                <li>
                    <a class="curlink" href="register.html"><span class="glyphicon glyphicon-plus"></span>&nbsp;注册</a>
                </li>
                <li>
                    <a class="curlink" href="logout.html"><span class="glyphicon glyphicon-log-out"></span>&nbsp;退出</a>
                </li>
                <li>
                    <a class="curlink" href="user.html"><span class="glyphicon glyphicon-user"></span>&nbsp;会员</a>
                </li>
            </ul>
        </div>
        <!--导航-->

    </div>
</nav>
<!--导航-->
<!--内容-->
<div class="container" style="margin-top:76px">
    {% block content %}{% endblock %}
</div>
<!--内容-->
<!--底部-->
<footer>
    <div class="container">
        <div class="row">
            <div class="col-md-12">
                <p>
                    ©&nbsp;2018&nbsp;microfilm.cuixiaozhao.com&nbsp;京ICP备 13046642号-2
                </p>
            </div>
        </div>
    </div>
</footer>
<!--底部-->
<script src="{{ url_for('static',filename = 'base/js/jquery.min.js') }}"></script>
<script src="{{ url_for('static',filename = 'base/js/bootstrap.min.js') }}"></script>
<script src="{{ url_for('static',filename = 'base/js/jquery.singlePageNav.min.js') }}"></script>
<script src="{{ url_for('static',filename = 'base/js/wow.min.js') }}"></script>
<script src="{{ url_for('static',filename = 'lazyload/jquery.lazyload.min.js') }}"></script>
<script src="//cdn.bootcss.com/holder/2.9.4/holder.min.js"></script>
<script>
    $(function () {
        new WOW().init();
    })

</script>
<script>
    $(document).ready(function () {
        $("img.lazy").lazyload({
            effect: "fadeIn"
        });
    });
</script>
</body>
</html>

4.1.4 页面呈现;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

4-2 会员注册-会员中心页面搭建

Python Flask 构建微电影视频网站

4.2.1 定义登录页面的视图函数:login/logout;

4.2.2 开发index.html,继承home.html并添加{% block content %} {% endblock %}区块;

4.2.3 home/home.html页面中{{ url_for('home.login') }} 和{{ url_for('home.logout') }}的使用;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

4.2.4 会员注册页面的搭建过程;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

4.2.5 会员中心页面搭建;

Python Flask 构建微电影视频网站

4-3 电影列表-搜索页面搭建

4.3.1 电影列表页面搭建;

4.3.2 首页index.html呈现;

Python Flask 构建微电影视频网站

4.3.3 电影搜索页面搭建;

Python Flask 构建微电影视频网站

4-4 电影详情页-404页面搭建

4.4.1 404页面处理;

4.4.2 404视图函数代码在app/__init__.py中编写;

app/__init__.py;

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:36
# File    : __init__.py.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org

from flask import Flask, render_template

app = Flask(__name__)

app.debug = True

from app.home import home as home_blueprint
from app.admin import admin as admin_blueprint

app.register_blueprint(home_blueprint)
app.register_blueprint(admin_blueprint, url_prefix="/admin")


@app.errorhandler(404)
def page_not_found(error):
    return render_template("home/404.html"), 404 

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5-1 管理员登录-后台布局搭建

5.1.1 后台布局搭建;

5.1.2 管理员的登录和退出;

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:38
# File    : views.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org

from . import admin
from flask import render_template, redirect, url_for


@admin.route("/")
def index():
    return "<h1 style='color:blue'>This is admin site!<h1>"


@admin.route("/login/")
def login():
    return render_template("admin/login.html")


@admin.route("/logout/")
def logout():
    return redirect(url_for("admin.login"))

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5.1.3 后台布局搭建;

Python Flask 构建微电影视频网站

5.1.4 include引用报错处理;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5.1.5 修改密码;

Python Flask 构建微电影视频网站

5-2 修改密码-控制面板-标签管理页面搭建

5.2.1 修改密码;

Python Flask 构建微电影视频网站

5.2.2 控制面板;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5.2.3 调整页面,显示内存仪表盘;

Python Flask 构建微电影视频网站

5.2.4 标签管理页面搭建;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5-3 电影管理-上映预告管理页面搭建

5.3.1 编辑电影和电影列表;

Python Flask 构建微电影视频网站

 Python Flask 构建微电影视频网站

5.3.2 编辑上映预告和上映电影列表;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5-4 会员-收藏-评论管理页面搭建

5.4.1  会员列表;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5.4.2 评论管理页面搭建;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5-5 收藏-日志-角色管理页面搭建

5.5.1 收藏管理列表搭建;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5.5.2 操作日志列表;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5.5.3 角色管理列表搭建;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5.5.4 添加权限和权限列表;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

5-6 管理员页面搭建

5.6.1 管理员页面搭建;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

6-1 管理员登录

6.1.1 调整项目代码结构;

6.1.2 flask-wtf第三方模块的安装;

6.1.3 编写LoginForm类以及报错处理;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

6-2 标签管理

6.2.1 标签管理;

Python Flask 构建微电影视频网站

6-3 电影管理-添加电影

6.3.1 电影管理;

Python Flask 构建微电影视频网站

6-4 电影管理-列表、删除、编辑

6.4.1 电影列表;

6-5 预告管理

6-6 会员管理

6-7 评论-收藏管理

6-8 修改密码

6-9 日志管理

7-1 权限管理

7-2 角色管理

7-3 管理员管理

7-4 访问权限控制

8-1 会员注册

8-2 会员登录

8-3 修改会员资料

8-4 修改密码

8-5 会员登录日志

9-1 上映预告-标签筛选-电影分页

9-2 电影搜索-电影详情

10-1 电影评论-统计

10-2 收藏电影

10-3 电影弹幕-代码优化及Bug处理

11-1 CentOS安装LNMP

11.1.1 LNMP即——Linux + Nginx + MySQL+Python;

  • 安装Python解释器的依赖包 yum install openssl-devel bzip2-devel expat-deval gdbm-devel realine-devel gcc gcc-c++
  • 解压缩Python-3.6.1.tgz
  • yum install mariadb;systemctl start mariadb.service;
  • 修改mariadb的字符集为utf8,my.cnf文件;
  • yum install nginx;# 推荐使用yum安装
  • yum install gcc gcc-c++ opensll-devel pere-devel httpd-tools;
  • useradd nginx
  • ./configure --prefix==/usr/local/nginx --user==nginx --group=nginx --with http_ssl_module --with-http_mp4_module --with-http_flv_module     make&make install 
  • ln -s /usr/local/nginx /usr/sbin/
  • nginx 
  • netstat -lntup|grep nginx

Python Flask 构建微电影视频网站

11-2 部署电影网站-流媒体访问限制

11.2.1 部署微电影网站;

  • pip3 install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com  -r requirements.txt;
  • scp -r movie_project root@192.168.0.1:/root/# 程序包;
  • 数据库中导入初始化数据;source /root/movie.sql;
  • cp -a  movie_project /usr/local/html/下;
  • nohup python manage.py runserver -h 127.0.0.1 -p 5000,开启四个进程;

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

11.2.2 流媒体的访问限制;

  • 限制单个IP能发起的连接数:limit_conn addr:1;
  • 限制视频速率:limit_rate 1024K;
  • 修改配置后,一定记得重启nginx,重启之前进行语法检查!!!nginx -t ;  sytemctl reload nginx;

nginx.conf;

worker_processes 4;
events {
    worker_connections 262140;
}
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    limit_conn_zone $binary_remote_addr zone=addr:5m;
    upstream movie {
        server 127.0.0.1:5001;
        server 127.0.0.1:5002;
        server 127.0.0.1:5003;
        server 127.0.0.1:5004;
    }
    server {
        listen 80;
        server_name localhost;
        location / {
            root html;
            index index.html index.htm;
            proxy_pass http://movie;
        }
        location ~ \.flv$ {
            flv;
            limit_conn addr 4;
            limit_rate 1024k;
            rewrite ^/static/uploads/(.+?).flv$ /movie_project/app/static/uploads/$1.flv permanent;
        }
        location ~ \.mp4$ {
            mp4;
            limit_conn addr 4;
            limit_rate 1024k;
            rewrite ^/static/uploads/(.+?).mp4$ /movie_project/app/static/uploads/$1.mp4 permanent;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

Python Flask 构建微电影视频网站

 Python Flask 构建微电影视频网站

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这