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对象,使用render
process_response(self,request,response) 所有响应返回浏览器之前调用,每个请求都会调用,返回 HttpResponse对象
process_exception(self,request,exception) 当视图跑出异常时调用,返回HttpResponse对象
自定义中间件
1.在工程目录下middleware目录下创建myApp目录
2.创建一个python文件
from django.utils.deprecation import MiddlewareMixin
class 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 os
from django.conf import settings
def 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 Students
from django.core.paginator import Paginator
def 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 JsonResponse
def 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 HTMLField
class Text(models.Model):
str = HTMLField()
配置站点
from .models import Text
admin.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