这篇博文对于django的要点总结很不错,翻译感受也不错,这里收藏学习,提醒本身不要偷懒,记住要写优美的代码!javascript
1,不要将项目名称包含在引用代码里html
好比你建立了一个名为”project”的项目,包含一个名为”app”的应用,那么以下代码是很差的:
Python代码java
1
|
from
project.app.models
import
Author
|
缺点在于:应用和项目变成了紧耦合,没法将应用轻易变得可重用。若是未来要换一个项目名称,那你可有得受了。
推荐的作法是:
Python代码python
1
|
from
app.models
import
Author
|
请注意,你须要将项目的路径配置在PYTHONPATH中。jquery
2,不要硬编码MEDIA_ROOT和TEMPLATE_DIRSgit
项目配置文件settings.py中不要使用以下代码:
Python代码github
1
2
|
TEMPLATE_DIRS
=
(
"/home/html/project/templates"
,)
MEDIA_ROOT
=
"/home/html/project/appmedia/"
|
当你在部署到生产环境,或者迁移服务器的时候,就会发生问题。
推荐使用以下方式:
Python代码shell
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代码django
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是最容易在新手中发生的。