Django+mysql连接成功之后,就是我们对网页设计了。

但我并不擅长html的一些前端,不做多的描述…因此将这些html文件和静态文件,打包提供大家参考。

点击下载 这个是数据文件,静态文件,html文件,可以将其导入进行测试
csdn不能下载,所以麻烦到我的hexo博客中下载我的hexo博客
主要了解对app中各模块的写法

index模块

之前将index的models.py为了建立数据库完成了,现在继续写views.pyurls.py

#index的urls.py
from django.urls import path
from . import viewsurlpatterns = [path('', views.indexView, name='index'),
]#index的views.pyfrom django.shortcuts import render
from .models import *def indexView(request):#热搜歌曲search_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:8]#select_related的用法可以用于表之间建立联系的查询。#select_related的参数为'song',我们可以理解为在这个表中,排序为逆序,显示前八个数据#等同于SQL:SELECT * FROM index_dynamic INNER JOIN index_song ON (song_id = id)#查询两个模型的全部数据#音乐分类label_list = Label.objects.all()#热门歌曲play_hot_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:10]#新歌推荐daily_recommendation = Song.objects.order_by('-song_release').all()[:3]#热门搜索、热门下载search_ranking = search_song[:6]down_ranking = Dynamic.objects.select_related('song').order_by('-dynamic_down').all()[:6]all_ranking = [search_ranking,down_ranking]#render()结合一个给定的模板和一个给定的上下文字典, 并返回一个渲染后的HttpResponse对象。#locals()用法:locals()可以直接将函数中所有的变量全部传给模板return render(request, 'index.html', locals())

在上面的代码中,我将大部分都用注释标记了出来。

Django使用请求和响应对象来通过系统传递状态。

视图所对应的是在html显示中可以将数据库中的数据进行查询,然后将选择出来的数据放到站点进行浏览。

比如我们在index.html节选文件中可以看到,在view中定义的label_list列表我们在其中使用利用for循环进行调用,最后将数据库建立连接的数据显示在主页上。

这里也涉及到前端中JavaScript,本小白实在是不知语言原理,只能看懂一二…各位见谅!!!

<div class="nav-box"><div class="nav-box-inner"><ul class="nav clearfix"><li><a href="/">首页</a></li><li><a href="{% url 'ranking' %}" target="_blank">歌曲排行</a></li><li><a href="{% url 'home' 1 %}" target="_blank">用户中心</a></li></ul><div class="category-nav"><div class="category-nav-header"><strong><a href="javascript:;" title="">音乐分类</a></strong></div><div class="category-nav-body"><div id="J_CategoryItems" class="category-items">{% for label in label_list  %}<div class="item" data-index="1"><h3><a href="javascript:;">{{ label.label_name }}</a></h3></div>{% endfor  %}</div></div></div></div>

接下来的各个模块的代码,我将根据index.html出现的顺序依次往下罗列。

search模块

首先是search的代码,搜索是对网站内的数据进行检索

#search的urls.psfrom django.urls import path
from . import viewsurlpatterns = [path('<int:page>.html', views.searchView, name='search'),
]#views.py
from django.shortcuts import render, redirect
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.db.models import Q
from index.models import *
def searchView(request, page):if request.method == 'GET':#搜索歌曲search_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:6]#获取搜索内容,如果kword为空就查询全部歌曲kword = request.session.get('kword', '')if kword:#Q是SQL语句里的or语法song_info = Song.objects.values('song_id', 'song_name','song_singer', 'song_time').filter(Q(song_name__icontains=kword) | Q(song_singer=kword)).order_by('-song_release').all()else:song_info = Song.objects.values('song_id', 'song_name', 'song_singer', 'song_time').order_by('-song_release').all()[:50]#分页功能,是django的一个库函数,叫做分页器,设置每一页显示几条数据paginator = Paginator(song_info, 5)try:contacts = paginator.page(page)except PageNotAnInteger:contacts = paginator.page(1)except EmptyPage:contacts = paginator.page(paginator.num_pages)#添加歌曲搜索次数song_exist = Song.objects.filter(song_name=kword)if song_exist:song_id = song_exist[0].song_iddynamic_info = Dynamic.objects.filter(song_id=int(song_id)).first()#判断歌曲动态信息是否存在,存在就在原来的基础上加1if dynamic_info:dynamic_info.dynamic_search += 1dynamic_info.save()#若动态信息不存在,则创建新的动态信息else:dynamic = Dynamic(dynamic_plays=0, dynamic_search=1, dynamic_down=0, song_id=song_id)dynamic.save()return render(request, 'search.html', locals())else:#处理POST请求,并重定向搜索页面request.session['kword'] = request.POST.get('kword', '')return redirect('/search/1.html')

大概说明一下,method用于获取用户的请求方式。属性GET和POST用于获取用户的请求参数

GET请求一般做查询(有缓存),POST请求一般做添加/删除/修改(无缓存)

session就是用来在服务器端保存用户的会话状态。

Paginator是一个django中自带的分页器,将搜索结果进行每页5条来显示。

根据搜索的内容kword查找完全匹配的歌名,匹配成功,才会判断歌曲的动态信息是否存在。

存在就在数据库的数据中+1,否则创建一条动态信息,并将搜索次数设为1.

ranking模块

歌曲信息列表,当我们在站点进行搜索时,显示出来的排名。这个排名根据设置的降序进行排序。下面上代码

#ranking的urls.py
from django.urls import path
from .import views
urlpatterns = [path('',views.rankingView,name='ranking'),
]#ranking的views.py
from djagno.shortcuts import render
from index.models import *def rankingView(request):#热搜歌曲search_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:4]#歌曲分类列表All_list = Song.objects.values('song_type').distinct()#关键词 DISTINCT 用于返回唯一不同的值。#歌曲列表信息song_type = request.GET.get('type', '')#寻找名为type的GET参数,而且如果参数没有提交,返回一个空的字符串。if song_type:song_info = Dynamic.objects.select_related('song').filter(song__song_type=song_type).order_by('-dynamic_plays').all()[:10]else:song_info = Dynamic.objects.select_related('song').order_by('-dynamic_plays').all()[:10]return render(request, 'ranking.html', locals())

web开发一般是一个无聊的过程,尤其在视图编写功能方面。所以在Django中植入了通用视图这一概念,该功能封装了视图开发常用的代码和模式。根据用途划分三大类:

TemplateView直接返回HTML模板,但无法将数据库的数据展示出来

ListView能将数据库的数据传递给HTML模板,通常获取某个表的所有数据

DetailView能将数据库的数据传递给HTML模板,通常获取数据表的单条数据

通用模板的代码

#ranking.urls
from django.urls import path
from . import viewsurlpatterns = [#通用视图path('.list', views.RankingList.as_view(), name = 'rankingList'),
]#ranking.views
from django.views.generic import ListViewclass RankingList(ListView):#context_object_name 设置HTML模板的某一个变量名称context_object_name = 'song_info'#设定模板文件template_name = 'ranking.html'#查询变量song_info的数据def get_queryset(self):#获取请求参数song_type = self.request.GET.get('type', '')if song_type:song_info = Dynamic.objects.select_related('song').filter(song__song_type=song_type).order_by('-dynamic_plays').all()[:10]else:song_info = Dynamic.objects.select_related('song').order_by('-dynamic_plays').all()[:10]return song_info#添加其他变量def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)#搜索歌曲context['search_song'] = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:4]#所有歌曲分类context['All_list'] = Song.objects.values('song_type').distinct()return context

我个人觉得通用视图还是比较方便的。首先如果自己构思时,不一定能想出最好的代码块,可能有出错的可能。但是通用视图在模板上进行一定的修改,设定模板文件,将所要查询的数据SQL转换成django中的语法,在之后添加其他变量,设置HTML中的其他变量。

play模块

音乐网站那么最重要的就是歌曲的视听效果了。前面提到了,除了HTML在相关的模块templates中,所有静态的文件资源都被保存在一个static文件夹中,那么肯定我们需要读取这个文件,读取了之后在网页播放

#play的urls.py
from django.urls import path
from . import views
urlpatterns = [#歌曲播放页面path('<int:song_id>.html', views.playView, name='play'),#歌曲下载path('download/<int:song_id>.html', views.downloadView, name='download')
]#views.py
from django.shortcuts import render
from index.models import *
#歌曲播放页面
def playView(request, song_id):#热搜歌曲search_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:6]#歌曲信息song_info = Song.objects.get(song_id=int(song_id))#歌曲列表play_list = request.session.get('play_list', [])song_exist = Falseif play_list:for i in play_list:if int(song_id) == i['song_id']:song_exist = Trueif song_exist == False:play_list.append({'song_id': int(song_id), 'song_singer': song_info.song_singer, 'song_name': song_info.song_name, 'song_time': song_info.song_time})request.session['play_list'] = play_list#歌词if song_info.song_lyrics != '暂无歌词':f = open('static/songLyric/' +song_info.song_lyrics, 'r', encoding='utf-8')song_lyrics = f.read()f.close()#相关歌曲song_type = Song.objects.values('song_type').get(song_id = song_id)['song_type']song_relevant = Dynamic.objects.select_related('song').filter(song__song_type=song_type).order_by('-dynamic_plays').all()[:6]#添加播放次数#扩展功能:可使用session实现每天只添加一次播放次数dynamic_info = Dynamic.objects.filter(song_id=int(song_id)).first()#判断歌曲动态信息是否存在, 存在就在原来的基础上+1if dynamic_info:dynamic_info.dynamic_plays += 1dynamic_info.save()#若动态信息不存在,则创建新的动态信息else:dynamic_info = Dynamic(dynamic_plays=1, dynamic_search=0, dynamic_down=0, song_id=song_id)dynamic_info.save()return render(request, 'play.html', locals())

关于播放列表的部分,这里获取当前Session的play_list的信息,play_list代表用户的播放记录。将用户URL的参数song_id与play_list的song_id进行对比,如果两者匹配的上,说明当前歌曲已加入播放记录。

    #歌曲下载
def downloadView(request, song_id):#根据song_id查找歌曲信息song_info = Song.objects.get(song_id=int(song_id))#添加下载次数dynamic_info = Dynamic.objects.filter(song_id=int(song_id)).first()if dynamic_info:dynamic_info.dynamic_down += 1dynamic_info.save()#若动态信息不存在,则创建新的动态信息else:dynamic_info = Dynamic(dynamic_plays=0, dynamic_search=0, dynamic_down=1, song_id=song_id)dynamic_info.save()#读取文件内容file = 'static/songFile/' + song_info.song_filedef file_iterator(file, chunk_size=512):with open(file, 'rb') as f:while True:c = f.read(chunk_size)if c:yield celse:break#将文件内容写入StreamingHttpResponse对象,并以字节流的方式返回给用户,实现文件下载filename = str(song_id) + '.mp3'response = StreamingHttpResponse(file_iterator(file))response['Content-Type'] = 'application/octet-stream'response['Content-Disposition'] = 'attachment; filename="%s"'%(filename)return response

在代码中response的使用就是将音频文件在HTML中进行播放的方法。

在各个模块中的代码中,视图更多的还是将数据库中的数据查询出来,存放到一个标量或者列表里,这是在学习过程中更需要我们去了解视图在web中的方法实现。而models文件一般在index文件中,用于数据库时进行类的书写。

comment模块

这个模块的使用,也是我对django好感度一个巨大的提升。因为django自己封装了这么一个可以进行评论的函数。这让我们使用起来就非常方便。

#comment的urls.py
from django.urls import path
from . import viewsurlpatterns = [path('<int:song_id>.html', views.commentView, name='comment'),
]#views.py
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.shortcuts import render, redirect
from django.http import Http404
from index.models import *
import timedef commentView(request, song_id):#搜索结果search_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:6]#点评提交处理if request.method == 'POST':comment_text = request.POST.get('comment', '')comment_user = request.user.username if request.user.username else '匿名用户'if comment_text:comment = Comment()comment.comment_text = comment_textcomment.comment_user = comment_usercomment.comment_date = time.strftime('%Y-%m-%d', time.localtime(time.time()))comment.song_id = song_idcomment.save()return redirect('/comment/%s.html' %(str(song_id)))else:song_info = Song.objects.filter(song_id = song_id).first()#歌曲不存在,抛出404if not song_info:raise Http404comment_all = Comment.objects.filter(song_id = song_id).order_by('comment_date')song_name = song_info.song_namepage = int(request.GET.get('page',1))#当请求参数不存在时,默认页数为1,如果存在,将参数值转化为Int类型#每两条点评信息设置为一页paginator = Paginator(comment_all, 2)#  Paginator分页功能 可以接收列表、元组或其它可迭代的对象。try:contacts = paginator.page(page)except PageNotAnInteger:contacts = paginator.page(1)except EmptyPage:contacts = paginator.page(paginator.num_pages)return render(request, 'comment.html', locals())

如果歌曲存在,在歌曲点评表comment中查询当前歌曲的全部点评信息,然后获取到GET请求的请求参数page。参数page点评的分页页数,如果请求参数page不存在,默认页数为1,如果存在,将参数值转换成Int类型。

当用户评论时,浏览器向网站发送POST请求,POST请求由歌曲点评页的URL接收和处理。首先获取到表单里的点评内容,命名为comment_text,然后获取当前用户名,如果当前用户没有登陆网站,用户为匿名用户,用户为comment_user。如果comment不为空,在歌曲点评表comment中新增一条点评信息,分别记录点评内容、用户名、点评日期和当前歌曲在歌曲信息表的主键。

最后在使用分页功能进行对数据的显示。

基本模块就完成了。目前来看,基本不算太难,在有python基本语法的情况下时容易去了解。就是对视图,模块,url这三个进行设计和数据库的连接。

Django建立一个音乐网站(三)相关推荐

  1. Django建立一个音乐网站(四)

    之前将网站一些该有的元素都准备完成了.接下来就是关于用户注册和后台admin设置. user模块 关于一个网站的浏览量是靠用户的数量来决定的.所以每一个用户在网站的操作,要做出限制.这个是可以实现的. ...

  2. Django建立一个音乐网站(一)

    Django是python学习的一个分支.最近跟着书上在学习.关于书上的项目我觉得拿来练手非常合适.而且涉及了数据库,html相关知识,对程序员的学习关联性我觉得还是有很大的提升的. 根据<玩转 ...

  3. 运用简单的HTML、CSS建立一个音乐网站模板

    项目已开源 如需代码请在码云或者github上下载 请私信或评论联系我 码云: GitHub: 请下载后在码云.GitHub上点击star或者follow,您的关注是对我最大的支持! 代码节选如下如下 ...

  4. 音乐网站购买服务器,怎么样去做一个音乐网站

    虽然现在音乐网站的压力很大,因为服务器费用,同类竞争激烈和版权问题,但还是有许多站长跃跃欲试.今天告诉大家做一个音乐网站的大致流程和方法. 做音乐网这种网站有三个基本的: 1.首先版权问题. 要做大必 ...

  5. 音乐网站要什么服务器,告诉你怎么样去做一个音乐网站

    虽然现在音乐网站的压力很大,因为服务器费用,同类竞争激烈和版权问题,但还是有许多站长跃跃欲试.今天告诉大家做一个音乐网站的大致流程和方法. 做音乐网这种网站有三个基本的: 1.首先版权问题. 要做大必 ...

  6. 自己如何建立一个公司网站?公司网站建设策划书怎么写?

    如何建立一个公司网站?对于一个新手来说建立一个公司网站,虽然步骤看起来很简单,但是实际操作起来,不是那么容易把网站做好的.想快速建网站只需要找准自己的需求,按照流程操作就很方便快捷.建网站之前需要准备 ...

  7. 独立开发变现周刊(第78期):建立一个佣金网站,每月赚4万美元

    分享独立开发.产品变现相关内容,每周五发布. (合集:https://www.ezindie.com/weekly ) 目录 1.Jobboardsearch: 面向全世界的公开招聘网站 2.Hove ...

  8. 首席技术官_当首席技术官决定建立一个婚礼网站时

    首席技术官 一个由Django支持的开源,响应式婚礼网站和邀请+来宾管理系统,具有250多个提交,单元测试等. (An open-source, responsive, Django-powered ...

  9. React + Vite 实现一个音乐网站(aplayer音乐播放器 )

    众所周知,音乐网站需要能播放音乐 1.页面搭建 我们需要搭建这样一个部分 那么秉承一分为二的原则,左边音乐列表,右边显示cd图片.理所应当我们得让cd运动起来. components里面建立文件夹Mu ...

最新文章

  1. 怎样用python模拟微信扫码登录_十一、模拟扫码登录微信(用Django简单的布置了下页面)发送接收消息...
  2. 在word中的公式以代码形式体现在web上的方法
  3. linux中vi模式中c命令,“Linux”系统中“vi ^C ”命令是什么意思?
  4. [转]C#利用委托跨线程更新UI数据
  5. c#windfrom打包_WinForm程序打包教程
  6. 电商项目——分布式基础概念和电商项目微服务架构图,划分图的详解——第二章——上篇
  7. pojo类继承pojo类_如何编写更好的POJO服务
  8. android获取手机号ip地址,手机ip查询我的地址定位(网站如何抓取用户手机号和IP地址)...
  9. pbootcms建站,pbootcms建站方法技巧
  10. Quara 上一些有趣的问答
  11. 设计模式(九)——代理模式(Proxy)
  12. permission denied (publickey)问题的解决
  13. 魔趣开源系统 6.0 使用体验(Nubia Z9 mini)
  14. day02-Java基础语法
  15. python网络爬虫学习笔记(7)动态网页抓取(二)实践
  16. 【VB与数据库】——机房收费系统之结账
  17. iOS AFN框架(二)的使用和有关序列化器的问题--缓存机制------
  18. iOS 上架app的过程当中出现the Info.plist is missing or could not be parsed.经历
  19. 数学建模——模拟退火算法(Simulated Annealing,SA)
  20. 蓝鲸智云环境搭建(1)

热门文章

  1. 【Java】远程调用、线程池手写一个简单服务器
  2. ylinux系统找到软件_linux系统如何安装软件 (详细文字教程)
  3. 软件测试详细分析,如何进行软件测试
  4. yandex地图js学习
  5. Ubuntu gnome安装Monaco字体,FontForge module is probably not installed
  6. 理论动态 | 数据治理(第2期)
  7. 会python编程可以做什么工作_学Python编程到底能做什么工作?
  8. bounding box回归的原理学习——yoloV1
  9. 平翘舌绕口令(整理)
  10. 关于refs/for/ 和refs/heads/