2016年8月19日

摘要: 记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的。这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例。 最近一直很忙,博客产出也少的可怜,今天整理了一下自己做过优化或各种方案的客户已经超过100家了,今天分享的案例算是在这些客户中比 阅读全文
posted @ 2016-08-19 16:52 邬兴亮 阅读(537) 评论(0) 推荐(0) 编辑
摘要: 我们已经可以在view函数中判断用户是否已经登录以及获取用户信息: Django的User对象提供了一系列的属性和方法,其中password存储的是加密后的密码,is_staff记录用户是否有管理员权限,其 他的属性可以参考官方文档。同时django.contrib.auth模块中提供了authen 阅读全文
posted @ 2016-08-19 15:56 邬兴亮 阅读(355) 评论(0) 推荐(0) 编辑
摘要: 到目前为止,我们开发的所有功能都是匿名访问的,这显然不够安全。通常我们会要求注册的用户通过用户名和密码登录,只有登录后的用户才可以管理产品。套用专业的说法就是:第一步是认证,验证用户是否是他所宣称的那个人;第二步是授权,验证用户是否拥有执行某种操作的权限。 Django已经提供了一个django.c 阅读全文
posted @ 2016-08-19 15:54 邬兴亮 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 在上一节我们实现了针对某个产品的订单订阅功能。但是我们可能需要直接在站点上查询所有的订单。显然,随着时间的增长订单会越来越多,所以分页(Pagination)是个好办法:每次只显示一部分订单。 分页是Web应用常用的手法,Django提供了一个分页器类 Paginator(django.core.p 阅读全文
posted @ 2016-08-19 15:53 邬兴亮 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 记得有人跟我说过,rails的has_many :through是一个”亮点“,在Django看来,该功能简直不值一提。rails中的many-to-many关联中,还需要你手工创建关联表(写 migration的方式),而has_many :through的”语法“只不过是为了自定义关联关系:通过 阅读全文
posted @ 2016-08-19 15:52 邬兴亮 阅读(394) 评论(0) 推荐(0) 编辑
摘要: 前面的内容已经基本上涵盖了Django开发的主要方面,我们从需求和界面设计出发,创建模型和修改模型,并通过scaffold作为开发的起点;在scaffold的基础上重新定制模板,并且通过Model类和Form类对用户输入的数据进行校验。我们也涉及到了单元测试。为了提高开发用户界面的效率,更好地实现模 阅读全文
posted @ 2016-08-19 15:49 邬兴亮 阅读(574) 评论(0) 推荐(0) 编辑
摘要: 现在让我们来通过ajax请求后台服务。当然首选要实现后台服务。关于“加入购物车”,我们需要的服务是这样定义的: 这个API的定义似乎不那么RESTful,但是暂且不去管它。实现这个服务需要为RESTful web service(depotapp/views.py中的RESTforCart类)增加一 阅读全文
posted @ 2016-08-19 15:47 邬兴亮 阅读(500) 评论(0) 推荐(0) 编辑
摘要: 现在我们有了一个使用json格式的RESTful API,可以实现这样的功能了:为了避免在产品列表和购物车之间来回切换,需要在产品列表界面显示购物车,并且通过ajax的方式不刷新界面就更新购物车的显示内容。 ajax框架的选择 关于ajax框架的选择,看图不说话: 我不管你选的是什么,反正我是选了j 阅读全文
posted @ 2016-08-19 15:45 邬兴亮 阅读(5180) 评论(0) 推荐(0) 编辑
摘要: 曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style)。所以我们的选择变得很简单:前端ajax访问后端的RESTful web service对资源进行操作。 Django中有一些可选的REST framework,比如d 阅读全文
posted @ 2016-08-19 15:44 邬兴亮 阅读(851) 评论(0) 推荐(0) 编辑
摘要: 上一节我们实现了一个”能看不能用“的购物车,现在我们来使用这个购物车。 首先是产品目录界面中的”加入购物车“链接,我们希望点击这个按钮后,在购物车中添加该产品(添加的规则是如果购物车中已经有该产品就增加数量,如果没有就增加条目),然后显示购物车。首先我们设计一个”RESTful“的加入购物车链接,其 阅读全文
posted @ 2016-08-19 15:42 邬兴亮 阅读(350) 评论(0) 推荐(0) 编辑
摘要: 现在,我们有了一个产品目录界面,用户如果看到满意的产品,就可以将其放入购物车。下面就让我们来实现购物车的功能。 首先要做一下简单的分析和设计。购物车应该显示一系列产品的清单,其中列出了买方选中的产品。但是这个清单没有必要马上保存到数据库,因为直到付款之前,用户随时都有可能改变主意。我们只需要在用户的 阅读全文
posted @ 2016-08-19 15:40 邬兴亮 阅读(516) 评论(0) 推荐(1) 编辑
摘要: 针对上一节的新需求,界面设计师还为我们设计了一个新的界面,不仅仅是目录页,还包含了站点的整体风格,如下图: 感谢界面设计师为我们提供的“又黑又硬”的工具条,这个看起来真的很酷。下面,让我们来享用她的工作成果吧。 我们前面的scaffold已经生成了有继承关系模板,显然对于一些公用的内容应该放到bas 阅读全文
posted @ 2016-08-19 15:38 邬兴亮 阅读(419) 评论(0) 推荐(0) 编辑
摘要: 我们已经实现了卖方的产品维护界面,根据最初的需求,还要为买方实现一个目录页:买方通过这个界面浏览产品并可以加入购物车。通过进一步需求调研,了解到产品有一个“上架时间”,在这个时间之后的产品才能被买方看到。并且买方应该先看到最新的产品。 我们注意到,这个“新需求”需要对Product进行调整,增加一个 阅读全文
posted @ 2016-08-19 15:37 邬兴亮 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 尽早进行单元测试(UnitTest)是比较好的做法,极端的情况甚至强调“测试先行”。现在我们已经有了第一个model类和Form类,是时候开始写测试代码了。 Django支持python的单元测试(unit test)和文本测试(doc test),我们这里主要讨论单元测试的方式。这里不对单元测试的 阅读全文
posted @ 2016-08-19 15:36 邬兴亮 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 让我们完成上一节中的任务: 1.验证price>0:需要在Form中验证; 2. 验证title唯一:在Model中验证; 3. 验证image_url的扩展名:在Form中验证,还可以顺便在Model中将其改为URLField类型。 之前生成的scaffold中已经实现了属性不能为空的验证: 但是 阅读全文
posted @ 2016-08-19 15:33 邬兴亮 阅读(366) 评论(0) 推荐(0) 编辑
摘要: rails有一个”简洁、完美的验证机制,无比强大的表达式和验证框架“。在《Agile Web Development with Rails 4th》一书的7.1节向我们展示了如何验证Product: 还是需要解释一下: validates :title, :description, :image_u 阅读全文
posted @ 2016-08-19 15:31 邬兴亮 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 有了上一节关于Django模板的基础,改造界面就很容易理解了。将界面设计师设计的页面中的内容根据复用程度分别放到基础模板base.html和专用模板productlist.html中。 depot/templates/base.html base作为整个网站的基础布局,包含了所有页面都需要的boot 阅读全文
posted @ 2016-08-19 15:29 邬兴亮 阅读(602) 评论(0) 推荐(0) 编辑
摘要: scaffold的生成物虽然用处不大,但是给我们带来一些最佳实践。其中就有模板的继承和分区。 如果你深入使用过rails的模板体系,那么恭喜你:你有超强的忍耐力!而且更重要的是,你只需要3分钟就可以理解Django的模板体系。 让我们先回顾一下rails的模板系统: 1. 你创建了一个xxxview 阅读全文
posted @ 2016-08-19 15:27 邬兴亮 阅读(533) 评论(0) 推荐(0) 编辑
摘要: 之前生成了Product类的scaffold,但是如同rails的开发者David所讲的那样,scaffold几乎没什么用。所以按照《Agile Web Development with Rails 4th》中的迭代计划,下一步的修改是美化list页面: 但是这个界面还是太丑陋了。其实,有了boot 阅读全文
posted @ 2016-08-19 15:25 邬兴亮 阅读(691) 评论(0) 推荐(0) 编辑
摘要: 在上一节用一个插件生成了类似rails的scaffold,其实无非就是URLconf+MTV。让我们看看具体都生成了哪些东西。 首先是“入口”的定义即URLconf,打开urls.py: 上面的代码中增加的配置行表示:以depotapp开头的url由depotapp/urls.py文件进行处理。 d 阅读全文
posted @ 2016-08-19 15:24 邬兴亮 阅读(411) 评论(0) 推荐(0) 编辑

导航