diff --git "a/Day41-55/45.\346\212\245\350\241\250\345\222\214\346\227\245\345\277\227.md" "b/Day41-55/45.\345\210\266\344\275\234\346\212\245\350\241\250.md" similarity index 84% rename from "Day41-55/45.\346\212\245\350\241\250\345\222\214\346\227\245\345\277\227.md" rename to "Day41-55/45.\345\210\266\344\275\234\346\212\245\350\241\250.md" index 71128f6b2ecaa3b616259a5764b489ab4e425c97..eeb02089fc05f1c5da222fba2465f610cac812ce 100644 --- "a/Day41-55/45.\346\212\245\350\241\250\345\222\214\346\227\245\345\277\227.md" +++ "b/Day41-55/45.\345\210\266\344\275\234\346\212\245\350\241\250.md" @@ -1,4 +1,4 @@ -## 报表 +## 制作报表 ### 导出Excel报表 @@ -52,6 +52,26 @@ urlpatterns = [ ] ``` +### 导出PDF报表 + +在Django项目中,如果需要导出PDF报表,可以借助三方库reportlab来生成PDF文件的内容,再将文件的二进制数据输出给浏览器并指定MIME类型为`application/pdf`,具体的代码如下所示。 + +```Python +def export_pdf(request: HttpRequest) -> HttpResponse: + buffer = io.BytesIO() + pdf = canvas.Canvas(buffer) + pdf.setFont("Helvetica", 80) + pdf.setFillColorRGB(0.2, 0.5, 0.3) + pdf.drawString(100, 550, 'hello, world!') + pdf.showPage() + pdf.save() + resp = HttpResponse(buffer.getvalue(), content_type='application/pdf') + resp['content-disposition'] = 'inline; filename="demo.pdf"' + return resp +``` + +关于如何用reportlab定制PDF报表的内容,可以参考reportlab的[官方文档](https://www.reportlab.com/docs/reportlab-userguide.pdf)。 + ### 生成前端统计图表 如果项目中需要生成前端统计图表,可以使用百度的[ECharts]()。具体的做法是后端通过提供数据接口返回统计图表所需的数据,前端使用ECharts来渲染出柱状图、折线图、饼图、散点图等图表。例如我们要生成一个统计所有老师好评数和差评数的报表,可以按照下面的方式来做。 @@ -62,7 +82,6 @@ def get_teachers_data(request): names = [teacher.name for teacher in queryset] good_counts = [teacher.good_count for teacher in queryset] bad_counts = [teacher.bad_count for teacher in queryset] - # 返回JSON格式的数据 return JsonResponse({'names': names, 'good': good_counts, 'bad': bad_counts}) ``` diff --git "a/Day41-55/46. \346\227\245\345\277\227\345\222\214\350\260\203\350\257\225\345\267\245\345\205\267\346\240\217.md" "b/Day41-55/46.\346\227\245\345\277\227\345\222\214\350\260\203\350\257\225\345\267\245\345\205\267\346\240\217.md" similarity index 100% rename from "Day41-55/46. \346\227\245\345\277\227\345\222\214\350\260\203\350\257\225\345\267\245\345\205\267\346\240\217.md" rename to "Day41-55/46.\346\227\245\345\277\227\345\222\214\350\260\203\350\257\225\345\267\245\345\205\267\346\240\217.md" diff --git "a/Day41-55/47.\344\270\255\351\227\264\344\273\266\347\232\204\345\272\224\347\224\250.md" "b/Day41-55/47.\344\270\255\351\227\264\344\273\266\347\232\204\345\272\224\347\224\250.md" index 1eef01d5624fb210322127fd1e4db697417f09e7..01470e92af75fb205b8323d078da788409bc0911 100644 --- "a/Day41-55/47.\344\270\255\351\227\264\344\273\266\347\232\204\345\272\224\347\224\250.md" +++ "b/Day41-55/47.\344\270\255\351\227\264\344\273\266\347\232\204\345\272\224\347\224\250.md" @@ -22,20 +22,20 @@ MIDDLEWARE = [ 我们稍微为大家解释一下这些中间件的作用: -1. CommonMiddleware - 基础设置中间件,可以处理以下一些配置参数。 +1. `CommonMiddleware` - 基础设置中间件,可以处理以下一些配置参数。 - DISALLOWED_USER_AGENTS - 不被允许的用户代理(浏览器) - APPEND_SLASH - 是否追加`/` - USE_ETAG - 浏览器缓存相关 -2. SecurityMiddleware - 安全相关中间件,可以处理和安全相关的配置项。 +2. `SecurityMiddleware` - 安全相关中间件,可以处理和安全相关的配置项。 - SECURE_HSTS_SECONDS - 强制使用HTTPS的时间 - SECURE_HSTS_INCLUDE_SUBDOMAINS - HTTPS是否覆盖子域名 - SECURE_CONTENT_TYPE_NOSNIFF - 是否允许浏览器推断内容类型 - SECURE_BROWSER_XSS_FILTER - 是否启用跨站脚本攻击过滤器 - SECURE_SSL_REDIRECT - 是否重定向到HTTPS连接 - SECURE_REDIRECT_EXEMPT - 免除重定向到HTTPS -3. SessionMiddleware - 会话中间件。 -4. CsrfViewMiddleware - 通过生成令牌,防范跨请求份伪的造中间件。 -5. XFrameOptionsMiddleware - 通过设置请求头参数,防范点击劫持攻击的中间件。 +3. `SessionMiddleware` - 会话中间件。 +4. `CsrfViewMiddleware` - 通过生成令牌,防范跨请求份伪的造中间件。 +5. `XFrameOptionsMiddleware` - 通过设置请求头参数,防范点击劫持攻击的中间件。 在请求的过程中,上面的中间件会按照书写的顺序从上到下执行,然后是URL解析,最后请求才会来到视图函数;在响应的过程中,上面的中间件会按照书写的顺序从下到上执行,与请求时中间件执行的顺序正好相反。 diff --git "a/Day91-100/95.\344\275\277\347\224\250Django\345\274\200\345\217\221\345\225\206\344\270\232\351\241\271\347\233\256.md" "b/Day91-100/95.\344\275\277\347\224\250Django\345\274\200\345\217\221\345\225\206\344\270\232\351\241\271\347\233\256.md" index a85f6e85c16aaaf37054f0de87944225a081821e..e6efec2ae48f95b7a665f584b250f2c5a9fc1ec4 100644 --- "a/Day91-100/95.\344\275\277\347\224\250Django\345\274\200\345\217\221\345\225\206\344\270\232\351\241\271\347\233\256.md" +++ "b/Day91-100/95.\344\275\277\347\224\250Django\345\274\200\345\217\221\345\225\206\344\270\232\351\241\271\347\233\256.md" @@ -662,7 +662,7 @@ def simple_middleware(get_response): ``` ```Python -class MyMiddleware(object): +class MyMiddleware: def __init__(self, get_response): self.get_response = get_response @@ -675,7 +675,7 @@ class MyMiddleware(object): ``` ```Python -class MyMiddleware: +class MyMiddleware(MiddlewareMixin): def __init__(self): pass diff --git a/README.md b/README.md index 919310a888fb38711a304f71c5305ce6e2f9f738..8f033db66fbb72ea1d8da21067d43ae944cd903c 100644 --- a/README.md +++ b/README.md @@ -249,14 +249,19 @@ - Django框架对session的支持 - 视图函数中的cookie读写操作 -#### Day46 - [报表和日志](./Day41-55/46.报表和日志.md) +#### Day45 - [报表和日志](./Day41-55/45.制作报表.md) - 通过HttpResponse修改响应头 - 使用StreamingHttpResponse处理大文件 - 使用xlwt生成Excel报表 - 使用reportlab生成PDF报表 - 使用ECharts生成前端图表 -- 配置日志和Django-Debug-Toolbar + +#### Day46 - [日志和调试工具栏](./Day41-55/46.日志和调试工具栏.md) + +- 配置日志 +- 配置Django-Debug-Toolbar +- 优化ORM代码 #### Day47 - [中间件的应用](./Day41-55/47.中间件的应用.md) @@ -282,20 +287,12 @@ - 使用装饰器实现页面缓存 - 为数据接口提供缓存服务 -#### Day52 - [文件上传和富文本编辑](./Day41-55/52.文件上传和富文本编辑器.md) +#### Day52 - [文件上传](./Day41-55/52.文件上传.md) - 文件上传表单控件和图片文件预览 - 服务器端如何处理上传的文件 -- 富文本编辑器概述 -- wangEditor的使用 - -#### Day53 - [短信和邮件](./Day41-55/53.短信和邮件.md) - -- 常用短信网关平台介绍 -- 使用螺丝帽发送短信 -- Django框架对邮件服务的支持 -#### Day54 - [异步任务和定时任务](./Day41-55/54.异步任务和定时任务.md) +#### Day53 - [异步任务和定时任务](./Day41-55/53.异步任务和定时任务.md) - 网站优化第二定律 - 配置消息队列服务