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

本是古典 何须时尚 2021-11-09 00:14 446阅读 0赞

一、静态文件与媒体文件

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

1. 在django中使用静态文件

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

2. 在django中使用媒体文件

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

二. 文件上传

1、单文件上传
  1. 文件上传要求form表单存在enctype="multipart/form-data"属性,并且提交方法是post,这是必须的!
  2. 【注意】:为了避免CSRF跨站攻击,需要在变动安
  3. <form enctype="multipart/form-data" action="/uploadFile/" method="post">
  4. <input type="file" name="myfile" />
  5. <br/>
  6. <input type="submit" value="upload"/>
  7. </form>
  8. 举个例子:实现最简单的文件上传
  9. def file_upload(request):
  10. if request.method == 'POST':
  11. # 获取上传的文件,如果没有文件,则默认为None
  12. myFile = request.FILES.get('myfile', None)
  13. if not myFile:
  14. return HttpResponse("no files for upload")
  15. # 拼接文件路径
  16. file_path = os.path.join(settings.MEDIA_ROOT, '1.jpg')
  17. # 上传到服务器
  18. with open(file_path, 'ab') as fp:
  19. for part in myFile.chunks(): # 利用chunks()将文件拆分开上传
  20. fp.write(part)
  21. fp.flush() # 刷个新
  22. # 上传到数据库 前提是要有一组1:N的表,
  23. file = File() # 创建一个数据库对象
  24. file.user = User.objects.filter(id=1).first() # 将User表中id=1的对象关联到File表中
  25. file.filePath = 'upload/' + file_path # 将文件保存到upload静态文件下
  26. file.save() # 保存
  27. return HttpResponse("上传成功!")
  28. else:
  29. return render(request, 'index.html')
2、多文件上传
  1. 多文件上传和单文件上传类似:
  2. 1.需要在模板文件的form表单input中添加multiple
  3. 2.后台获取时使用request.FILES.getlist('myfile', None) ,才可以获取到上传的多个文件
  4. def file_upload2(request):
  5. if request.method == 'POST':
  6. # 获取上传的文件,如果没有文件,则默认为None
  7. myFiles = request.FILES.getlist('myfile', None)
  8. # for循环将每个文件上传到服务器和数据库中
  9. for myFile in myFiles:
  10. if not myFile:
  11. return HttpResponse("no files for upload")
  12. file_path = os.path.join(settings.MEDIA_ROOT, myFile.name)
  13. with open(file_path, 'ab') as fp:
  14. for part in myFile.chunks():
  15. fp.write(part)
  16. # 上传多个文件 需要一组1:N的表,
  17. file = File() # 创建一个数据库对象
  18. file.user = User.objects.filter(id=1).first() # 将User表中id=1的对象关联到File表中
  19. file.filePath = 'upload/' + file_path # 将文件保存到upload静态文件下
  20. file.save() # 保存
  21. return HttpResponse("上传成功!")
  22. else:
  23. return render(request, 'index.html')

三.分页

  1. django提供了分页的工具,存在于django.core
  2. Paginator : 数据分页工具
  3. Page : 具体的某一页面
  4. 导入Paginator
  5. from django.core.paginator import Paginator
  6. Paginator:
  7. 对象创建:
  8. Paginator(数据集,每一页数据数)
  9. 属性:
  10. count:对象总数
  11. num_pages:页面总数
  12. page_range: 页码列表,从1开始
  13. 方法:
  14. page(整数): 获得一个page对象
  15. 常见错误:
  16. InvalidPagepage()传递无效页码
  17. PageNotAnIntegerpage()传递的不是整数
  18. Emptypage()传递的值有效,但是没有数据
  19. Page:
  20. 对象获得,通过Paginatorpage()方法获得
  21. 属性:
  22. object_list 当前页面上所有的数据对象
  23. number 当前页的页码值
  24. paginator: 当前page关联的Paginator对象
  25. 方法:
  26. has_next() :判断是否有下一页
  27. has_previous():判断是否有上一页
  28. has_other_pages():判断是否有上一页或下一页
  29. next_page_number():返回下一页的页码
  30. previous_page_number():返回上一页的页码
  31. len():返回当前页的数据的个数

四. 中间件&AOP

  1. 中间件:是一个轻量级的,底层的插件,可以介入Django的请求和响应过程(面向切面编程)
  2. Django中间件的本质就是一个python
  3. 面向切面编程(Aspect Oriented Programming)简称AOPAOP的主要实现目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合的隔离效果。
  4. 中间件可实现功能
  5. - 统计
  6. - 黑名单
  7. - 白名单
  8. - 反爬
  9. - 界面友好化(捕获异常)

1 中间件的可切入点

在这里插入图片描述

2 切入函数

  1. __init__:
  2. 没有参数,服务器响应第一个请求的时候自动调用,用户确定是否启用该中间件
  3. process_request(self,request):
  4. 在执行视图前被调用,每个请求上都会调用,不主动进行返回或返回HttpResponse对象
  5. process_view(self,request,view_func,view_args,view_kwargs):
  6. 调用视图之前执行,每个请求都会调用,不主动进行返回或返回HttpResponse对象
  7. process_response(self,request,response):
  8. 所有响应返回浏览器之前调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象
  9. process_exception(self,request,exception):
  10. 当视图抛出异常时调用,不主动进行返回或返回HttpResponse对象

3 自定义中间件

  1. 自定义中间件流程
  2. 1.在工程目录下创建middleware目录
  3. 2.目录中创建一个python文件
  4. 3.python文件中导入中间件的基类
  5. from django.utils.deprecation import MiddlewareMixin
  6. 4.在类中根据功能需求,创建切入需求类,重写切入点方法
  7. class LearnAOP(MiddlewareMixin):
  8. def process_request(self,request):
  9. print('request的路径',request.GET.path)
  10. 5.启用中间件,在settings中进行配置,MIDDLEWARE中添加middleware.文件名.类名

发表评论

表情:
评论列表 (有 0 条评论,446人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Django 文件

    在django开发网页中经常会遇到需要将本地的文件上传到服务器,这里我们就需要通过post请求将数据推送到服务器上去 1 ,定义视图 def upLoadP

    相关 django文件

    一、静态资源配置 什么是静态资源:css、js、images 需要从外部导入的资源 1.1创建static文件夹(通常放在根目录下) 1.2需要在setting