新手學習Django的十條注意點

來源:互聯網
上載者:User
剛剛開始學習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 = Falseelse:     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命名為<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調試工具
產生模型圖表,你可以展示給你的老闆
……

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.