Aufgepasst, Neulinge, die gerade erst mit dem Erlernen von Django begonnen haben, hier sind zehn Punkte, die Sie beachten sollten, damit Sie Django besser lernen, Fehler reduzieren und Umwege vermeiden können~~
1. Geben Sie den Projektnamen nicht in den Referenzcode ein.
Wenn Sie beispielsweise ein Projekt mit dem Namen „Projekt“ erstellen und eine Anwendung mit dem Namen „App“ enthalten, ist der folgende Code nicht gut:
from project.app.models import Author
Der Nachteil besteht darin, dass Anwendungen und Projekte eng miteinander verbunden sind und Anwendungen nicht einfach wiederverwendbar sind. Wenn Sie den Projektnamen in Zukunft ändern müssen, müssen Sie damit rechnen.
Der empfohlene Ansatz ist:
from app.models import Author
Bitte beachten Sie, dass Sie den Projektpfad in PYTHONPATH konfigurieren müssen.
2. Codieren Sie MEDIA_ROOT und TEMPLATE_DIRS nicht fest.
Verwenden Sie nicht den folgenden Code in der Projektkonfigurationsdatei „settings.py“:
TEMPLATE_DIRS = ( "/home/html/project/templates",) MEDIA_ROOT = "/home/html/project/appmedia/"
Wenn Sie eine Bereitstellung durchführen Produktionsumgebung oder bei der Migration von Servern kann es zu Problemen kommen.
Es wird empfohlen, die folgende Methode zu verwenden:
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'),)
(Sie können auch abspath verwenden. Den Unterschied zu realpath finden Sie unter http://rob.cogit8.org/blog/2009 /Mai/05/django-and-relativity-updated/ )
3. Codieren Sie den Pfad statischer Dateien in der Vorlage nicht fest
Beim Verknüpfen von CSS, Javascript oder Bildern im Vorlage wird die Verwendung der folgenden Methode nicht empfohlen:
<link rel="stylesheet" type="text/css" href="/appmedia/amazing.css" /> <script type="text/javascript" src="/appmedia/jquery.min.js"></script>
Wenn Ihr Projekt erfordert, dass statische Dateien von einem anderen Server bereitgestellt werden, handelt es sich normalerweise um eine andere http-Adresse, dann müssen Sie alle /appmedia ersetzen / mit neuen Adressen und Code für die Website schreiben Es ist langweilig genug.
Die sorgenfreie Lösung besteht darin, {{ MEDIA_URL }} anstelle des hartcodierten Pfads zu verwenden:
<link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}amazing.css" /> <script type="text/javascript" src="{{ MEDIA_URL }}jquery.min.js"></script>
Wie erhalte ich die Vorlagenkontextvariable? Bitte verwenden Sie RequestContext:
return render_to_response("app/template.html", {'var': 'foo'}, context_instance=RequestContext(request))
Sie können auch aktuelle Benutzer- und andere Informationen von RequestContext abrufen
4. Schreiben Sie keinen Geschäftslogikcode in die Ansicht
Lassen Sie sich nicht verwirren. Obwohl Sie möglicherweise viele Bücher und Beispiele gelesen haben, die die Logik in „views.py“ schreiben, tun Sie dies bitte nicht. Weil dies dem Unit-Testen und der Wiederverwendung von Code nicht förderlich ist.
Wo sollte also meine Geschäftslogik platziert werden? Es wird empfohlen, es in das Modell einzufügen oder ein separates Hilfsmodul zu erstellen.
Um einen Autor aus dem Modell zu erhalten, kann natürlich der Code zum Abrufen der Autorenliste in der Ansicht platziert werden.
Vergessen Sie nicht, DEBUG bei der Bereitstellung auf False zu setzen
Wir vergessen oft, DEBUG während der Bereitstellung zu deaktivieren:
import socket if socket.gethostname() == 'productionserver.com': DEBUG = False else: DEBUG = True
Eine andere Möglichkeit besteht darin, verschiedene Konfigurationsdateien zu verwenden:
#文件名:settings_debuy.py #包含调试模式的配置信息 #http://www.pythontab.com #使用python manage.py runserver settings=settings_debug.py来运行项目 from settings import * DEBUG = True #还可以配置更多在调试时使用的变量:)
6. Laden Sie das benutzerdefinierte Vorlagen-Tag nur einmal
Wenn Sie ein benutzerdefiniertes oder ein Drittanbieter-Tag verwenden müssen Vorlagen-Tags und Vorlagenfilter werden normalerweise in Vorlagen verwendet:
{% load template_tags %}
Die tatsächliche Situation ist, dass der obige Code in allen Vorlagen verwendet werden muss, die benutzerdefinierte Vorlagen-Tags und Vorlagenfilter verwenden, daher ist er nicht mehr trocken.
from django import template template.add_to_builtins('app.templatetags.custom_tag_module')
Bitte fügen Sie den obigen Code in ein Modul ein, das beim Start des Projekts geladen werden kann (settings.py, urls.py, models.py usw.).
Die Funktion des obigen Codes besteht darin, benutzerdefinierte Vorlagen-Tags oder Filter zu laden, wenn das Projekt gestartet wird. Sie können überall in der Vorlage verwendet werden, ohne dass {% Load template_tags %} erforderlich ist.
7. Konfigurieren und verwenden Sie URLs entsprechend
Konfigurieren Sie nicht alle URLs in einer urls.py-Datei, wie zum Beispiel:
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"), , )
Die empfohlene Methode besteht darin, jede zu konfigurieren Anwendung Die URLs sind in ihren jeweiligen urls.py konfiguriert, was die Wiederverwendung der Anwendung in verschiedenen Projekten erleichtert:
urlpatterns = patterns('', (r'^$', include('institution.urls')), (r'^institution/', include('institution.urls')), (r'^askalumini/', include('askalumini.urls')), (r'^member/', include('member.urls')), )
Das Folgende ist die urls.py der Anwendung von askalumini:
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") )
Wie gerade erwähnt, sollte der statische Dateipfad nicht fest codiert sein und die URL-Verarbeitungsmethode sollte nicht fest codiert sein. Andernfalls sind beim Ändern einer Adresse mehrere Änderungen erforderlich. Sie können einige URL-Funktionen verwenden damit umzugehen.
In /project/askalumini/urls.py ist für jede URL ein Name definiert, der uns dabei helfen kann, URLs in Ansichten, Vorlagen und Modellen effektiv zu verwalten, anstatt sie hart zu codieren.
Um die Eindeutigkeit des Namens sicherzustellen, folgen Sie bitte der Konvention, die URL als
Zum Beispiel gibt es den folgenden Code in der Datei „views.py“:
HttpResponseRedirect("/askalumini/questions/54")
Bitte ändern Sie ihn in:
from django.core.urlresolvers import reverse HttpResponseRedirect(reverse('askquestiondisplay',kwargs={'questionno':q.id}))
Modelle verwenden in das Modell .permalink decorator zum Formatieren der URL:
@models.permalink def get_absolute_url(self): return ('profileurl2',(),{'userid': self.user.id})
Verwenden Sie das URL-Tag in der Vorlage anstelle der Hardcodierung:
{% 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调试工具
生成模型图表,你可以展示给你的老板
……