如何集成遗留的数据库

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

给定你的数据库的参数

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

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

自动生成模型

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

  1. python manage.py inspectdb

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

  1. python manage.py inspectdb > models.py

生成其他的核心表格

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

  1. 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对象就是类文件对象。下面是一个例子:

  1. import csv
  2. from django.http import HttpResponse
  3.  
  4. def some_view(request):
  5. # Create the HttpResponse object with the appropriate CSV header.
  6. response = HttpResponse(mimetype='text/csv')
  7. response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
  8.  
  9. writer = csv.writer(response)
  10. writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])
  11. writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])
  12.  
  13. 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循环输出逗号。

这是一个例子:

  1. from django.http import HttpResponse
  2. from django.template import loader, Context
  3.  
  4. def some_view(request):
  5. # Create the HttpResponse object with the appropriate CSV header.
  6. response = HttpResponse(mimetype='text/csv')
  7. response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
  8.  
  9. # The data is hard-coded here, but you could load it from a database or
  10. # some other source.
  11. csv_data = (
  12. ('First row', 'Foo', 'Bar', 'Baz'),
  13. ('Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"),
  14. )
  15.  
  16. t = loader.get_template('my_template_name.txt')
  17. c = Context({
  18. 'data': csv_data,
  19. })
  20. response.write(t.render(c))
  21. return response
  1. {% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}"
  2. {% endfor %}

使用django输出pdf

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

安装ReportLab

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

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

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

  1. import reportlab

在视图函数中使用

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

  1. from reportlab.pdfgen import canvas
  2. from django.http import HttpResponse
  3.  
  4. def some_view(request):
  5. # Create the HttpResponse object with the appropriate PDF headers.
  6. response = HttpResponse(mimetype='application/pdf')
  7. response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'
  8.  
  9. # Create the PDF object, using the response object as its "file."
  10. p = canvas.Canvas(response)
  11.  
  12. # Draw things on the PDF. Here's where the PDF generation happens.
  13. # See the ReportLab documentation for the full list of functionality.
  14. p.drawString(100, 100, "Hello world.")
  15.  
  16. # Close the PDF object cleanly, and we're done.
  17. p.showPage()
  18. p.save()
  19. return response

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

复杂的pdf

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

  1. # Fall back to StringIO in environments where cStringIO is not available
  2. try:
  3. from cStringIO import StringIO
  4. except ImportError:
  5. from StringIO import StringIO
  6. from reportlab.pdfgen import canvas
  7. from django.http import HttpResponse
  8.  
  9. def some_view(request):
  10. # Create the HttpResponse object with the appropriate PDF headers.
  11. response = HttpResponse(mimetype='application/pdf')
  12. response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'
  13.  
  14. buffer = StringIO()
  15.  
  16. # Create the PDF object, using the StringIO object as its "file."
  17. p = canvas.Canvas(buffer)
  18.  
  19. # Draw things on the PDF. Here's where the PDF generation happens.
  20. # See the ReportLab documentation for the full list of functionality.
  21. p.drawString(100, 100, "Hello world.")
  22.  
  23. # Close the PDF object cleanly.
  24. p.showPage()
  25. p.save()
  26.  
  27. # Get the value of the StringIO buffer and write it to the response.
  28. pdf = buffer.getvalue()
  29. buffer.close()
  30. response.write(pdf)
  31. return response

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

  1. Django学习系列18:使用迁移创建生产数据库

    Django生成一个很有帮助的错误信息,大意是说没有正确设置数据库. 你可能会有疑惑,为什么在单元测试一切都运行ok,这是因为Django为单元测试创建了专用的测试数据库——这是Django中Test ...

  2. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

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

    通过session,我们能够在多次浏览器请求中保持数据,接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们须要认证. 当然了,Django 也提供了 ...

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

    django自带很多的域类--CharField,DateField等等--,如果django的这些域都不能满足你精确的要求,那么你可以编写自己的模型域. django自带的域没有和数据库列类型一一对 ...

  5. struts2官方 中文教程 系列十三:利用通配符选择方法

    介绍 在本教程中,我们将介绍如何在struts.xml中配置action节点以达到仅使用一个action节点将几个不同的url关联到特定action类的特定方法.这样做的目的是减少struts.xml ...

  6. Django学习系列之Cookie、Session

    Cookie和Session介绍 cookie 保存在客户端 session 保存在服务端 session依赖于cookie,比如服务端想往客户端写东西的时候就把cookie写到客户端浏览器 djan ...

  7. Django学习系列20:改进功能测试

    隐示等待和显示等待 我们看看在功能测试中function_tests.py中的 time.sleep inputbox.send_keys(Keys.ENTER) time.sleep(1) self ...

  8. Django学习系列14:第一个数据库迁移

    在Django中,ORM的任务是模型化数据库. 创建数据库其实是由另一个系统负责的叫做迁移. 迁移的任务是根据你对models.py文件的改动情况,添加或删除表和列. 可以把迁移想象成数据库使用的版本 ...

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

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

随机推荐

  1. BZOJ2697 特技飞行 【贪心】

    题目链接 BZOJ2697 题解 好水好水的贪心... 容易发现每种特技只表演两次,多表演没有意义,而且差距越长收益越大 然后就可以贪,最大的放两端,次大的往里,然后是第三大....... 证明很简单 ...

  2. HDU 1002 (高精度加法运算)

    A + B ProblemII Time Limit: 2000/1000 MS(Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  3. Mac添加锁屏快捷键

    Mac要想添加锁屏快捷键,必须使用Automator. 1. 打开Automator,创建一个新的服务. 2. 在左侧栏中找到 启动屏幕保护 ,将其拖曳到右侧窗口内,并且修改 服务收到改为" ...

  4. SRM12 T2夏令营(分治优化DP+主席树 (已更新NKlogN)/ 线段树优化DP)

     先写出朴素的DP方程f[i][j]=f[k][j-1]+h[k+1][i] {k<i}(h表示[k+1,j]有几个不同的数)  显然时间空间复杂度都无法承受   仔细想想可以发现对于一个点 i ...

  5. 【DP优化】【P1430】序列取数

    传送门 Description 给定一个长为n的整数序列,由A和B轮流取数(A先取).每个人可从序列的左端或右端取若干个数(至少一个),但不能两端都取.所有数都被取走后,两人分别统计所取数的和作为各自 ...

  6. ARM汇编程序闪烁灯与其反汇编代码比较

    /* *LED闪烁 *led.s */ #define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 .global _start //把 _start ...

  7. c# string 转 GUID

    提供两种方法 1.try...catch... /* * string TO guid */ private static bool ToGuid(string str) { Guid gv = ne ...

  8. linux删除乱码

    一:前沿 好久没有记载东西了,回来之后一直忙着改东西,我走之前项目是什么样,回来后也差不多.郁闷啊,努力敲代码,但是要敲出思想来啊.先会做,然后深入思考 二:内容 (1)每次使用rz命令向服务器上传代 ...

  9. Linux LVM分区管理、扩展

    一.LVM简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写.LVM将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它 ...

  10. centos6.8安装并配置zimbra

    一.对域名设置MX记录 二.安装准备 1.关闭selinux vi /etc/selinux/config SELINUX=disabled 2.iptables防火墙端口设置 # iptables ...