一、静态文件
- 配置settings.py
STATIC_URL='/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
- 使用
#加载静态文件
{% load static %}
#链接到静态文件
<img src="{% static 'elema/img/1.jpeg' %}">
二、中间件
- 应用场景
本质: 就是一个python类
应用场景: 统计、黑名单、白名单、反爬...
- 中间件方法
- __init__
不需要传参,服务器响应第一个请求的时,会自动调用,用于确定是否启用中间件
- process_request(self,request)
在视图执行前调用(即分配url匹配视图之前),每个请求都会调用,返回None或HttpResponse对象
- process_view(self,request,view_func,view_args,view_kwargs)
调用视图之前执行,每个请求都会调用,返回None或HttpResponse对象
- process_templae_response(self,request,response)
在视图刚好执行完后调用,每个请求都会调用,返回None或HttpResponse对象
- process_response(self,request,response)
所有响应返回浏览器之前调用,每个请求都会调用,返回None或HttpResponse对象
- process_exception(self,request,exception)
当视图出现异常时调用,返回HttpResponse对象
备注: 为什么会返回HttpRespons对象?因为在请求进来后如果有问题,就可以不做后续处理,直接给客户端响应。
-
方法执行顺序
- 自定义中间件并使用
在工程目录下middleware目录下创建应用目录
- 在middleware/elema中创建一个elemamiddleware.py
from django.utils.deprecation import MiddlewareMixin
class MyMiddle(MiddlewareMixin):
# 在视图执行前调用
def process_request(self,reqeust):
print('get请求,参数name: ', reqeust.GET.get('name'))
- 配置settings.py文件(即在MIDDLEWARE中添加上述文件的位置)
'middleware.elema.elemamiddleware.MyMiddle'
- 中间件(黑名单拦截)
# 拦截器,拦截他黑名单中的IP
class MyMiddle(MiddlewareMixin):
def process_request(self, request):
if request.META['REMOTE_ADDR'] in getattr(settings, 'BLOCKED_IPS', []):
return HttpResponse('<h1>Forbidden</h1>')
# settings.py中
BLOCKED_IPS = [ # IP黑名单 '192.168.0.100' ]
- 中间件(未登陆处理)
class MyMiddle(MiddlewareMixin):
def process_request(self, request):
# request.META['REMOTE_ADDR'] 请求的IP地址
if request.path !='/meituan/login/': # 检测如果不是登录的话
if "username" in request.COOKIES: # 已经登录不做任何处理
pass
else: # 未登录,重定向到登录页面
return HttpResponseRedirect('/meituan/login/')
三、文件上传
- 注意
- 文件上传时,文件数据存储在request.FILES属性中
- form表单要上传文件需要加 enctype="multipart/form-data"
- 上传文件必须是post请求
- 存储路径
- 在static目录下创建upfile目录用于存储接受上传的文件
- 配置settings.py文件
MDEIA_ROOT = os.path.join(BASE_DIR,'static/upfile')
- 文件内容
# 获取表单上传的文件内容
file = request.FILES['file']
#设置上传文件的保存路径
filePath = os.path.join(settings.MDEIA_ROOT,file.name)
#文件写入后台
with open(filepath,'wb') as fp:
四、分页
- Paginator(列表,每页个数)
#属性
- .count:对象总页数
- .num_pages: 页面总数
- .page_range: 页码列表(页码从1开始)
- page(num):是Paginator的方法
#属性
- .object_list:当前页面上所有的数据(对象)列表
- .number:当前页的页码值
- .paginator:当前page对象关联的paginator对象
#方法
- .has_next():判断是否有下一页,如果有返回Ture
- .has_previous:判断是否有上一页,如果有返回Ture
- .has_other_pages():判断是否有上一页或下一页,如果有返回Ture
- .next_page_number(): 返回下一页的页码,如果下一页不存在抛出InvalidPage异常
- .previous_page_number(): 返回上一页的页码,如果上一页不存在抛出InvalidPage异常
- .len():返回当前页数据的个数
- 实例
# 所有商品数据
alllist = Goods.objects.all()
#切片处理
alllist = Goods.objects.all()[0:5]
# 12条数据为一页,划分总页数
# 分页对象
paginator = Paginator(list(alllist),12)
# 根据传入的页码得到Page对象
pageobj = paginator.page(page)
# 当前页的所有数据列表(遍历获取)
pageodj_list = pageobj.object_list
for goods in pageobj_list