
python-Django项目实战-播放与下载.docx
13页python-Django项目实战-播放与下载歌曲播放与下载从网站首页、歌曲排行榜和歌曲搜索得知,每个页面的歌曲信息都设置了歌曲播放的地址链接,只要在页面上单击歌曲名即可访问歌曲播放页总的来说,歌曲播放页是音乐网站的核心页面,所有页面的歌曲信息都有播放链接,通过播放链接而已访问可以访问歌曲播放页定义路由歌曲播放由项目应用play实现,在play的urls.py中分别定义路由play和download路由的定义过程如下:from django.urls import pathfrom .views import *urlpatterns = [ # 歌曲播放页 path('
在play的view.py中分别定义视图函数playView和downloadView代码如下:from django.shortcuts import renderfrom django.http import StreamingHttpResponsefrom index.models import *def playView(request, id): # 热搜歌曲 searchs = Dynamic.objects.select_related('song').order_by('-search').all()[:6] # 相关歌曲推荐 type = Song.objects.values('type').get(id=id)['type'] relevant = Dynamic.objects.select_related('song').filter(song__type=type).order_by('-plays').all()[:6] # 歌曲信息 songs = Song.objects.get(id=int(id)) # 播放列表 play_list = request.session.get('play_list', []) exist = False if play_list: for i in play_list: if int(id) == i['id']: exist = True if exist == False: play_list.append({'id': int(id), 'singer': songs.singer, 'name': songs.name, 'time': songs.time}) request.session['play_list'] = play_list # 歌词 if songs.lyrics != '暂无歌词': lyrics = str(songs.lyrics.url)[1::] with open(lyrics, 'r', encoding='utf-8') as f: lyrics = f.read() # 添加播放次数 # 功能扩展:可使用Session实现每天只添加一次播放次数 p = Dynamic.objects.filter(song_id=int(id)).first() plays = p.plays + 1 if p else 1 Dynamic.objects.update_or_create(song_id=id, defaults={'plays': plays}) return render(request, 'play.html', locals())def downloadView(request, id): # 添加下载次数 p = Dynamic.objects.filter(song_id=int(id)).first() download = p.download + 1 if p else 1 Dynamic.objects.update_or_create(song_id=id, defaults={'download': download}) # 读取文件内容 # 根据id查找歌曲信息 songs = Song.objects.get(id=int(id)) file = songs.file.url[1::] def file_iterator(file, chunk_size=512): with open(file, 'rb') as f: while True: c = f.read(chunk_size) if c: yield c else: break # 将文件内容写入StreamingHttpResponse对象 # 并以字节流方式返回给用户,实现文件下载 f = str(id) + '.m4a' response = StreamingHttpResponse(file_iterator(file)) response['Content-Type'] = 'application/octet-stream' response['Content-Disposition'] = 'attachment; filename="%s"' %(f) return response视图函数playView分别实现4次数据查询、播放列表的设置、歌词的读取和播放次数的累加,功能的实现过程说明如下:(1)变量searchs实现歌曲搜索框下方的热搜歌曲,变量relevant实现相关歌曲推荐功能,将同一类型的歌曲展示在歌曲播放页的最下方。
2)播放列表由会话Session存储当前用户的播放记录3)变量songs获取当前歌曲的信息,如果当前歌曲存在歌词文件,就读取歌词文件的数据内容,并以变量lyrics表示4)累加播放次数用于查询模型Dynamic是否存在歌曲动态信息,若存在,则将播放次数累加1,否则新增动态信息并将播放次数设为1,最后调用内置方法update_or_create实现动态信息的更新或新增操作如果模型Dynamic不存在当前歌曲的动态信息,那么内置方法update_or_create将执行数据新增操作,否则执行数据更新操作视图函数downloadView实现歌曲文件的下载功能,歌曲每下载一次,就对歌曲的下载次数累加1,因此,视图函数downloadView实现两个功能;累计下载次数和文件下载,功能说明如下:(1)累加下载次数与累加播放次数的功能相似,两者都是调用Django内置方法update_or_create实现动态信息的更新或新增操作,前者是操作模型字段download,后者是操作模型字段plays2)文件下载使用StreamingHttpResponse实现,这是实现流式响应输出(流式响应输出是使用Python的迭代器将数据进行分段处理并传输)。
模板定义核心就是音乐的播放部分下载可以通过a标签点击下载但是有个情况,比如txt、png、jpg等这些浏览器支持直接打开的文件是不会执行下载任务的,而是会直接打开文件,这个时候就需要给a标签添加一个属性“download”代码借鉴{% extends "base.html" %}{% load static %}{% block link %}{% endblock %}{# ① #}{% block body %}
