2019独角兽企业重金招聘Python工程师标准>>>

这篇博文对于django的要点总结很不错,翻译感觉也不错,这里收藏学习,提醒自己不要偷懒,记住要写优美的代码!

1,不要将项目名称包含在引用代码里

比如你创建了一个名为”project”的项目,包含一个名为”app”的应用,那么如下代码是不好的:
Python代码

1
from     project.app.models     import     Author

缺点在于:应用和项目变成了紧耦合,无法将应用轻易变得可重用。如果将来要换一个项目名称,那你可有得受了。
推荐的做法是:
Python代码

1
from     app.models     import     Author

请注意,你需要将项目的路径配置在PYTHONPATH中。

2,不要硬编码MEDIA_ROOT和TEMPLATE_DIRS

项目配置文件settings.py中不要使用如下代码:
Python代码

1
2
TEMPLATE_DIRS     =     (     "/home/html/project/templates"     ,)
MEDIA_ROOT     =     "/home/html/project/appmedia/"

当你在部署到生产环境,或者迁移服务器的时候,就会发生问题。
推荐使用如下方式:
Python代码

1
2
3
SITE_ROOT     =     os.path.realpath(os.path.dirname(__file__))
MEDIA_ROOT     =     os.path.join(SITE_ROOT,     'appmedia'     )
TEMPLATE_DIRS     =     ( os.path.join(SITE_ROOT,     'templates'     ),)

3,不要将静态文件的路径硬编码在模板中

模板中链接CSS,javascript或图片的时候,不建议使用如下方式:
Html代码

1
<     script     type     =     "text/javascript"     src     =     "/appmedia/jquery.min.js"     ></     script     >

当你的项目需要将静态文件用其他服务器提供的时候,通常会是另外一个http地址,那么你就得把所有的/appmedia/替换成新的地址,做网站写代码已经够乏味的了。 没有后顾之忧的解决方法是使用{{ MEDIA_URL }}代替硬编码的路径: Html代码

1
<     script     type     =     "text/javascript"     src     =     "{{ MEDIA_URL }}jquery.min.js"     ></     script     >

模板上下文变量怎么获取到呢?请使用RequestContext即可:
Python代码

1
2
return     render_to_response(     "app/template.html"     , {     'var'     :     'foo'     },
context_instance     =     RequestContext(request))

4,不要将业务逻辑代码写到视图里

不要迷惑,虽然你可能看过很多书和例子,它们把逻辑都写在了views.py里,但请你别这么做。因为这样不利于单元测试,不利于重用代码。
那我的业务逻辑应该放哪里呢?推荐放到模型里或者单独建立一个辅助(helper)模块。
当然,从模型得到一个Author,获取Author列表的代码是可以放到视图里面的。

5,部署时别忘记将DEBUG设置成False

我们常常忘记在部署时禁用DEBUG,有很多种方法自动来处理这个配置:
Python代码

1
2
3
4
5
6
import     socket
if     socket.gethostname()     =     =     'productionserver.com'     :
         DEBUG     =     False
else     :
         DEBUG     =     True

另一种途径是使用不同的配置文件:
Python代码

1
2
3
4
5
#文件名:settings_debuy.py
#包含调试模式的配置信息
#使用python manage.py runserver settings=settings_debug.py来运行项目
from     settings     import     *
DEBUG     =     True

6,只加载一次自定义的模板标签

当需要使用自定义或者第三方的模板标签和模板过滤器时,通常要在模板中使用:
Python代码

1
{     %     load template_tags     %     }

实际情况是,需要在所有用到自定义模板标签和模板过滤器的模板中都使用上面的代码,这样就不DRY了。
Python代码

1
2
from     django     import     template
template.add_to_builtins(     'app.templatetags.custom_tag_module'     )

请将以上代码放到项目启动时能加载的模块中(settings.py, urls.py, models.py等)即可。
上面代码的作用是在项目启动时就把自定义模板标签或过滤器加载进来,模板中任何一个地方都可以使用它们,而不需要{% load template_tags %}。

7,合理配置和使用URL

不要将URL全都配置在一个urls.py文件中,比如:
Python代码

1
2
3
4
5
6
7
8
9
10
11
urlpatterns     =     patterns('',
       url(r     '^askalumini/question/$'     ,     '.....registerInstitution'     ,name     =     'iregister'     ),
       url(r     '^askalumin/answer/$'     ,     'someview.....'     ,name     =     'newmemberurl'     ),
       url(r     '^institution/member/$'     ,     'someview.....'     ,name     =     "dashboardurl"     ),
       url(r     '^institution/faculty/$'     ,     'editInstitute'     ,name     =     "editinstituteurl"     ),
       url(r     '^memeber/editprofile/$'     ,     'editProfile'     ,name     =     "editprofileurl"     ),
       url(r     '^member/changepassword/$'     ,     'changePassword'     ,name     =     "changepasswordurl"     ),
       url(r     '^member/forgotpassword/$'     ,     'forgotPassword'     ,name     =     "forgotpasswordurl"     ),
       url(r     '^member/changepicture/$'     ,     'changePicture'     ,name     =     "changepictureurl"     ),
       url(r     '^member/logout/$'     ,     'memeberlogout'     ,name     =     "logouturl"     ), ,
)

建议的方式是将各应用的URL配置在各自的urls.py中,这样可以使应用更容易重复使用到不同项目里:
Python代码

1
2
3
4
5
6
urlpatterns     =     patterns('',
       (r     '^$'     , include(     'institution.urls'     )),
       (r     '^institution/'     , include(     'institution.urls'     )),
       (r     '^askalumini/'     , include(     'askalumini.urls'     )),
       (r     '^member/'     , include(     'member.urls'     )),
)

如下是应用askalumini的urls.py:
Python代码

1
2
3
4
5
6
urlpatterns     =     patterns(     'askalumini.views'     ,
       url(r     '^$'     ,     'askHome'     ,name     =     'askaluminiurl'     ),
       url(r     '^questions/(?P\d+)/$'     ,     'displayQuestion'     ,name     =     'askquestiondisplay'     ),
       url(r     '^askquestions/$'     ,     'askQuestion'     ,name     =     'askquestionurl'     ),
       url(r     '^postcomment/$'     ,     'postComment'     ,name     =     "askquestioncomment"     )
)

刚才提到静态文件路径不要硬编码,url的处理方式也尽量不要硬编码,否则当你更改一个地址时会牵涉到多处的修改,可以使用一些url函数来处理。
在/project/askalumini/urls.py中,为每一个url定义了name,它可以帮助我们有效地在视图、模板和模型中处理url,而不是硬编码。
为保证名称的唯一,请遵照将url命名为< appname >/< somelabel >的习惯用法。
举例来说,在views.py文件中有如下代码:
Python代码

1
HttpResponseRedirect(     "/askalumini/questions/54"     )

请改为:
Python代码

1
2
from     django.core.urlresolvers     import     reverse
HttpResponseRedirect(reverse(     'askquestiondisplay'     ,kwargs     =     {     'questionno'     :q.     id     }))

在模型中使用models.permalink装饰器来格式url:
Python代码

1
2
3
@models     .permalink
def     get_absolute_url(     self     ):
         return     (     'profileurl2'     ,(),{     'userid'     :     self     .user.     id     })

在模板中使用url标签代替硬编码:
Html代码

1
2
{% url askquestiondisplay 345 %}
<     a     href     =     "{% url askquestiondisplay 345 %}"     > Ask Question </     a     >

8,调试

调试通常会借助一些第三方工具来获得更多的运行时信息。
一个请求执行了多少句SQL?花了多长时间?
调用的哪个模板?客户端设置了什么COOKIE?SESSION呢?。。。
你可以使用django-debug-toolbar查看上面甚至更多的信息:http://github.com/robhudson/django-debug-toolbar
另一个工具是Werkzeug debugger,它可以在错误页面打开python shell,让你更方便的跟踪错误信息,请访问:http://blog.dpeepul.com/2009/07/14/python-shell-right-on-the-django-error-page/ 获得更多信息。
还有pdb,一个强大的调试工具:http://ericholscher.com/blog/2008/aug/31/using-pdb-python-debugger-django-debugging-series-/

9,了解pinax备用

django最大的优点是代码重用,DRY,pinax就是这样一个平台,包含了许多可拿来直接使用的代码,比如openid,电子邮件验证等等。请访问:http://pinaxproject.com/

10,了解一些著名的第三方应用

1)数据库升级工具

什么是数据库升级工具?你运行了syncdb,运行了一年之后,对模型做了更改,添加了字段,删除了字段,要再运行syncdb吗?或者ALTER TABLE …?
django-evolutions可以帮你完成上面的事情,但它好像不够强壮:http://code.google.com/p/django-evolution/
South能很强壮地完成上面的事情,但是需要学学怎么用:http://south.aeracode.org/

2)模板系统

django自带的模板系统是可以替换的,并且各自有优缺点。
template-utils增强了模板的比较标签等功能 ,并提供其他的一些实用特性:http://django-templateutils.googlecode.com/svn/trunk/docs/
Jinja是一个完整的第三方模板系统,可以替换默认模板系统,它提供了许多优越的特性:http://jinja.pocoo.org/2/

3)第三方应用

django command extensions提供了很多实用的命令行功能:
shell_plus加载所有django模型
runserver_plus整合了Werkzeug调试工具
生成模型图表,你可以展示给你的老板
……

请参考:http://ericholscher.com/blog/2008/sep/12/screencast-django-command-extensions/
Sorl可以生成缩略图:http://code.google.com/p/sorl-thumbnail/
…………
—END—

另外,从原文的评论里也有不少发现:
用django.shortcuts的redirect代替HttpResponseRedirect:http://docs.djangoproject.com/en/dev/topics/http/shortcuts/#redirect
使用VirtualEnv部署django项目
django项目规范:http://ericholscher.com/projects/django-conventions/project/
上面提到的10点中,第2和第4是最容易在新手中发生的。

转载于:https://my.oschina.net/ranvane/blog/306774

Django新手需要注意的10个要点相关推荐

  1. 成为优秀高级程序员的10个要点

     成为优秀高级程序员的10个要点 What 软件工程师的职业生涯要历经以下几个阶段:初级.中级,最后才是高级.这篇文章主要是讲如何通过10个步骤助你成为一名高级软件工程师. Why 得到更多的报酬 ...

  2. oracle10个,OracleDBA新手经常碰到的10个Oracle错误

    OracleDBA新手经常碰到的10个Oracle错误(英文) This document contains information about errors frequently encounter ...

  3. Django最新版(1.10.5)在SAE上面部署流程

    Django最新版(1.10.5)在SAE和Pythonanywhere上面部署流程 一.Django在SAE上的部署 1.注意事项: 将整个Django项目准备好,是Project,不是app. S ...

  4. Django新手入门(五)——Models详解

    Django新手入门(五)--Models详解 数据库 ORM Django中的ORM Django中的Models 定义models.py中的类 常用数据字段 常用设置选项 常用函数以及修饰词 其他 ...

  5. Android 10适配要点,作用域存储

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新. 距离Android 10系统正式发布已经过去大半年左右的时间了,你的应用程序已经对它进行适配 ...

  6. 总结Android手机应用UI设计的10个要点

    总结Android手机应用UI设计的10个要点 (本文经游戏邦授权转载,原文链接http://gamerboom.com/archives/48018) 作者:Guenther Beyer 最近,许多 ...

  7. SEO优化新手必须掌握的10个技巧和工具

    随着互联网的不断发展,SEO(搜索引擎优化)已成为网站拓展和推广的重要手段之一.对于新手而言,学习SEO的基础知识和技巧是至关重要的.在本文中,我将分享SEO优化新手必须掌握的10个技巧和工具. 1. ...

  8. 成为优秀高级程序员的10个要点(转)

    英文原文:10 Steps to become a Senior Software Engineer What 软件工程师的职业生涯要历经以下几个阶段:初级.中级,最后才是高级.这篇文章主要是讲如何通 ...

  9. 【AI初识境】给深度学习新手做项目的10个建议

    这是专栏<AI初识境>的第12篇文章.所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法. 在成为合格的深度学习算法工程师,尤其是工业界能够实战的调参选手之前,总会踏足很多的坑. 今 ...

最新文章

  1. 购物中心定位分析、调整方案及租金建议
  2. sqlplus登录时遇到的ORA-12560: TNS: 协议适配器错误解决办法
  3. [python] 安装numpy+scipy+matlotlib+scikit-learn及问题解决
  4. 径向基(RBF)神经网络
  5. C++ COM编程之QueryInterface函数(二)
  6. 《假如编程是魔法之零基础看得懂的Python入门教程 》——(五)我的魔法竟然有了一丝逻辑
  7. 遗传算法求二元函数极值怎么编码_用遗传算法求复杂函数的极值点
  8. 达梦单机搭建及简单使用
  9. 电路图精简版(web内置画图软件)
  10. 矩阵转置相关公式_线性代数精华2——逆矩阵的推导过程
  11. excel2019批量删除空白行的方法
  12. 渗透测试工具-sqlmap
  13. 百度地图结合echarts实现飞线
  14. Python编程好不好学?入门难吗?
  15. html标签中before,css中before是什么意思?
  16. akoj-1245-字符转换
  17. 苹果第一次怼了华为 是因为抢跑5G的华为走上了苹果模式?
  18. ldar是什么意思 计算机组成,第一章TEC-9计算机组成和数字逻辑实验系统介绍….PDF...
  19. 计算机网络技术基础拓扑图实验,计算机网络技术实验指导书 4
  20. 【毕业设计】基于stm32的智能水杯 - 恒温控制 饮水杯 单片机 物联网 嵌入式

热门文章

  1. zk里面调用javascript方法
  2. vmware虚拟化之vswitch详细资料
  3. UPNP解读2-含netbios,wins,DNS
  4. solid 设计原则 php,面向对象设计SOLID五大原则
  5. 基于模板的通用代码生成器LKGenerator(四)-核心技术之各种数据库查询表信息sql整理...
  6. Android开发学习之Xml解析归纳
  7. android常用开源库分享
  8. Gradle在Android中的简单使用
  9. hadoop: hbase1.0.1.1 伪分布安装
  10. 企业开展网络营销常用的十九种方法