基于Django+Bootstrap框架,设计微型小说网站

news/2024/5/17 4:52:52/文章来源:https://blog.csdn.net/weixin_34408624/article/details/92534064

一、项目背景:

  为了回顾关于django的文件上传分页功能,打算写一个微型的小说网站练练手。花了一个下午的时间,写了个小项目,发现其中其实遇到了许多问题,不过大部分通过debug之后就解决了,其他部分通过阅读了Pagination插件以及Bootstrap-FileInput插件的官方文档。

二、详细设计:

  省去小说网站的用户模块的功能,小说网站主要的功能就是上传文件在线阅读小说。针对这两个功能,
  主要用到dajngo内置的Pagination模块,以及选择一个上传文件插件即可。因为用的是Bootsrap前端框架,所以就选择了Bootsrap比较多人用的FileInput插件。
大致的流程:

  • 在首页可以选择上传本地的txt文件到服务器上,然后首页上同时会异步更新已上传的txt文本文件列表。
  • 并且可以在上面选择阅读或者删除的操作。阅读则跳转到另外一个页面,后台会读取该文本文件,并且进行分页操作,返回到前端。主要的流程就是这样。接下来讲讲Pagination和FileInput插件和核心代码。

三、合适的工具:

 Django内置的Pagination实现分页功能,这个不用多说,用Django做web开发分页功能都会用到。
 Bootstrap本身自带upload file文件上传插件太丑了,加上功能也不够完善。所以选择了Bootstrap FileInput插件。

版本选择:

  • Python 3.6.6
  • Django==2.1.7
  • Bootstrap v4.3.1
  • bootstrap-fileinput v4.5.2

四、代码详解:

首先代码主要分为两块,一块为文件上传后,接收文件对象,保存到指定的目录下;第二块为读取txt文本文件内容,分页展示到前端页面。
 首先讲讲文件上传的代码,主要涉及到前端的bootstrap-fileinputt插件。该插件将简单的HTML文件输入转换为高级文件选择器控件。对于不支持JQuery或Javascript的浏览器,将有助于回退到正常的HTML文件输入。

基于Django+Bootstrap框架,设计微型小说网站
 以上这段是官方的自我介绍,说说我个人感受吧。首先这个插件支持批量上传,异步上传等功能,简化大部分JS逻辑方面的代码,具体只要跟着官方的API文档看一看,修改一些参数即可。其次,对于上传时会显示一个进度条,用于显示上传的完成度,这样直观反映了完成度。

bootstrap-fileinput的github地址:
https://github.com/kartik-v/bootstrap-fileinput
bootstrap-fileinput的官方文档地址:
http://plugins.krajee.com/file-input
bootstrap-fileinput的官方DEMO:
http://plugins.krajee.com/file-basic-usage-demo

4.1、文件上传

HTML代码:

 <div dir=rtl class="file-loading"><input id="input-b8" name="input-b8" multiple type="file">
</div>

JS代码:

$(document).ready( function() {
$("#input-b8").fileinput({rtl: true,uploadUrl: '/file_receive/',dropZoneEnabled: false,showPreview: false,allowedFileExtensions: ['txt'],initialPreviewConfig: []
});
});

代码说明:
fileinput()方法里面传入的是一个json数据,里面有很多个属性,每个数值代表初始化上传控件时的特性,如果没有设置的属性则按照控件的默认属性设置。简单说下里面几个属性的设置:uploadUrl:上传文件地址;dropZoneEnabled:是否显示拖曳区域;showPreview:是否显示预览区域;allowedFileExtensions:允许上传的文件格式。

后台代码

def file_receive(request):#   接收File-Input空间传送的文件if request.method == 'POST':file = request.FILES['input-b8']file_path = "static/books/"+file.namewith open(file_path,"wb") as f:for chunk in file.chunks():f.write(chunk)return JsonResponse({'status':'success'})

代码说明:
 以上是后台接收文件对象并且保存的代码。我这边省略判断上传文件大小的方法,感兴趣的可以在with open()中添加判断。最后接收文件后,会返回给前端一个json数据,前端插件接收到返回的JSON数据才会确定是否上传文件成功,bootstrap Fileinput才会先Done状态。

拓展:

 这里有点需要注意的就是,后台接收上传的文件,虽然是通过POST的方式上传,但是不能通过request.POST["filename"]或者request.POST.get("filename","None")两种方式来访问。
 而是需要用另外一种方式:
request.FILES["filename"]或者request.FILES.get("filename","None")
 接下来已经得到文件对象,需要把在内存中的文件写入到硬盘中。读取文件的几个方法和属性:

  1. filename.read():从文件读取整个上传的数据,这个方法只适合小文件
  2. filename.chunks():按块返回文件,通过for循环进行迭代,可以将大文件按块写入到服务器中
  3. filename.multiple_chunks():当filename文件大于2.5M时,该方法返回True,否则返回False。可以根据该方法来判断选择用1方法还是2方法。

4.2、异步更新已上传的文件列表

HTML代码:

<div style="padding-top: 20px"><table id="book_list" class="table table-striped table-bordered table-hover"><tr><th>上传书籍</th><th>上传时间</th><th>文件大小</th><th>操作</th></tr>{% for book in objects %}<tr><td>{{ book.name}}</td><td>{{ book.book_time }}</td><td>{{ book.book_size }}</td><td><a href="/book_read/?book_name={{ book.name }}">阅读</a><a href="/book_del/?book_name={{ book.name }}">删除</a></td></tr>{% endfor %}</table>
</div>

JS代码:

$("#input-b8").on('fileuploaded',function(){console.log('success');$.get('/book_update/',function(data){var book_html ="<tr>\n" +"<th>上传书" +"籍</th>" +"<th>上传时间</th>" +"<th>文件大小</th>" +"<th>操作</th>"+"</tr>";console.log(data);for (var i in data){book_html += "<tr><td>"+ data[i]['name']+"</td>" +"<td>"+data[i]['book_time']+"</td>" +"<td>"+data[i]['book_size']+"</td>" +"<td><a href=\"/book_read/?book_name="+data[i]['name']+"\">阅读</a>"+"<a href=\"/book_del/?book_name="+data[i]['name']+"\">删除</a></td>"+"</tr>"}$("#book_list").html(book_html)console.log(book_html)});
});

代码说明:
$("#input-b8").on('fileuploaded',function(){})这个方法时在上传完文件后进行回调事件的函数;就是指上传一个文件成功后就会调用该方法;所以我将异步更新上传文件列表的代码放在这个回调事件中。当每个文件上传后,就会请求后台,查询指定目录下的文件列表,生成json格式的数据返回前台,前台再通过遍历的形式拿到其中的数据,进行展示,具体效果如下:

基于Django+Bootstrap框架,设计微型小说网站

后台代码

def book_list():#   获取books目录下的书籍file_list = []filedir_path = "static/books/"list_file = os.listdir(filedir_path)for book in list_file:book_info = {}book_path = filedir_path + bookbook_info['name'] = bookbook_info['timestamp'] = os.path.getctime(book_path)book_info['book_time'] = time_format(book_info['timestamp'])book_info['book_size'] = os.path.getsize(book_path)file_list.append(book_info)books = sorted(file_list,key= lambda x:x['timestamp'],reverse=True)return books def time_format(timestamp):#   格式化时间戳成指定的时间time_struct = time.localtime(timestamp)time_string = time.strftime('%Y-%m-%d %H:%M',time_struct)return time_string  

代码说明:
 代码其实很简单,主要是对通过os模块获取静态目录static下的books目录下的文件列表,然后在获取每个文件的时间戳,通过列表推导式,按时间戳为key值进行逆向排序。

4.3、文章分页模块

HTML代码:

<div class="header text-center "><a href="/index/" style="float: left;"><i class="fa fa-home fa-2x" aria-hidden="true">Home</i></a><h3>{{ book_name }}</h3>
</div><div class="col-md-12 col-sm-offset-1 main">{% for content in book_content %}<span>{{ content }}</span>{% endfor %}
</div><div class="pagination"><div class="col-md-4  ">{% if book_content.has_previous  %}<i class="fa fa-arrow-left" aria-hidden="true"><a href="?book_name={{ book_name }}&page={{ book_content.previous_page_number }}">上一页</a></i>{% endif %}</div><div class="col-md-4  "><h5>第{{ book_content.number }}页/共{{ book_content.paginator.num_pages }}页</h5></div>{% if book_content.has_next %}<div class="col-md-4  "><a href="?book_name={{book_name}}&page={{ book_content.next_page_number }}">下一页</a><i class="fa fa-arrow-right" aria-hidden="true"></i></div>{% endif %}
</div>

JS代码:

def book_read(request):#   获取上传书籍的内容if request.method == 'GET':book_name = request.GET['book_name']            # 书籍名称file_path = "static/books/" + book_name         # 书籍路径with open(file_path,encoding='gbk', errors='ignore') as f:book_contents = f.readlines()paginator = Paginator(book_contents, 50)try:page = int(request.GET['page'])  # 页码book_content = paginator.page(page)except Exception as e:book_content = paginator.page(1)return render_to_response('book.html',{'book_content': book_content, 'book_name': book_name})

代码说明:
 读取文件的所有行,保存在一个列表中(list),每行作为一个元素。然后实例化一个Paginator对象,并且在实例化中传入一个需要分页的对象列表,以及一页包含多少个数据。再从接收前端传送过来的页码,取特定页码的数据,再传回前端。

基于Django+Bootstrap框架,设计微型小说网站

基于Django+Bootstrap框架,设计微型小说网站

拓展:

1、分页功能有Django内置的Paginator类提供的,该类位于django/core/paginator,需要用的地方导入即可:
from django.core.paginator improt Paginator

2、read()、readline()、readlines()方法的区别:
三者都是读取文件内容:
read([size]):从当前位置其读取size字节,如果方法里面没有参数size,读取至文件结束为止。返回的是一个字符串对象。
readline():方法调用一次就读文件一行,该方法返回一个字符串。
readlines():读取整个文件所有行,保存在一个列表中,每行作为一个元素

3、Paginator对象操作:
实例化对象:
book_list = [1,2,3,4,5,6,7,8]
book_content = Paginator(book_list,3)取特定页的数据
content = book_content.page(2)查特定页当前页码数:
content.number查分页后的总页数
content.num_pages查询某一页是否有上一页或者查询上一页页码:
content.has_previous()
content.previous_page_number()查询某一页是否有下一页或者查询下一页页码:
content.has_next()
content.next_page_number()

感兴趣的同学可以上我GitHub上,项目代码的地址:
https://github.com/libuliduobuqiuqiu/noval_test

转载于:https://blog.51cto.com/mbb97/2363772

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_768922.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站跨站点单点登录

昨天和几位朋友探讨到了这个话题&#xff0c;发现虽然单点登录&#xff0c;或者叫做独立的passport登录虽然已经有了很多实现方法&#xff0c;但是能真正了解并实现的人却并不太多&#xff0c;所以些下此文&#xff0c;希望从原理到实现&#xff0c;能让大家了解的多一些 至于什…

利用HTML5/CSS3写一个网站布局

页面视图&#xff1a; 代码查看&#xff1a; https://github.com/YanHSana/ResponsiveWesite

大型网站技术架构(三)架构核心要素

2019独角兽企业重金招聘Python工程师标准>>> 所谓架构&#xff0c;一种通俗的说法就是“最高层次的规划&#xff0c;难以改变的决定”&#xff0c;这些规划和决定奠定了事物未来发展的方向和最终的蓝图。 而软件架构即“有关软件整体结构与组件的抽象描述&#xff0…

浅谈大型网站动态应用系统架构

转自&#xff1a;http://news.cnblogs.com/n/70241/ 动态应用&#xff0c;是相对于网站静态内容而言&#xff0c;是指以c/c、php、Java、perl、.net等服务器端语言开发的网络应用软件&#xff0c;比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存…

网站推荐:Google音乐搜索引擎

Lander之前在网路上在线听或下载MP3都是通过百度的MP3搜索&#xff0c;不知道大家日常都用什么来着。使用百度音乐搜索常被一些问题困扰&#xff0c;如下载比较麻烦&#xff0c;下载的音乐质量无法保证&#xff08;其实在国内&#xff0c;几乎绝大部分网站提供的MP3都是盗版的&…

打包Asp.Net 网站成为一个exe 方便快捷的进行客户演示

在Asp时代有一个NetBox 产品可以把整个Asp网站AllInOne的打包成一个exe&#xff0c;在没有IIS的情况下可以单独运行这个exe来开启整个网站。在Asp.Net 下一直没有类似的产品出现&#xff0c;可能是IIS已经非常的强大了&#xff0c;不需要类似的产品了? 但是在某种场景下还是需…

网站日志返回304状态码

之前在seo中心里面听老师讲过一个seo者是需要去分析网站日志的。而如果你的网站还没有网站日志这个功能的话&#xff0c;那么我建议你可以去换一个空间了。因为做seo就需要有网站日志。 在哪里查网站日志呢&#xff1f;以西北互联的香港空间举例。登陆后台之后会有一个叫网站日…

在线评论html,在线评论与SEO——评论内容的重要性

所有人都知道搜索引擎喜欢高质量的原创内容&#xff0c;那么到底什么算原创、如何产出原创内容、哪些原创内容属于高质量——一直是站长们纠结的问题。最近有人向小编推荐了一篇文章&#xff0c;作者用BrightLocal产出的消息者报告数据作为依据&#xff0c;表现了在线评论内容在…

(一)新手搭建、备份、还原Sharepoint门户网站之--新建篇

1. 企业门户安装 1.1 安装前期准备 安装前先准备好以下安装程序&#xff1a;Windows Server 2003(或以上)、SQL Server 2005、.NET Framework 3.0、Office SharePoint Server 2007。 1.2 安装必要的Windows组件 首先安装好一台Windows Server 2003的服务器&#xff0c;并安装几…

学用MVC4做网站一:修改密码1.4

一、用户 1.1用户注册 1.2用户登录 1.3修改密码 1.4修改资料 在用户登陆成功后要跳转到一个页面&#xff0c;暂且叫做用户中心吧。在【UserController】添加[default] action [UserAuthorize]public ActionResult Default(){userRsy new UserRepository();var _user userRsy.…

关于大型网站技术演进的思考系列博客

2019独角兽企业重金招聘Python工程师标准>>> 出处:夏天的森林博客 关于大型网站技术演进的思考&#xff08;一&#xff09;--存储的瓶颈&#xff08;1&#xff09;关于大型网站技术演进的思考&#xff08;二&#xff09;--存储的瓶颈&#xff08;2&#xff09;关于大…

阿里云搭建自己的网站

1、下载xampp、wordpress复制到自己的服务器安装

构建httpd网站服务器(二) -- httpd服务的访问控制和基于域名、IP、端口的虚拟主机...

httpd服务访问控制概述httpd服务的访问控制作用&#xff1a;控制对网站资源的访问为特定的网站目录添加访问授权常用访问控制方式&#xff1a;客户机地址限制用户授权限制Order配置项&#xff0c;定义控制顺序先允许后拒绝&#xff0c;默认拒绝所有&#xff1a;Order allow,den…

怎样提高用户访问,提高网站页面深度浏览?

想必&#xff0c;很多的网站优化者&#xff0c;都遇到过类似的情况。访客进入到首页&#xff0c;不会进行二次的点击&#xff0c;而选择的是跳出页面。不能深度性的浏览&#xff0c;Spider会记录下。这样的现象&#xff0c;对于网站权重上的提升是负面影响的。因此。如何设计好…

使用Fail2ban来防御你的服务器和网站攻略

Fail2ban可以通过你的日志log匹配规则进而实现你想要的功能&#xff0c;比如禁止掉那些破解你密码的人。下面就讲一下在LINUX上Fail2ban的安装吧首先第一步确定你的系统进而安装&#xff1a;Centos复制代码$ sudo yum install fail2banFedora复制代码$ sudo yum install fail2b…

打造基于hadoop的网站日志分析系统:(2)Hadoop的编译

2019独角兽企业重金招聘Python工程师标准>>> 环境&#xff1a;ubuntu14.04 64位 前提&#xff0c;系统已经安装了jdk并且环境变量配置完成。 1.下载hadoop源码 wget http://mirror.esocc.com/apache/hadoop/common/hadoop-2.4.0/hadoop-2.4.0-src.tar.gz&#xff0c…

在线反汇编代码网站

https://godbolt.org/ 下面是一个在线运行汇编代码的网站 https://www.tutorialspoint.com/compile_assembly_online.php

很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天做个demo(续集)...

有些功能部分手机不能使用&#xff0c;网站&#xff0c;通讯录&#xff0c;wifi基本上每个手机都可以使用。&#xff08;浏览器自带的扫描就够了&#xff0c;QQ扫码和微信扫码部分手机不能直接连接wifi&#xff09; 在看之前你可以扫一扫下面几个二维码先看看效果&#xff1a; …

php 网站 文件寻址,如果访问存储器时使用bp寻址,则默认的段寄存器是什么?...

如果访问存储器时使用bp寻址&#xff0c;则默认的段寄存器是“SS”&#xff0c;即堆栈段。SS堆栈段通常是指采用堆栈方式工作的一段内存区域&#xff1b;在采用段式内存管理方式进行程序内存分配的架构中&#xff0c;堆栈段用来存放局部变量和函数返回地址。段寄存器是因为对内…

在IIS中配置MIME类型组建Wap网站

1&#xff0e;创建站点文件夹 首先你要在IIS上创建一个新的站点。 2&#xff0e;创建新的MIME类型 首先选择“WAP”站点的“属性”&#xff0c;然后选择“HTTP 头”标签&#xff0c;在“MIME映射”部分&#xff0c;点击“文件类型…”后再单击“新类型…”输入以下信息&#xf…