视图(二)
参考资料:
1、内置视图:https://docs.djangoproject.com/zh-hans/2.0/ref/views/
2、文件上传:https://docs.djangoproject.com/zh-hans/2.0/topics/http/file-uploads/
3、生成csv文件:https://docs.djangoproject.com/zh-hans/2.0/howto/outputting-csv/
4、生成pdf文件:https://docs.djangoproject.com/zh-hans/2.0/howto/outputting-pdf/
1、内置视图
1、在开发环境中提供文件
from django.conf import settings
from django.urls import re_path
from django.views.static import serve
if settings.DEBUG:
urlpatterns += [re_path(r'^media/(?P<path>.*)$', serve,
{'document_rot': settings.MEDIA_ROOT})]这个视图的使用方式我确实不知道
2、错误视图
404(page not found) view
当出现Http404异常时,django会调用
视图,以及404.html模板。默认的视图会传两个参数变量到模板,分别是:request_path,exception。这个视图有几个需要注意的点,
1:如果django在URLconf中找不到一个匹配时会被调用
2:视图中可以传递一个RequestContext变量
3、如果DEBUG设置为True,那这个视图永远不会被调用,而URLconf会被播放演示出来,并附带一些debug信息
500(server error) view
在运行过程中,django可能也会报错,这时django默认会调用django.views.defaults.server_error视图,然后简单地生成一个“Server Error”的信息,或者如果你在模板目录下创建了505.html时,他也会使用这个这个模板。
默认的500视图不会传任何参数到500.html模板中,用空Context渲染以减少错误的可能。如果DEBUG被设置为True,500视图永远不会被调用,而是会赝势traceback的信息,并有一些debug的信息。
403(HTTP forbidden) view
基本上与前面的类似,这个视图是被PermissionDenied异常触发的,当然也可以人为触发
400(bad request) view
当SuspiciousOperation在django中被触发时,django中的一个组件可能会处理,但是如果这个组件没有处理的话,就会把这个请求作为“错误请求”而不是服务器错误。
django.views.defaults.bad_request跟500的服务器错误很相似,但返回的代码是400,表示错误的条件是异常客户端操作的结果。
bad_request当DEBUG为True也不会被调用。
2、文件上传
1、基础的文件上传
django处理文件上传的时候,文件最终会在request.FILES中
处理这个表单的视图将通过request.FILE获取到文件数据,而request.FILES是一个字典,每一个键对应一个FileField或者ImageField或者FileField子类,所以上面的表格的数据可以这样获得request.FILES['file']
请注意,只有请求的方法是POST的时候,并且<form>有enctype="multipart/form-data"的属性时才可以被获取到,否则,是空的。
一个处理file的示例
不要直接读(read()),而是使用chunks()来确保过大的文件不会溢出内存。
2、用模型处理上传文件
如果你想要用一个模型和FileField来保存文件,使用ModelForm会让过程更加轻松。
如果你想要手动编写一个模型,那你可以这样
对了,保存的时候可以调用‘upload_to’字段,指定保存的路径。
3、上传多个文件
使用表格字段(form field)的方式来上传多个文件,需要设置
然后覆盖FormView子类的post方法来处理多个文件上传
4、上传文件的处理器
当一个文件被上传的时候,django会把文件数据传递给文件处理器,一个小的类来处理上传的文件数据。这个处理器的定义设置在
这里可以自定义很多行为。
在文件被保存的之前,这些数据需要被存储在某个地方
默认的情况,如果文件小于2.5M,django会把它放在缓存中。这样保存文件的过程中,就只会涉及到一个内存读取和硬盘写入,会很快。但是如果很大的文件的话,django会把他保存在某个路径下。当然这个2.5也是可以修改的。
3、输出CSV文件
实现CSV文件的输出可以使用python的CSV库,或者django模板系统
1、使用python库CSV
使用csv的关键是它可以处理类文件对象的能力,而HttPResponse恰好是。
提示:
1、不要忘记类型是‘text/csv’,否则会视为html文件
2、'Content-Disposition'是为了设置文件名,比如浏览器保存的时候,会显示保存文件名到某某地方。
2、传输较大的CSV文件
这时候使用StreamingHttpResponse更好
说实话,不懂
3、使用模板系统
这个就有点意思了,它把数据传到一个模板中,然后返回这个模板,只不过,这个模板是txt格式的。这让我很惊讶,我一直以为模板只能使用在html文件中,没想到其他的也可以,这说明,文件名和模板操作没有关系,不论是不是html,都可以使用模板传递数据,然后渲染效果。
这里不止csv,只是一种示例,txt也可以的。
4、输出PDF文件
1、安装ReportLab
2、写视图函数
reportlab也可以处理类文件对象
提示:如同csv文件
1、attachment的作用是强制浏览器弹出对话框提示如何处理pdf文件,如果没有的话,浏览器自动寻找插件或者其他处理pdf的工具。
3、复杂的PDFs
如果你想要生成一个较复杂的pdf文件,可以考虑io库来作为pdf文件的临时保存器。
Last updated
Was this helpful?