记Django开发中的一些常用代码段
记得之前有分享过Django开发相关的系列文章(可在博客右上方自行搜索),内容包括模版、视图、路由等。那么本篇再补充一些Django开发过程中常用到的一些功能代码块,内容涉及前端、后端相关功能代码。这些代码块都是平常开发中常用的,因此在此做个备份,方便查询。
前端功能
搞安全的还需要会前端?当然啊,搞安全的也需要出产品,出产品了没前端不就显得很low吗?不过自己写前端太累了,因此还得用框架,这里推荐<a href=”http://v3.bootcss.com/” target=”_blank”>Bootstrap</a>。在尝试使用文章下方介绍的前端代码前,先在代码中添加上Bootstrap框架提供给的css、js连接。
面板折叠
这个功能经常在侧边菜单栏中用到,面板折叠可有效的保持界面整洁。
<div class="panel panel-success"> <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" href="#collapse"> <h1 class="panel-title"><span class="glyphicon glyphicon-tag" aria-hidden="true"></span>Index</h1> </div> <div id="collapse" class="panel-collapse collapse out"> # out or in 控制折叠状态 <div class="panel-body"> <a href="">index1</a><br><br> <a href="">index2</a><br><br> </div> </div> </div>
表格分页
表格分页前端比较简单,想要实现真正的分页显示数据,需要结合后端代码,文章后面会介绍。
<ul class="pagination pagination-lg"> <li><a href="/index/?page=0">«</a></li> {% for i in page_list %} <li><a href="/index/?page={{ i }}">{{ i }}</a></li> {% endfor %} <li><a href="/index/?page={{ last_page }}">»</a></li> </ul>
弹出框(可编辑)
有些时候需要修改一些表格数据,之前的做法是点击一个按钮,跳转到一个修改的页面,但这种做法不够优雅,因此可以选择点击按钮弹出一个可编辑的对话框。
<form action="/index/" method="POST"> <div class="modal fade" id="update" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true"> × </button> <h4 class="modal-title" id="myModalLabel"> 提醒框 </h4> </div> <div class="modal-body"> <label>KEY</label> <input type="text" class="form-control" name="new_key" value="{{i.key_}}"> <label>VALUES</label> <input type="text" class="form-control" name="new_value" value="{{i.value_}}"> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">关闭 </button> <button type="submit" name="update_id" value="{{i.id}}" class="btn btn-primary"> 确定修改 </button> </div> </div> </div> </div> <input type="button" data-toggle="modal" data-target="#update" class="btn btn-info" value="修改"> </form>
搜索框自动补全
这个就厉害啦,当搜索一些资源的时候,如果能自动补全是不是会方便很多呢?
<label for="autocomplete">选择扫描插件(必选)</label><br> <input class="form-control" id="autocomplete" name="vul_name" placeholder="输入漏洞名称"><br><br> <script type="text/javascript"> var tags = {{ plugin_list|safe }}; # 注plugin_list $( "#autocomplete" ).autocomplete({ source: tags }); </script>
ajax请求
用ajax发送请求有好有坏,具体用法可参考:https://thief.one/2017/09/14/3/
界面面板布局
这个纯粹为了装逼。
<div class="container"> <div class="row"> ####### 面板 ########## <div class="col-md-3"> <div class="list-group"> <form class="list-group-item"> <a href="">test</a> </form> </div> </div> ####### 面板 ########## <div class="col-md-3"> <div class="list-group"> <form class="list-group-item"> <a href="">test2</a> </form> </div> </div> </div> </div>
后端功能
表格分页
前面介绍了前端的分页,那么后端怎么写分页的功能呢?django框架有内置的分页模块Paginator,其他框架也有,比如flask等。
from django.core.paginator import Paginator def page_ye(objects,page,num=10): '''分页函数 @num:每页显示多少条数据 @page:当前页码 @ye_num:分页栏显示的数字数量 return: @object_list:该页显示的数据对象 @page_range:分页栏显示的数字范围 @last_page:最后一页的数字 ''' ye_num=6 ye_num_av=ye_num/2 try: page=int(page) except: page=1 if page<1: page=1 range_first_page=page-ye_num_av range_last_page=page+ye_num_av if range_first_page<0: range_first_page=0 range_last_page=ye_num p = Paginator(objects, num) page_range=list(p.page_range)[range_first_page:range_last_page] last_page=len(p.page_range) if page>last_page: page=1 page1 = p.page(page) object_list=page1.object_list return object_list,page_range,last_page
但个人使用以后发现性能不好,因为每次请求页面需要先获取所有的数据,再通过此模块计算出此页面需要展示的数据,当所有的数据量比较大时,返回就比较慢了(也可能是我没用对这个模块)。因此,我自己写了一个分页的模块。
def ye(all_num,page,num,page_list_num): '''分页计算 @all_num:数据库记录总量 @page:当前页码 @num:每一页显示的记录条数 @page_list_num:分页导航显示多少个数字,要为偶数 @page_list_aver:page_list_num除以2 return: @page:显示第几页 @last_page:最后一页的数字 @page_list:分页栏显示的数字范围 ''' page=int(page) if all_num!=0: last_page = all_num/num-1 if all_num%num == 0 else all_num/num #计算最后一页数字 else: last_page=0 page_list_aver=page_list_num/2 page=last_page if page > last_page else page #判断请求的页数是否超过范围 if page > page_list_aver: if last_page > page+page_list_aver: page_list=range(page - page_list_aver , page + page_list_aver) else: page_list=range(last_page - (page_list_num-1), last_page + 1) else: if last_page > page_list_num: page_list = range(page_list_num) else: page_list = range(last_page + 1) return page,last_page,page_list
这样不需要提前先查询出所有的数据存入内存,而只需要查询出总共存在多少条数据(注意,这里的查询语句由select * 改为select count(*)会快很多)。获取到分页函数返回的page后,可以结合sql语句中的limit功能,查询分页要展示的数据内容。
select * from test limit page*num,num # page为分页返回的显示页码,num是一页显示的数据数量
session做身份认证
这个功能就是用来验证用户身份的,可配合登录功能,写一个装饰器函数,检查全局是否存在session值。(session值是一个字典格式,在用户登录时生成)
def session_check(level=2,return_=False): '''session_check装饰器函数 针对函数 @level:可以给用户区分权限 @return_:检测到不存在session后跳转到不同的页面 ''' def dec(func): def warp(request,*args,**kwargs): if request.session.get('user_id',False) and int(request.session.get('level'))<=level: return func(request,*args,**kwargs) elif return_: return HttpResponse('<head><meta http-equiv="refresh" content="0.0001;url=/login/"></head>') else: return HttpResponse('<head><meta http-equiv="refresh" content="0.0001;url=/error/"></head>') return warp return dec
使用的话,直接在需要权限控制的函数上添加:
@session_check(return_=True) def vul_index(request): ''' 漏洞扫描 ''' pass
暂时就想到了这些,先记这么多吧,等以后遇上了再补充一些,o了
相关推荐
-
Django-路由控制 web开发
2019-9-7
-
Django Web应用部署篇 web开发
2019-2-22
-
django之分页 web开发
2019-5-16
-
SQLAlchemy入门和进阶 web开发
2019-2-22
-
实时 Django 终于来了 —— Django Channels 入门指南 web开发
2018-2-11
-
Django如何支持网站多语言切换? web开发
2019-8-29
-
源码解析flask的路由系统 web开发
2019-5-27
-
Django之Django简介,开发环境搭建,项目应用创建 web开发
2019-9-11
-
Django开发密码管理表实例【附源码】 web开发
2019-6-8
-
django 入门学习规划与资料推荐 web开发
2019-4-27