Flask 构建微电影视频网站(八)
评论收藏及弹幕
实现电影评论添加及列表、数据查询实现统计播放量和评论量、jquery ajax实现收藏电影,flask结合redis消息队列实现电影弹幕,bug处理等功能。
电影评论-统计
class CommentForm(FlaskForm):
content = TextAreaField(
label="内容",
validators=[
DataRequired("请输入内容!"),
],
description="内容",
render_kw={
"id": "input_content"
}
)
submit = SubmitField(
'提交评论',
render_kw={
"class": "btn btn-success",
"id": "btn-sub"
}
)
@home.route("/play/<int:id>/<int:page>/", methods=["GET", "POST"])
def play(id=None, page=None):
"""
播放电影
"""
movie = Movie.query.join(Tag).filter(
Tag.id == Movie.tag_id,
Movie.id == int(id)
).first_or_404()
if page is None:
page = 1
page_data = Comment.query.join(
Movie
).join(
User
).filter(
Movie.id == movie.id,
User.id == Comment.user_id
).order_by(
Comment.addtime.desc()
).paginate(page=page, per_page=10)
form = CommentForm()
if "user" in session and form.validate_on_submit():
data = form.data
comment = Comment(
content=data["content"],
movie_id=movie.id,
user_id=session["user_id"]
)
db.session.add(comment)
db.session.commit()
movie.commentnum = movie.commentnum + 1
db.session.add(movie)
db.session.commit()
flash("添加评论成功!", "ok")
return redirect(url_for('home.play', id=movie.id, page=1))
# 放在后面避免添加评论播放量涨2
movie.playnum = movie.playnum + 1
db.session.add(movie)
db.session.commit()
return render_template("home/play.html", movie=movie, form=form, page_data=page_data)
修改前端页面
收藏电影
@home.route("/moviecol/add/", methods=["GET"])
@user_login_req
def moviecol_add():
"""
添加电影收藏
"""
uid = request.args.get("uid", "")
mid = request.args.get("mid", "")
moviecol = Moviecol.query.filter_by(
user_id=int(uid),
movie_id=int(mid)
).count()
# 已收藏
if moviecol == 1:
data = dict(ok=0)
# 未收藏进行收藏
if moviecol == 0:
moviecol = Moviecol(
user_id=int(uid),
movie_id=int(mid)
)
db.session.add(moviecol)
db.session.commit()
data = dict(ok=1)
import json
return json.dumps(data)
在播放页面添加js
<script>
$(document).ready(function () {
$("#btn-col").click(function () {
var mid = {{ movie.id }};
var uid = {{ session['user_id'] }};
$.ajax({
url: "{{ url_for('home.moviecol_add') }}",
type: "GET",
data: "mid=" + mid + "&uid=" + uid,
dataType: "json",
success: function (res) {
if (res.ok == 1) {
$("#show_col_msg").empty();
$("#show_col_msg").append("收藏成功!");
} else {
$("#show_col_msg").empty();
$("#show_col_msg").append("已经收藏!");
}
}
})
});
});
</script>
电影弹幕
使用[dplayer](http://dplayer.js.org/#/)替换播放器,下载dplayer文件,拷贝到static下
@home.route("/video/<int:id>/<int:page>/", methods=["GET", "POST"])
def video(id=None, page=None):
"""
弹幕播放器
"""
movie = Movie.query.join(Tag).filter(
Tag.id == Movie.tag_id,
Movie.id == int(id)
).first_or_404()
if page is None:
page = 1
page_data = Comment.query.join(
Movie
).join(
User
).filter(
Movie.id == movie.id,
User.id == Comment.user_id
).order_by(
Comment.addtime.desc()
).paginate(page=page, per_page=10)
movie.playnum = movie.playnum + 1
form = CommentForm()
if "user" in session and form.validate_on_submit():
data = form.data
comment = Comment(
content=data["content"],
movie_id=movie.id,
user_id=session["user_id"]
)
db.session.add(comment)
db.session.commit()
movie.commentnum = movie.commentnum + 1
db.session.add(movie)
db.session.commit()
flash("添加评论成功!", "ok")
return redirect(url_for('home.video', id=movie.id, page=1))
db.session.add(movie)
db.session.commit()
return render_template("home/video.html", movie=movie, form=form, page_data=page_data)
@home.route("/tm/v3/", methods=["GET", "POST"])
def tm():
"""
弹幕消息处理
"""
import json
if request.method == "GET":
# 获取弹幕消息队列
id = request.args.get('id')
# 存放在redis队列中的键值
key = "movie" + str(id)
if rd.llen(key):
msgs = rd.lrange(key, 0, 2999)
'''
{
"code":0,
"data":[
[
6.978, # time
0, # type
16777215, # color
"DIYgod", # author
"1111111111111111111" # text
],
...
]
}
'''
res = {
"code": 0,
"data": [json.loads(v) for v in msgs]
}
else:
res = {
"code": 0,
"data": []
}
resp = json.dumps(res)
if request.method == "POST":
# 添加弹幕
data = json.loads(request.get_data())
'''
请求
author: "DIYgod"
color: 16777215
id: "9E2E3368B56CDBB4"
text: "此生无悔入四月来世愿做友人"
time: 0
type: 0
'''
'''
响应
{
"code":0,"
data":{
"_id":"5bfb561b63125e15873f8d22",
"player":"9E2E3368B56CDBB4",
"author":"DIYgod",
"time":0,
"text":"此生无悔入四月来世愿做友人",
"color":16777215,
"type":0,
"ip":"222.88.236.173",
"referer":"http://dplayer.js.org/",
"date":1543198235766,
"__v":0
}
}
'''
resp_msg = {
"__v": 0,
"author": data["author"],
"time": data["time"],
"text": data["text"],
"color": data['color'],
"type": data['type'],
"ip": request.remote_addr,
"_id": datetime.datetime.now().strftime("%Y%m%d%H%M%S") + uuid.uuid4().hex,
"player": data["id"]
}
res = {
"code": 0,
"data": resp_msg
}
resp = json.dumps(res)
# 将添加的弹幕推入redis的队列中
msg = [
data["time"],
data['type'],
data['color'],
data["author"],
data["text"],
]
rd.lpush("movie" + str(data["id"]), json.dumps(msg))
return Response(resp, mimetype='application/json')
在video.html中引入js和css
<link rel="stylesheet" href="{{ url_for('static',filename='dplayer/dist/DPlayer.min.css') }}">
<script src="https://cdn.jsdelivr.net/npm/flv.js/dist/flv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js"></script>
<script src="{{ url_for('static',filename='dplayer/dist/DPlayer.min.js') }}"></script>
```
// 获取弹幕
<script>
var dp1 = new DPlayer({
element: document.getElementById('dplayer1'),
video: {
url: "{{ url_for('static',filename='uploads/'+movie.url) }}",
},
danmaku: {
id: '{{ movie.id }}',
api: "/tm/",
}
});
</script>
安装flask-redis
pip install flask-redis
在初始化文件中进行redis链接
from flask_redis import FlaskRedis
app.config["REDIS_URL"] = "redis://localhost:6379/1"
db = SQLAlchemy(app)
rd = FlaskRedis(app)
生产环境部署
参考django部署,所需文件在项目中
Flask 构建微电影视频网站(八)的更多相关文章
- Python flask 构建微电影视频网站☝☝☝
Python flask 构建微电影视频网站☝☝☝ 1.安装数据库连接依赖包 pip install flask-sqlalchemy 2.创建movie数据库 在CentOS虚拟机,进入MaridD ...
- Python flask 构建微电影视频网站✍✍✍
Python flask 构建微电影视频网站 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...
- Flask 构建微电影视频网站(一)
Flask构建电影视频网站 Python MTV模型 Flask微内核 Flask扩展插件配置及使用方法 根据业务开发网站前后台功能 Flask结合MySQL数据库 你将可以独立开发网站 独立部署运维 ...
- Python Flask 构建微电影视频网站
前言 学完本教程,你将掌握: 1.学会使用整形.浮点型.路径型.字符串型正则表达式路由转化器 2.学会使用post与get请求.上传文件.cookie获取与相应.404处理 3.学会适应模板自动转义. ...
- Flask 构建微电影视频网站(四)
后台管理 实现后台管理系统使用flask sqlalchemy结合mysql数据库进行增删改查操作.分页的使用.路由装饰器定义.模板中变量调用.登录会话机制.上传文件.flask wtforms表单使 ...
- Flask 构建微电影视频网站(二)
搭建前台页面 前台布局搭建 将static中的文件拷贝到项目的static目录下 在app/templates/home下新建home.html,当作基础模板,并修改静态资源链接 <!docty ...
- Flask 构建微电影视频网站(三)
搭建后台页面 视图函数位于admin文件夹下, app/admin/views.py 管理员登录页面搭建 视图函数 @admin.route('/') def index(): return '后台主 ...
- Flask 构建微电影视频网站(七)
电影模块实现 上映预告 @home.route("/animation/") def animation(): """ 首页轮播动画 "&q ...
- Flask 构建微电影视频网站(六)
会员模块实现 会员注册 class RegistForm(FlaskForm): name = StringField( label="昵称", validators=[ Data ...
随机推荐
- Python 为什么要使用描述符?
学习 Python 这么久了,说起 Python 的优雅之处,能让我脱口而出的, Descriptor(描述符)特性可以排得上号. 描述符 是Python 语言独有的特性,它不仅在应用层使用,在语言的 ...
- 关于C#的new与override
先放出来两个基类和派生类: public class BaseClass { public virtual void Method1(string desc) { Console.WriteLine( ...
- 使用wepy开发微信小程序01——常用的组件
1.axio.js 'use strict' import axios from 'axios' import wepyAxiosAdapter from 'wepy-plugin-axios/dis ...
- Java 合并、拆分PDF文档
处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分 ...
- 在Windows Phone 8.1中使用Sqlite数据库
前言 我的工作目前不涉及到Windows phone的开发,但是业余时间也开发过几款app.以前由于各种条件的限制,只接触到WP8.0设备的app开发. 最近几个月开始将WP8的应用迁移到WP8.1, ...
- Linux下LANMP集成环境中编译增加pdo_odbc模块
linux版本为CentOs6.5,php集成环境为lanmp_v3.1,集成环境中默认的pdo扩展为:mysql, sqlite, sqlite2,现在有需求想链接微软的Access数据库,所以需要 ...
- 安装CentOs 7.3
步 下载安装 CentOS 7.3 下载地址 1.官网:https://www.centos.org/download/ 2.centos阿里汇总:https://yq.aliyun.com/zt/ ...
- 在xp下无人值守自动安装系统
无人值守安装可以大大缩短安装系统的时间.我在虚拟机测试成功. 先给文件链接https://files.cnblogs.com/files/sishenzaixian/%E8%87%AA%E5%8A%A ...
- THINKphp中复杂的查询
字符串拼接查询 案例一:拼接字符串(多条件查询) $where = ''; //定义字符串,用于拼接满足条件的数据字段 $value = []; // 定义空数组,用于接收值 if(!empty($n ...
- PhpStorm 常用快捷键
PhpStorm 常用快捷键 File Structure 路径: Main menu > Navigate > File Structure 显示当前文件的类和函数结构,便于查找当前文件 ...