利用 Apache 服务器搭建 Python 网站 (三)

来源:互联网 发布:无线鼠标推荐知乎 编辑:程序博客网 时间:2024/06/07 05:30
关系数据库
仗着自己对数据库比较熟悉,在开始的时候我比较随意的设计了数据表,但是当发现自己使用 Django 提供的 model 不能很方便的访问数据后,我就想,是不是哪里有问题了?果然,认真阅读了官方的文档,然后根据例子略微改动了数据结构的设计,顿时觉得豁然开朗,只要将数据结构设计合理了,通过 model 访问数据就方便多了。也许你会说写 sql 也很容易啊,确实容易,但是要根据各种情况来 build 一个合适的 sql 语句有时候也是很讨厌的事情,在明显有更好用的方式的情况下,当然要选更好用的方式。Django 中通过 model 访问数据库的时候,只有真正需要的时候,它才会去执行查询,所以也不需要太担心效率的问题。如果出现效率问题的时候,针对特定部分进行优化就好了。

Ajax的应用
Ajax 作为现代网页开发必不可少的技术,好处还是非常明显的:

  • 对于用户来说,在客户端有更好的用户体验。
  • 对于服务器来说,更有利于服务器端口的设计,每个端口的功能可以更单一,不管从设计还是实现上都更有利。

Ajax 技术现在已经是非常的成熟了,特别是有 jQuery 这种神器在手,$("#info_box").load(url) 一个简单的命令就可以实现特定部分内容的异步刷新工作,非常的方便。不过要用好 Ajax,还是有不少前提条件的(刚好对我来说都不是问题):

  • 对 DOM 比较熟
  • 对 Javscript 比较熟
  • 理解异步局部刷新的思想
  • 需要配合服务器端开发

通过 URL 参数传递
前一篇已经提过基本的 URL 的处理问题,这里主要说一下 URL 中的参数处理。在请求一个页面的时候,常常会用到一些参数,比如要查询一个产品的信息,那么就一般就需要将该产品的 id 传递给服务器。如果详细研究 http 请求的方式,会发现 POST 主要用于会改变服务器数据的情形;而 GET 用于不会改变服务器数据的情形,例如单纯的查询。在 Django 中,对于可以使用 GET 的情况,可以通过将参数混合在 URL 中来代替。比如:

  1. 常规的 GET 请求:http://mysite/detail/?pro_id=100&pro_var=200
  2. 参数混合在 URL 中:http://mysite/detail/100/200/

这里只说第二种方式,它需要对 URL 进行恰当的解析并定向到正确的页面,对于 Django 来说这是很自然的事,因为 Django 就是这么设计的(很多用 cgi 的网站也是这种方式)。这种方式的好处在哪里呢,我能想到的有:

  • 看起来很清爽
  • 更符合 URI 的概念
  • 可以防止 sql 注入,因为 URL 在解析定位的时候就进行正则表达式匹配,匹配失败直接就无法定位到该页面,在这种情况下就省去了处理 sql 注入的麻烦
  • 精确度高,使用正则表达式的匹配,可以对 URL 功能的定位进行有效的控制
  • 配合 Django view 的使用很方便的使用传递到服务器的参数

虽然这种方式好处比较多,但是对于正则表达式苦手的同学来说,很有可能就会望而却步。不过我觉得花点时间去学习一下正则表达式是非常值得的,这东西功能强大用途广,属程序猿的必备工具。

URL 解析具体请认真参考官方文档。正则表达式可以参考这篇文章,我觉得写的很不错。

Class based view
对于一个 http 请求来说,最主要的就是返回一个结果:html 页面。在 Django 中,最基本的做法就是对某个 URL 定向到一个 python 方法,然后返回一个结果:

def info(request, args):
      ......
      return HttpResponse(...)

这样很直观,也很容易理解。但是还能进一步吗?当然可以!网络发展了这么多年,很多常见的情况的处理方式早已被摸索出来了,因此如果能适当的重用已有的模型就可以加速开发过程,而且对于 python 来说,高效的开发不正是其优势吗? Django 当然也想到了这一点,通过 class bassed view,我们就可以对一些常见的情况进行更有效的处理,重用现成的结构。class based view 是在 Django 1.5 中才加入的,我用的刚好就是 1.5。

认真的研习一下官方的文档,它也是比较容易学习和理解的。我在这个过程中遇到的最大问题是如何使用通过解析 URL 得到的那些参数,找遍了文档也没有找到。(也许是我看的方式不对,也许是它真的没有,反正我就是没看到)还好,Django 是开源的,有源码,通过看源码我终于还是找到了我想要的东西:在 class bassed view 里面这些参数被保存在 self.args 和 self.kwargs 里面。例如:

  • url(r'^detail/(\d+)/$', DetailView.as_view(), name="detail") 可以通过 self.args[0] 来访问其参数(我实际并没有使用这种方式,因为我选择了下面一种,其实效果一样的)。
  • url(r'^detail/(?P<pro_id>\d+), DetailView.as_view(), name="detail") 可以通过 self.kwargs['pro_id'] 来访问该参数。

学会使用它以后,网站开发会进一步变得爽快。Django 准备了许多 class view 以应对各种情况,适当的选用一个 view,可以大大的提高效率。

大总结:
我需要做的网站主要就是根据一些信息进行过滤并显示内容,然后在客户端通过 ajax 技术来提升用户体验,目前来看主要的功能就已经实现了。剩下的东西虽然也还不少,比如相应资源的管理页面,还有美化界面等等。但都没有什么可遇见的障碍了,只要花点时间做出来就可以了。

简单回顾一下最初的项目评估,总体来看对各个部分的估计还是比较准确的(其实我并没有规划项目时间,因为涉及到不少学习的内容):

  • Apache 服务器的使用比我想象的要简单些,其实主要就是如何进行配置,花时间学习并实践一下还是不难。调试肯定会花上一些时间,这是避免不了的。
  • 数据库最终选用了 sqlite3,而不是 mysql。由于我要做的网站数据量并不大,因此这两种数据库对我来说效果是一样的,选更方便的那一个就可以了。
  • Python 的使用总体还是很愉快的,由于其语言特性,用起来确实很舒服。当然要想把它用顺手,深入学习下去还是很有必要的。
  • Django 框架比我想象的要强大,由于学习全靠文档(辅以看源码),过程中还是常遇到各种麻烦,不过总体来说,成果还是非常喜人的,感觉用这一套框架,网站开发可以大大的加速。
  • 我以前学做网站的时候,Ajax 技术才兴起没多久,还没来得急实践 Ajax 我就转做了 Android,于是这次算是首次实际使用 Ajax 技术,不过毕竟在网站开发方面还是有比较丰富的经验,而且对 Ajax 的思想还是比较清楚,因此这次的 Ajax 的实践可谓轻松加愉快。
  • Gvim 学习使用 vim 已经有不短的时间了,但这次算是真正第一次用 vim 做项目开发的实践,总体感觉还是非常不错的,不愧为编辑器之神。之前用习惯了功能强大的 IDE,这次开发最大的不同是完全没有依赖智能提示,虽然一开始的时候不太习惯,但慢习惯之后就感觉非常的爽快。(vim 通过插件是可以有智能提示的,不过我并不希望自己太依赖智能提示。)

虽然网站并没有做完,但剩下的东西我觉得值得我写下来的应该不多了,毕竟都是我比较熟悉的了,或者是一些使用上的细节了,具体还是参考各个专业书籍比较靠谱。
原创粉丝点击