静态资源:
在settings.py中最底下有一个叫做static的文件夹,主要用来加载一些模板中用到的资源,提供给全局使用
这个静态文件主要用来配置CSS,HTML,图片,字体文件等
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
之后在模板中,首先加载静态文件,之后调用静态,就不用写绝对全路径了模板中的声明
{% load static %} 或 {% load staticfiles %}在引用资源的时候使用
{% static 'xxx' %} xxx 就是相对于staticfiles_dirs的一个位置
中间件:
是一个轻量级的,底层的插件,可以介入Django的请求和相应过程(面向切面编程)
中间件的本质就是一个python类
面向切面编程(Aspect Oriented Programming)简称AOP。AOP的主要实现目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合的隔离效果。
中间件方法:
__init__:没有参数,服务器响应第一个请求的时候自动调用,用户确定是否启用该中间件
process_request(self,request):在执行视图前被调用,每个请求上都会调用,不主动进行返回或返回HttpResponse对象
process_view(self,request,view_func,view_args,view_kwargs):调用视图之前执行,每个请求都会调用,不主动进行返回或返回HttpResponse对象
process_template_response(self,request,response):在视图刚好执行完后进行调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象
process_response(self,request,response):所有响应返回浏览器之前调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象process_exception(self,request,exception):当视图抛出异常时调用,不主动进行返回或返回HttpResponse对象
自定义中间件:
流程:
1. 在工程目录下创建middleware目录
2. 目录中创建一个python文件
3. 在python文件中导入中间件的基类
from django.utils.deprecation import MiddlewareMixin
4. 在类中根据功能需求,创建切入需求类,重写切入点方法
class LearnAOP(MiddlewareMixin):
def process_request(self,request):
print('request的路径',request.GET.path)
5. 启用中间件,在settings中进行配置,MIDDLEWARE中添加
middleware.文件名.类名
文件上传:
文件数据存储在request.FILES属性中
form表单上传文件需要添加enctype='multipart/form-data'
文件上传必须使用POST请求方式
存储
在static文件夹下创建uploadefiles用与存储接收上传的文件
在settings中配置,MEDIA_ROOT=os.path.join(BASE_DIR,r'static/uploadefiles')
在开发中通常是存储的时候,我们要存储到关联用户的表中
上传示例:1 <form method='post' action='xxx' enctype='multipart/form-data'> 2 {% csrf_token %} 3 <input type='file' name='icon'> 4 <input type='submit' value='上传'> 5 <form> 6 7 def savefIcon(request): 8 if request.method == 'POST' 9 f = request.FILES['icon'] 10 filePath = os.path.join(settings.MEDIA_ROOT,f.name) 11 with open(filePath,'wb) as fp: 12 for part in f.chunks(): 13 fp.write(part)
分页工具:
django提供了分页的工具,在django.core中
Paginator:数据分页工具
Page:具体的某一页面
Paginator:
对象创建:Paginator(数据集,每一页数据数)
属性:
count对象总数
num_pages:页面总数
page_range: 页码列表,从1开始方法:page(整数);获得一个page对象
常见错误:
InvalidPage:page()传递无效页码
PageNotAnInteger:page()传递的不是整数
Empty:page()传递的值有效,但是没有数据
Page:
通过Paginator的page()方法获得
属性:
object_list:当前页面上所有的数据对象
number:当前页的页码值
paginator:当前page关联的Paginator对象方法:
has_next():判断是否有下一页
has_previous():判断是否有上一页
has_other_pages():判断是否有上一页或下一页
next_page_number():返回下一页的页码
previous_page_number():返回上一页的页码
len():返回当前页的数据的个数