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 Flaskapp = 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 datetimeapp = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:Tqtl911!@#)^@localhost:3306/MicroFilm/" app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Truedb = 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.nameclass 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)) # 登录IPaddtime = 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 datetimeapp = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:Tqtl911!@#)^@localhost:3306/MicroFilm/" app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Truedb = 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.nameclass 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)) # 登录IPaddtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 登录时间;def __repr__(self):return "<UserLog %r>" % self.idclass 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.nameclass 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.titleclass 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 pymysqlapp = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:Tqtl911!@#)^@localhost:3306/MicroFilm" app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Truedb = 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.nameclass 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)) # 登录IPaddtime = db.Column(db.DateTime, index=True, default=datetime.now) # 登录时间;def __repr__(self):return "<UserLog %r>" % self.idclass 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.nameclass 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.titleclass 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.titleclass 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.idclass 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.idclass 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.nameclass 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.nameclass 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.nameclass 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.idclass 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)) # 登录IPreason = db.Column(db.String(600)) # 操作原因addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 创建时间;def __repr__(self):return "<OpLog %r>" % self.idif __name__ == '__main__':"""db.create_all()role = Role(name="超级管理员",auths="",)db.session.add(role)db.session.commit()"""from werkzeug.security import generate_password_hashadmin = 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;"> 微电影</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> 搜索</a></span></div></form><ul class="nav navbar-nav navbar-right"><li><a class="curlink" href="index.html"><span class="glyphicon glyphicon-film"></span> 电影</a></li><li><a class="curlink" href="login.html"><span class="glyphicon glyphicon-log-in"></span> 登录</a></li><li><a class="curlink" href="register.html"><span class="glyphicon glyphicon-plus"></span> 注册</a></li><li><a class="curlink" href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 退出</a></li><li><a class="curlink" href="user.html"><span class="glyphicon glyphicon-user"></span> 会员</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>© 2018 microfilm.cuixiaozhao.com 京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.orgfrom flask import Flask, render_templateapp = Flask(__name__)app.debug = Truefrom app.home import home as home_blueprint from app.admin import admin as admin_blueprintapp.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.orgfrom . 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
Python Flask 构建微电影视频网站相关推荐
- python视频网站项目_[项目实战] Python Flask构建微电影视频网站
注:本站源码仅做学术研究,自娱自乐使用,不得用于任何的非法商业用途 由于版权原因.本站将无限期停止微擎模块资源下载如果有任何侵犯您权益的内容请联系小站删除哦.小站一定会积极配合的. 课程目录: (下载 ...
- Flask 构建微电影视频网站(八)
评论收藏及弹幕 实现电影评论添加及列表.数据查询实现统计播放量和评论量.jquery ajax实现收藏电影,flask结合redis消息队列实现电影弹幕,bug处理等功能. 电影评论-统计 class ...
- python视频网站项目_Python超羽量级灵活框架 Flask实战微电影视频网站 大小项目通吃 Flask实战项目...
课程名称: Python超羽量级灵活框架 Flask实战微电影视频网站 大小项目通吃 Flask实战项目视频教程 课程简介: Flask作为Python编写的Web小型框架,可以使用Python快速开 ...
- python视频网站项目_Python Flask 项目实战—构建微电影视频网站
下单后联系在线客服索取下载链接 课程章节 第1章 课程介绍 1-1 课程导学 1-2 课程介绍 第2章 准备开发环境 2-1 windows环境搭建 2-2 mac os环境搭建 2-3 virtua ...
- 2018年最新Python Flask打造一个视频网站实战视频教程分享
适用人群 1.想使用Python快速开发网站的. 2.前端开发者,想学习后端开发逻辑的. 3.有编程经验,想学习Flask的. 课程概述 本套课程从零基础讲解flask开发网站.涉及到的知识点包括:P ...
- python 开发视频播放网站_python开发微电影视频网站教程附源码
做为一个合格的Pythoner,只掌握一个框架是不够,如果你有过其它Python框架(例如django)的使用经验,对比不同框架的特性来学习,你将收获更多 当前信息若含有黄赌毒等违法违规不良内容,请点 ...
- Flask构建微电影(二)
第三章.项目分析.搭建目录及模型设计 3.1.前后台项目目录分析 微电影网站 前台模块 后台模块 前台(home) 数据模型:models.py 表单处理:home/forms.py 模板目录:tem ...
- Python+Flask框架搭建可视化网站
Python+Flask框架搭建可视化网站 一.项目结构 二.app.py from flask import Flask,render_template import sqlite3app = Fl ...
- python搭建微信小程序百度云_微信小程序-订餐系统-Python flask构建
总大小:14.3 GB └-python3+flask └-centos ├-CentOS-7-x86_64-Minimal-1804.iso 906.0 MB └-mysql ├-mysql-ins ...
最新文章
- C语言字符char和整型int的关系
- 使用火炬之光资源(转)
- 在进度面前,质量该不该打折?
- Java:形式参数问题和返回值问题
- SUSE Linux 启动顺序
- java中数组合并的方法,数组合并--Java原生方法
- 【codevs1063NOIP04PJ】合并果子,贪心の钻石
- [Swift]LeetCode978. 最长湍流子数组 | Longest Turbulent Subarray
- kerberos的系统搭建
- 计算机和资源管理器的异同,计算机应用基础ex.doc
- Pandas统计分析中(数据计算、数据格式化、数据分组统计、数据移位、数据转换、数据合并、数据导出)
- 番茄的随笔4:Clark变换与Park变换
- linux 找出僵尸进程,linux 查看僵尸进程
- 蝌蚪网课助手mac_疫情期间如何录网课?(干货教程)手把手教你录出高质量网课。...
- Gartner到底怎么回事?
- 使用按键精灵自动截图并保存重命名
- 多元复合函数的求导法则
- android wifi是否可用,Android判断网络是否可用、区分WiFi和数据、是否被安全软件拦截...
- html手机点赞图标素材,微信点赞心形图标,微信点赞分享心形图标素材
- 老板,我们的网站又挂了——漫谈 DDoS 攻击
热门文章
- oracl 查询一年所有的天
- 【js实现手写签名板】canvas
- 安卓 网络工具_安卓设备可用苹果Magsafe无线充电,但功率鸡肋,安卓并不需要...
- 使用unittest.defaultTestLoader.discover第二次总是报错
- “And” 在正则表达式中 ``
- VPS国内各网点一键测试脚本
- SWFText 让菜鸟也能轻易制作出专业级的Flash动画
- 获取id查看详情信息
- 绘制圆角矩形(方法 )
- Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean