主页 > Python结构 > 正文

新手学习Django的十条留意点

刚刚开始学习Django的新手留意了,这儿总结了十条留意点,能够协助你更好的学习Django,削减犯错,防止走弯路,很值得一看哦~~


1,不要将项目称号包括在引证代码里

比方你创建了一个名为"project"的项目,包括一个名为"app"的运用,那么如下代码是欠好的:

from project.app.models import Author


缺陷在于:运用和项目变成了紧耦合,无法将运用简单变得可重用。假如将来要换一个项目称号,那你可有得受了。

引荐的做法是:

from app.models import Author


请留意,你需求将项目的途径装备在PYTHONPATH中。

2,不要硬编码MEDIA_ROOT和TEMPLATE_DIRS

项目装备文件settings.py中不要运用如下代码:

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


当你在布置到出产环境,或许搬迁服务器的时分,就会发作问题。

引荐运用如下办法:

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'),)


(也能够运用abspath,跟realpath的区别请参阅http://rob.cogit8.org/blog/2009/May/05/django-and-relativity-updated/ )

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

模板中链接CSS,javascript或图片的时分,不主张运用如下办法:

<link rel="stylesheet" type="text/css" href="/appmedia/amazing.css" />
<script type="text/javascript" src="/appmedia/jquery.min.js"></script>


当你的项目需求将静态文件用其他服务器供给的时分,一般会是别的一个http地址,那么你就得把一切的/appmedia/替换成新的地址,做网站写代码现已够庸俗的了。

没有后顾之虑的解决办法是运用{{ MEDIA_URL }}替代硬编码的途径:

<link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}amazing.css" />
    <script type="text/javascript" src="{{ MEDIA_URL }}jquery.min.js"></script>


模板上下文变量怎样获取到呢?请运用RequestContext即可:

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


从RequestContext里还能够获取到当时用户等信息

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

不要利诱,尽管你或许看过许多书和比方,它们把逻辑都写在了views.py里,但请你别这么做。由于这样不利于单元测验,不利于重用代码。

那我的事务逻辑应该放哪里呢?引荐放到模型里或许独自树立一个辅佐(helper)模块。

当然,从模型得到一个Author,获取Author列表的代码是能够放到视图里边的。

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

咱们常常忘记在布置时禁用DEBUG,有许多种办法主动来处理这个装备:

import socket  
  
if socket.gethostname() == 'productionserver.com':  
    DEBUG = False
else:  
    DEBUG = True


另一种途径是运用不同的装备文件:

#文件名:settings_debuy.py
#包括调试形式的装备信息
#http://www.vztug.com
#运用python manage.py runserver settings=settings_debug.py来运转项目
  
from settings import * 
  
DEBUG = True
  
#还能够装备更多在调试时运用的变量:)


6,只加载一次自界说的模板标签

当需求运用自界说或许第三方的模板标签和模板过滤器时,一般要在模板中运用:

{% load template_tags %}


实际情况是,需求在一切用到自界说模板标签和模板过滤器的模板中都运用上面的代码,这样就不DRY了。

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文件中,比方:

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中,这样能够使运用更简单重复运用到不同项目里:

urlpatterns = patterns('',  
  (r'^$', include('institution.urls')),  
  (r'^institution/', include('institution.urls')),  
  (r'^askalumini/', include('askalumini.urls')),  
  (r'^member/', include('member.urls')),  
)


如下是运用askalumini的urls.py:

urlpatterns = patterns('askalumini.views',  
  url(r'^$','askHome',name='askaluminiurl'),  
  url(r'^questions/(?P<questionno>\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文件中有如下代码:

HttpResponseRedirect("/askalumini/questions/54")


请改为:

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


在模型中运用models.permalink装修器来格局url:

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


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

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


8,调试

调试一般会凭借一些第三方东西来取得更多的运转时信息。

一个恳求执行了多少句SQL?花了多长时间?

调用的哪个模板?客户端设置了什么COOKIE?SESSION呢?。。。

你能够运用django-debug-toolbar检查上面乃至更多的信息

另一个东西是Werkzeug debugger,它能够在过错页面翻开python shell,让你更便利的盯梢过错信息

还有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增强了模板的比较标签等功用 ,并供给其他的一些有用特性

Jinja是一个完好的第三方模板体系,能够替换默许模板体系,它供给了许多优胜的特性

3)第三方运用

django command extensions供给了许多有用的指令行功用:

shell_plus加载一切django模型

runserver_plus整合了Werkzeug调试东西

生成模型图表,你能够展现给你的老板

……

上一篇:web.py cookie运用之cookie设置与获取
下一篇:Django装备让其他电脑拜访网站

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854