Django高级拓展
来源:互联网 发布:Ubuntu 安装c 编译器 编辑:程序博客网 时间:2024/06/14 07:17
Django高级拓展
静态文件
1.css、js、图片、json文件、字体文件等
STATIC_URL = '/static/'STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static')]
2.配置settings.py
{% load static from staticfiles %}<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>首页</title> <link rel="stylesheet" type="text/css" href="{% static 'myApp/css/style.css' %}"/> <script type="text/javascript" src="/static/myApp/js/jquery-3.1.1.min.js"></script> <script type="text/javascript" src="/static/myApp/js/sunck.js"></script></head><body> <h1>sunck is a good man</h1> <img src="/static/myApp/img/2.png"/> <img src="{% static 'myApp/img/2.png' %}"/></body></html>
中间件
1.概述:一个轻量级、底层的插件,可以介入Django的请求和响应
2.本质:就是python类
3.方法:
init init其实就是创建的意思不需要传参数,服务器响应第一个请求的时候自动调用,调用一次,用于确定是否启 用该中间件process_request(self,request)在执行视图之前被调用(分配url视图之前),每个请求上都会调用,返回None或者 HttpResponse对象process_view(self,request,view_func,view_args,view_kwargs) 调用视图之前执行,每个请求都会调用,返 回None或者HttpResponse对象process_template_response(self,request,response) 在视图刚好执行完后调用,每个请求都会调用,返回None 或者HttpResponse对象,使用renderprocess_response(self,request,response) 所有响应返回浏览器之前调用,每个请求都会调用,返回 HttpResponse对象process_exception(self,request,exception) 当视图跑出异常时调用,返回HttpResponse对象
自定义中间件
1.在工程目录下middleware目录下创建myApp目录
2.创建一个python文件
from django.utils.deprecation import MiddlewareMixinclass MyMiddle(MiddlewareMixin): def process_request(self, request): print("get参数为:", request.GET.get("a"))
3使用自定义中间件:配置setting.py文件 ,在MIDDEWARE中添加’middleware.myApp.myMiddle.MyMiddle’
4.注意:使用中间件,可以干扰整个处理过程,每次请求都会执行中间件的这个方法
上传照片
1.概述:文件上传时,文件数据存储在request.FILES属性中,
注意:form表单上要上传文件需要加enctype=”multipart/form-data”
注意:上传文件必须是post请求
2.存储路径:在static目录下创建upfile目录用于存储接收上传文件
配置setting.py文件 MDEIA_ROOT=os.path.join(BASE_DIR,r'static\upfile')
代码示例
<body> <form method="post" action="/savefile/" enctype="multipart/form-data"> {%csrf_token%} <input type="file" name="file"/> <input type="submit" value="上传"/> </form>def upfile(request): return render(request, 'myApp/upfile.html')import osfrom django.conf import settingsdef savefile(request): if request.method == "POST": f = request.FILES["file"] # 文件在服务器端的路径 filePath = os.path.join(settings.MDEIA_ROOT, f.name) with open(filePath, 'wb') as fp: for info in f.chunks(): fp.write(info) return HttpResponse("上传成功") else: return HttpResponse("上传失败")
Paginator对象
1,创建对象 格式:Paginator(列表,整数0)
返回值:返回的分页对象
2.属性:count 对象总数
num_pages 页面总数 page_range :页面代码 ,{1,2,3,4,5} ,页面从1开始
3.方法:page(num) 获得一个Page对象,如果提供的页码不存在会抛出“InvalidPage”异常
4.异常:InvalidPage 当向page()传递的是一个无效的页码时抛出
PageNotAnlnteger 当向page()传递的不是一个整数时抛出 EmptyPage 当向page()传递一个有效值,但是该页面没有数据时抛出
Page对象
1.创建对象:Paginator对象的page()方法返回得到Page对象,不需要手动创建
2.属性:object_list 当前页上所有数据(对象)列表
number 当前页的页码值 paginator 当前page对象关联的paginator对象
3.方法
Paginator对象与Page对象的关系
url(r'^studentpage/(\d+)/$', views.studentpage),from .models import Studentsfrom django.core.paginator import Paginatordef studentpage(request, pageid): # 所有学生列表 allList = Students.objects.all() paginator = Paginator(allList,6) page = paginator.page(pageid) return render(request,'myApp/studentpage.html',{"students":page})
代码示例
<body> <ul> {% for stu in students %} <li> {{stu.sname}}-{{stu.sgrade}} </li> {% endfor %} </ul> <ul> {% for index in students.paginator.page_range %} {% if index == students.number %} <li> {{index}} </li> {% else %} <li> <a href="/studentpage/{{index}}/">{{index}}</a> </li> {% endif %} {% endfor %} </ul></body>
ajax
需要动态生成,请求JSONS数据
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript" src="/static/myApp/js/jquery-3.1.1.min.js"></script></head><body> <h1>学生信息列表</h1> <button id="btn">显示学生信息</button> <script type="text/javascript" src="/static/myApp/js/sunck.js"></script></body></html>
浮动主题
$(document).ready(function (){ document.getElementById("btn").onclick = function(){ $.ajax({ type:"get", url:"/studentsinfo/", dataType:"json", success:function(data, status){ console.log(data) var d = data["data"] for(var i = 0; i < d.length;i++){ document.write('<p>'+d[i][0]+'</p>') } } }) }})def ajaxstudents(request): return render(request, 'myApp/ajaxstudents.html')from django.http import JsonResponsedef studentsinfo(request): stus = Students.objects.all() list = [] for stu in stus: list.append([stu.sname, stu.sage]) return JsonResponse({"data":list})
富文本
1.pip install django-tinymce
2.在站点中使用:配置setting.py INSTALLED_APPS添加
子主题TINYMCE_DEFAULT_CONFIG = { 'theme':'advanced', 'width':600, 'height':400,}
创建一个类模型
from tinymce.models import HTMLFieldclass Text(models.Model): str = HTMLField()
配置站点
from .models import Textadmin.site.register(Text)
在自定义视图中使用
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>富文本</title> <script type="text/javascript" src="/static/tiny_mce/tiny_mce.js"></script> <script type="text/javascript"> tinyMCE.init({ 'mode':'textareas', 'theme':'advanced', 'width':800, 'height':600, }) </script></head><body> <form action="/saveedit/" method="post"> <textarea name="str">sunck is a good man</textarea> <input type="submit" value="提交"/> </form></body></html>
celery
1.http://docs.jinkan.org/docs/celery/
2.问题:用户发起request,并且要等待response返回。但是在视图中有一些耗时的操作,导致用户可能会等待很 长时间才能接受response,这样用户体验很差
,网站每隔一段时间要同步一次数据,但是http请求是需要触发的
3.解决:用celery来解决:将耗时的操作放到celery中执行
4.celery :用的redis数据库
1.任务task:本质是一个python函数,将耗时操作封装成一个函数 2.队列quene :将要执行的任务放到队列里 3.工人worker :负责执行中的任务 4.代理broker:负责调度,在部署环境中使用redis
- Django高级拓展
- 拓展django后台
- Django学习10:Django高级
- django--高级视图
- django模型高级操作
- django-5-高级
- MyBatis分页的拓展--合并高级查询
- Django的高级url配置
- Django中的Python高级特性
- django中模板高级用法
- Android 高级编程读书笔记 视图View定制与拓展
- [Django高级]理解django中的中间件机制和执行顺序
- Django 模型高级部分及聚集查询
- 【django 学习笔记】08-模板高级进阶
- 【django 学习笔记】09-数据模型高级进阶
- django 高级视图和URL配置
- Django高级视图和URL配置
- 【django 学习笔记】07-高级视图和URL配置
- TF-IDF
- MQ消息架构设计二(消息总线能否实现消息必达?)
- ORACLE数据库增加表空间大小或给表空间增加数据文件
- Vue自定义全局组件(插件)
- vue.js的路由地址会以#号分隔,去掉
- Django高级拓展
- jsp页面include别的页面到当前页面中,如何取外层的body
- adb
- leetcode 237. Delete Node in a Linked List
- MQ消息架构设计三(消息总线真的能保证幂等?)
- [问题记录] win7 32位 使用Android studio 新建工程后遇到的几个小问题
- 12选择好特征
- RxJava 从入门到放弃再到不离不弃
- 用SpannableString打造绚丽多彩的文本显示效果