Python Flask 构建微电影视频网站

  “轻”是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能发起的播放连接数;


 

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

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 # 退出虚拟化环境

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 "<h1 style = 'color:red'>Hello Flask!</h1>"


if __name__ == '__main__':
    app.run()

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

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

3.1.2 前后目录结构分析;

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

1)什么是蓝图?

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

2)蓝图的作用?

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

3.1.4 蓝图的使用步骤:

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

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

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

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

  3)pip3 install flask-sqlalchemy的安装;

 3.1.5 定义数据模型;

  • pip3 install flask-sqlalchemy;

 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

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

3.3.1 定义评论数据模型;

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

3.3.3 定义权限数据模型;

3.3.4 定义角色数据模型;

3.3.5 定义管理员数据模型;

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

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

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

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

 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下的目录文件; 

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 页面呈现;

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

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') }}的使用;


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

 

 4.2.5 会员中心页面搭建;

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

4.3.1 电影列表页面搭建;

4.3.2 首页index.html呈现;

4.3.3 电影搜索页面搭建;

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 

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"))

5.1.3 后台布局搭建;

5.1.4 include引用报错处理;

5.1.5 修改密码;

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

5.2.1 修改密码;

5.2.2 控制面板;

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

5.2.4 标签管理页面搭建;

 

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

5.3.1 编辑电影和电影列表;

 

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

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

5.4.1  会员列表;

5.4.2 评论管理页面搭建;

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

5.5.1 收藏管理列表搭建;

5.5.2 操作日志列表;

5.5.3 角色管理列表搭建;

5.5.4 添加权限和权限列表;

5-6 管理员页面搭建

5.6.1 管理员页面搭建;

6-1 管理员登录

6.1.1 调整项目代码结构;

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

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

 

 

 

6-2 标签管理

6.2.1 标签管理;

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

6.3.1 电影管理;

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

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,开启四个进程;

 

 

 

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;
        }
    }
}

 

 

 

 

 

 

转载于:https://www.cnblogs.com/tqtl911/p/9718346.html

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值