学到弹幕了,但是添加的弹幕都没有反应。

来源:11-4 .电影弹幕

深圳_电信_王觉

2017-08-13

# home.view.py
@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()

    comment_count = Comment.query.count()

    movie.playnum = movie.playnum + 1
    if page is None:
        page = 1
    page_data = Comment.query.join(
        Movie
    ).join(
        User
    ).filter(
        Movie.id == Comment.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("添加评论成功", "success")
        return redirect(url_for("home.video", id=movie.id, page=1))

    return render_template("home/video.html", movie=movie, form=form, page=1, page_data=page_data,
                           comment_count=comment_count)


@home.route("/tm/<int:id>/", methods=["GET", "POST"])
def tm(id=None):
    import json
    if request.method == "GET":
        # 获取弹幕消息队列
        id = request.args.get('id')
        key = "movie" + str(id)
        if rd.llen(key):
            msgs = rd.lrange(key, 0, 2999)
        res = {
            "code": 1,
            "danmaku": [json.loads(v) for v in msgs]
        }
    else:
        res = {
            "code": 1,
            "danmaku": []
        }
        resp = json.dumps(res)

    if request.method == "POST":
        # 添加弹幕
        data = json.loads(request.get_data())
        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["player"]
            ]
        }

        res = {
            "code": 1,
            "data": msg
        }

        resp = json.dumps(res)
        rd.lpush("movie" + str(data["player"]), json.dumps(msg))
    return Response(resp, mimetype='application/json')
# __init__.py
from flask import Flask,render_template
from flask_sqlalchemy import SQLAlchemy
import pymysql
import os, sys
from flask.ext.redis import FlaskRedis

reload(sys)
sys.setdefaultencoding("utf8")

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:@localhost:3306/douban"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True

app.config["SECRET_KEY"] = '0123456789'

app.config["UP_DIR"] = os.path.join(os.path.abspath(os.path.dirname(__file__)), "static/uploads/")
app.config["FC_DIR"] = os.path.join(os.path.abspath(os.path.dirname(__file__)), "static/uploads/users/")

app.config['REDIS_URL'] = "redis://localhost:6379/0"

app.debug = True

db = SQLAlchemy(app)
rd = FlaskRedis(app)

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

这一章节讲解的不是很清楚,老师稍后可以补充一下吗?比如redis的方法都还没能学到呢,谢谢老师,辛苦了

写回答

2回答

rustgopy

2017-08-13

同学,你好

  1. key表示redis队列的键,key值我们采用的形式是电影movie拼接电影ID

  2. rd.llen(key)表示统计队列的长度

  3. rd.lrange(key, 0, 2999)表示从redis队列中取出3000条数据

  4. rd.lpush("movie" + str(data["player"]), json.dumps(msg))表示把数据压入队列

  5. 具体发送弹幕和获取弹幕的接口格式,我们可以参考dplayer官网的接口格式!

0
0

Ghost

2017-08-13

 res = {
            "code": 1,
            "danmaku": [json.loads(v) for v in msgs]
        }
      
        
  data = json.loads(request.get_data())

我遇到过的问题是编码问题,这两个地方化需要先对数据解码

 res = {
            "code": 1,
            "danmaku": [json.loads(v.decode('utf-8')) for v in msgs]
        }
        
  data = json.loads(request.get_data().decode('utf-8'))

具体的可以在网页进行调试观察

1
2
浅若丶清风
非常感谢~~~~~
2017-09-11
共2条回复

Python Flask 构建微电影视频网站

Python 最好用轻量级框架,让你轻松胜任 Python Web 工程师

683 学习 · 663 问题

查看课程