剛開始學習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.pythontab.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命名為
舉例來說,在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})
在模型中使用models.permalink裝飾器來使用格式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调试工具
生成模型图表,你可以展示给你的老板
……