Django を学び始めたばかりの初心者に注意してください。Django をより良く学び、間違いを減らし、寄り道を避けるのに役立つ 10 の注意点があります。一見の価値があります~~
1. プロジェクトを含めないでください。 name 参照コード内
たとえば、「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>
Whenプロジェクトでは静的ファイルを他のサーバーから提供する必要があります。通常、これは別の http アドレスになるため、すべての /appmedia/ を新しいアドレスに置き換える必要があります。Web サイト用のコードを記述するのは非常に面倒です。
安心の解決策は、ハードコーディングされたパスの代わりに {{ 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 に記述しますが、それはやめてください。これは単体テストやコードの再利用に役立たないためです。
それでは、ビジネス ロジックをどこに配置すべきでしょうか?モデルに組み込むか、別のヘルパー モジュールを作成することをお勧めします。
もちろん、モデルから著者を取得するには、著者リストを取得するコードをビューに配置できます。
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. カスタム テンプレート タグは 1 回だけ読み込みます
カスタムまたはサードパーティのテンプレート タグとテンプレート フィルターを使用する必要がある場合、通常はテンプレート内で使用されます:
{% 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 を適切に設定して使用する
次のような 1 つの urls.py ファイルですべての URL を設定しないでください。
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 ごとに名前が定義されており、ハードコーディングの代わりにビュー、テンプレート、モデルで URL を効果的に処理するのに役立ちます。
名前の一意性を確保するために、URL に d9e2140586af3f582aa15a17724391d3/cb38206ee71ed30031700a862ac4f8d5 という名前を付ける規則に従ってください。
たとえば、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调试工具
生成模型图表,你可以展示给你的老板
……