django “如何”系列9:三合一:利用遗留的数据库、输出csv和输出pdf

如何集成遗留的数据库

django在适合开发新应用的同时,可以可以集成以前遗留的数据库,下面是如何集成一个已经存在的数据库的流程。

给定你的数据库的参数

你需要告诉django你的数据库连接参数以及数据库的名字,你可以通过修改django配置文件的DATABASES中的default连接来给定你的数据库参数

  • NAME
  • ENGINE
  • USER
  • PASSWORD
  • HOST
  • PORT

自动生成模型

django自带了一个工具inspectdb,这个工具可以通过反溯一个已经存在的数据库来创建一个模型

python manage.py inspectdb

你可以直接使用重定向输出到一个文件里面

python manage.py inspectdb > models.py

生成其他的核心表格

inspectdb指定反溯创建已经有的数据库表,我们仍然需要创建其他的核心表格,比如admin权限等等

python manage.py syncdb

测试和调整

通过各种方法测试和调整这些模型知道符合你的要求。建议通过django数据库api访问数据,通过django的admin站点编辑数据和根据需要调整你的模型文件。

使用django输出csv

这里主要介绍如何动态的使用django的视图函数去输出csv文件。你可以是用python的csv库或者django模板系统

使用python的csv库

python自带一个csv库csv。在django中使用这个库的关键在于:csv模块的csv创建能力作用于类文件对象,django的HttpResponse对象就是类文件对象。下面是一个例子:

import csv
from django.http import HttpResponse

def some_view(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(mimetype=‘text/csv‘)
    response[‘Content-Disposition‘] = ‘attachment; filename="somefilename.csv"‘

    writer = csv.writer(response)
    writer.writerow([‘First row‘, ‘Foo‘, ‘Bar‘, ‘Baz‘])
    writer.writerow([‘Second row‘, ‘A‘, ‘B‘, ‘C‘, ‘"Testing"‘, "Here‘s a quote"])

    return response

代码和注释是一目了然的,但是还是有一些东西值得一提:

  • 响应得到一个特别的MIME类型‘text/csv‘,如果没有这个的话,浏览器可能把输出解释成一个html,那是一个丑陋可怕的官网文章。
  • 响应得到一个额外的Content-Disposition头部,包含了csv文件的文件名,这个文件名在另存为窗口会用到
  • 钩进csv生成器api是非常简单的,csv.writer接受一个类文件对象,而HttpResponse对象刚好符合
  • writer.writerow接受一个可迭代的对象(列表或者元组)
  • csv模块为你注意了引号,需要把原始的字符串穿进去就好了

处理Unicode

python的csv模块不支持Unicode输入,因为django只在内部使用unicode,这意味着,从某些源(比如HttpReuqest)的字符串是有潜在问题的。下面是一些处理的方法:

  • 手工把所有的unicode对象编码成一个兼容的编
  • 使用UnicodeWriter类
  • 使用python-unicode 模块

使用模板系统输出csv

想法:给你的模板传递一个对象的列表,然后再模板中使用for循环输出逗号。

这是一个例子:

from django.http import HttpResponse
from django.template import loader, Context

def some_view(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(mimetype=‘text/csv‘)
    response[‘Content-Disposition‘] = ‘attachment; filename="somefilename.csv"‘

    # The data is hard-coded here, but you could load it from a database or
    # some other source.
    csv_data = (
        (‘First row‘, ‘Foo‘, ‘Bar‘, ‘Baz‘),
        (‘Second row‘, ‘A‘, ‘B‘, ‘C‘, ‘"Testing"‘, "Here‘s a quote"),
    )

    t = loader.get_template(‘my_template_name.txt‘)
    c = Context({
        ‘data‘: csv_data,
    })
    response.write(t.render(c))
    return response
{% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}"
{% endfor %}

使用django输出pdf

django使用一个优秀的开源python库ReportLab来输出pdf文件的

安装ReportLab

可以直接去网上搜索下载或者直接用命令行安装都可以

http://www.reportlab.com/software/opensource/rl-toolkit/download/

安装完成后直接导入就可以使用了

 import reportlab

在视图函数中使用

类似csv模块,ReportLab的api也是作用于类文件对象的,而django的HttpResponse对象也是类文件对象,下面是一个简单的例子:

from reportlab.pdfgen import canvas
from django.http import HttpResponse

def some_view(request):
    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(mimetype=‘application/pdf‘)
    response[‘Content-Disposition‘] = ‘attachment; filename="somefilename.pdf"‘

    # Create the PDF object, using the response object as its "file."
    p = canvas.Canvas(response)

    # Draw things on the PDF. Here‘s where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly, and we‘re done.
    p.showPage()
    p.save()
    return response

最后的showPage()和save()对于pdf文件来说是很重要的,其他的注意事项和输出csv文件的差不多,可以参考着看

复杂的pdf

如果你想创建复杂的pdf,考虑使用cStringIO临时存放你的pdf文件

# Fall back to StringIO in environments where cStringIO is not available
try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse

def some_view(request):
    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(mimetype=‘application/pdf‘)
    response[‘Content-Disposition‘] = ‘attachment; filename="somefilename.pdf"‘

    buffer = StringIO()

    # Create the PDF object, using the StringIO object as its "file."
    p = canvas.Canvas(buffer)

    # Draw things on the PDF. Here‘s where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly.
    p.showPage()
    p.save()

    # Get the value of the StringIO buffer and write it to the response.
    pdf = buffer.getvalue()
    buffer.close()
    response.write(pdf)
    return response
时间: 2024-10-11 17:51:11

django “如何”系列9:三合一:利用遗留的数据库、输出csv和输出pdf的相关文章

Python+Django+SAE系列教程14-----使表单更安全

还记得我们上一章提到过的添加页面吗? 添加完以后我们注意一下地址栏: 表单里的数据赤裸裸的显示在了地址栏中,这时候如果我们修改一下内容 刷新,这样数据库里面就会又加入了一条数据,也就是说用户如果知道表单的结果页的连接,就可以不通过我们的表单,任意添加数据了,这样当然不是我们想要的结果. 这样的结果是因为我们在表单中使用了get的方式来传递数据,这时我们应该想到采用post的方法,post比get更加安全,我们来修改一下模板页面,注意这里: 下面是表单模板Classroom_Add.html的代码

Python+Django+SAE系列教程16-----cookie&session

本章我们来讲解cookie和session ,这两个东西相信大家一定不陌生,概念就不多讲了,我们直接来看其用法,首先是cookie,我们在view中添加三个视图,一个是显示cookie的,一个是设置cookie的,如下: def show_cookie(request): if "MyTestCookie" in request.COOKIES: return HttpResponse("Cookie[MyTestCookie]的内容是: %s" % request

Python+Django+SAE系列教程11-----request/pose/get/表单

表单request,post,get 首先我们来看看Request对象,在这个对象中包含了一些有用的信息,学过B/S开发的人来说这并不陌生,我们来看看在Django中是如何实现的: 属性/方法 说明 举例 request.path 除域名以外的请求路径,以正斜杠开头 "/hello/" request.get_host() 主机名(比如,通常所说的域名) "127.0.0.1:8000" or"www.example.com" request.g

Python+Django+SAE系列教程17-----authauth (认证与授权)系统1

通过session,我们可以在多次浏览器请求中保持数据,接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们需要认证. 当然了,Django 也提供了工具来处理这样的常见任务(就像其他常见任务一样). Django 用户认证系统处理用户帐号,组,权限以及基于cookie的用户会话.这个系统一般被称为 auth/auth (认证与授权)系统. 这个系统的名称同时也表明了用户常见的两步处理. 我们需要: 1.     验证 (认证) 用户是否是他所宣

Python+Django+SAE系列教程12-----配置MySQL数据库

因为SAE上支持的是Mysql,首先我们要在本地配置一个Mysql的环境 ,我在网上找到MySQL-python-1.2.4b4.win32-py2.7.exe,并双击 安装 选择典型安装 安装结束后,会弹出配置数据库的界面 : 然后输数据管理员密码: 最后是运行服务. 这个过程并不复杂,安装完成Mysql以后,系统会启动数据库服务,由于Mysql是用命令行控制的,想我这样懒的 人还是需要借助一个可视化 工具来管理,我选择MySQL-Front. 在网上找到MySQL_Front_Setup.1

django “如何”系列3:如何编写模型域(model filed)

django自带很多的域类--CharField,DateField等等--,如果django的这些域都不能满足你精确的要求,那么你可以编写自己的模型域. django自带的域没有和数据库列类型一一对应的,只有简单的VARCHAR,INTEGER等类型,为了使用更复杂的类型,例如多边形,你可以定义你的域子类:或者,你可能有一个很复杂的对象,这个对象可以通过某些方法序列化标准的数据库列类型,那么你可以定义自己的域子类. 示例对象 创建自定义的域需要注意一些特别的问题,为了使问题更简单的得以阐述,我

Python+Django+SAE系列教程13-----MySQL记录的添\删\改

建立了数据库后,我们就来做一个简单的表(person_classroom)的添加.删除.修改的操作. 首先我们建立一个添加的页面的模板Classroom_Add.html(添加的表单)并把它放在Bidding\templates\person中: Classroom_Add.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>数据库操作

django 异步 查看 服务器日志 | 利用 channels==2.0.2

django 异步 查看 服务器日志 实例 可以查看我编写的这个项目:https://github.com/hequan2017/chain 模块 需要安装以下模块 安装后会有一个版本号报错,不影响 channels==2.0.2 channels-redis==2.1.0 amqp==1.4.9 anyjson==0.3.3 asgi-redis==1.4.3 asgiref==2.3.0 async-timeout==2.0.0 attrs==17.4.0 cd /tmp/ wget htt

SQL Server调优系列进阶篇(如何维护数据库索引)

原文:SQL Server调优系列进阶篇(如何维护数据库索引) 前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常维护以及一些注意事项等. 闲言少叙,进入本篇的主题. 技术准备 数据库版本为SQL Server2012,前几篇文章用的是SQL Server2008RT,内容区别不大,利用微软的以前的案例库(Northwind)进行分析,部分内容也会