Django-静态、媒体文件,文件上传,分页和中间件

一、静态文件与媒体文件

媒体文件:用户上传的文件,叫做media
静态文件:存放在服务器上的js,css,image等文件,叫做静态文件

1. 在django中使用静态文件
	1)首先确保django.contrib.staticfiles在 INSTALLED_APPS中
	2)在settings中定义 STATIC_URL
		STATIC_URL = '/static/'
	3)在你app的static目录中存放静态文件,比如:
		my_app/static/my_app/example.jpg.
	4)如果使用APP以外的静态文件,通常是直接放在项目中的static文件,就需要settings中设置路径。
        STATICFILES_DIRS = [
            os.path.join(BASE_DIR, "static"),
            ...
        ]
    5)在模板中使用load标签去加载静态文件
		{% load static %}   # 加载静态文件
		<img src="{% static "my_app/example.jpg" %}" />  # 导入静态文件

2. 在django中使用媒体文件

	在settings中配置 MEDIA_ROOT
		MEDIA_ROOT = os.path.join(BASE_DIR, "media")

二. 文件上传

1、单文件上传
文件上传要求form表单存在enctype="multipart/form-data"属性,并且提交方法是post,这是必须的!
【注意】:为了避免CSRF跨站攻击,需要在变动安
	<form enctype="multipart/form-data" action="/uploadFile/" method="post"> 
	   <input type="file" name="myfile" />  
	   <br/>  
	   <input type="submit" value="upload"/>  
	</form>
    
举个例子:实现最简单的文件上传
	def file_upload(request):
        if request.method == 'POST':
            # 获取上传的文件,如果没有文件,则默认为None
            myFile = request.FILES.get('myfile', None)
            if not myFile:
                return HttpResponse("no files for upload")
			# 拼接文件路径
            file_path = os.path.join(settings.MEDIA_ROOT, '1.jpg')
            # 上传到服务器
            with open(file_path, 'ab') as fp:
                for part in myFile.chunks():  # 利用chunks()将文件拆分开上传
                    fp.write(part)
                    fp.flush()               # 刷个新	
            # 上传到数据库  前提是要有一组1:N的表,
            file = File()  # 创建一个数据库对象
            file.user = User.objects.filter(id=1).first()  # 将User表中id=1的对象关联到File表中
            file.filePath = 'upload/' + file_path   # 将文件保存到upload静态文件下
            file.save()  # 保存
             
           return HttpResponse("上传成功!")

       else:
           return render(request, 'index.html')
2、多文件上传
多文件上传和单文件上传类似:
		1.需要在模板文件的form表单input中添加multiple
		2.后台获取时使用request.FILES.getlist('myfile', None) ,才可以获取到上传的多个文件

def file_upload2(request):
    if request.method == 'POST':
        # 获取上传的文件,如果没有文件,则默认为None
        myFiles = request.FILES.getlist('myfile', None)
        
        # for循环将每个文件上传到服务器和数据库中
        for myFile in myFiles:
            if not myFile:
                return HttpResponse("no files for upload")
    
            file_path = os.path.join(settings.MEDIA_ROOT, myFile.name)
            with open(file_path, 'ab') as fp:
                for part in myFile.chunks():
                    fp.write(part)
            # 上传多个文件  需要一组1:N的表,
            file = File()  # 创建一个数据库对象
            file.user = User.objects.filter(id=1).first()  # 将User表中id=1的对象关联到File表中
            file.filePath = 'upload/' + file_path   # 将文件保存到upload静态文件下
            file.save()  # 保存       
        return HttpResponse("上传成功!")

    else:
        return render(request, 'index.html')

三.分页

django提供了分页的工具,存在于django.core中	
	Paginator : 数据分页工具
	Page	: 具体的某一页面

导入Paginator: 	
	from django.core.paginator import Paginator

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():返回当前页的数据的个数

四. 中间件&AOP

中间件:是一个轻量级的,底层的插件,可以介入Django的请求和响应过程(面向切面编程)

Django中间件的本质就是一个python类

面向切面编程(Aspect Oriented Programming)简称AOP。AOP的主要实现目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合的隔离效果。

中间件可实现功能
   - 统计
   - 黑名单
   - 白名单 
   - 反爬
   - 界面友好化(捕获异常)
1 中间件的可切入点

在这里插入图片描述

2 切入函数
__init__:
    没有参数,服务器响应第一个请求的时候自动调用,用户确定是否启用该中间件
process_request(self,request):
    在执行视图前被调用,每个请求上都会调用,不主动进行返回或返回HttpResponse对象
process_view(self,request,view_func,view_args,view_kwargs):
	调用视图之前执行,每个请求都会调用,不主动进行返回或返回HttpResponse对象
process_response(self,request,response):
    所有响应返回浏览器之前调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象
process_exception(self,request,exception):
    当视图抛出异常时调用,不主动进行返回或返回HttpResponse对象
3 自定义中间件
自定义中间件流程
	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.文件名.类名
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值