
正文
使用Django时需要注意的八个要点
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
1. 在 settings.py 中使用 os. path.dirname()
常用代码如下:
# settings.py
import os
PROJECT_DIR = os.path.dirname(__file__)
STATIC_ROOT = os.path.join(PROJECT_DIR, "static")
...
TEMPLATE_DIRS = (
os.path.join(PROJECT_DIR, "templates"),
)
__file__变量表示当前文件,PROJECT_DIR则取得了当前文件的绝对路径,这样做的好处是避免在settings.py中硬编码文件路径.
2. 使用 locals() 为模板传递参数
Python 内建函数 locals() ,返回对所有局部变量的名称与值进行映射的字典.
在实际开发中,不需要为模板写出每一个变量,比如:
return render_to_response('template.html', {"var1": var1, "var2":var2}, context_instance=RequestContext(request))
优化后代码为:
return render_to_response('template.html', locals(), context_instance=RequestContext(request))
由此延伸:
render_dict = locals()
render_dict['also_needs'] = "this value"
return render_to_response('template.html', render_dict, context_instance=RequestContext(request))
3. 部署时将 DEBUG 设置成 False
自动处理的执行代码:
import socket
if socket.gethostname() == 'XXX-MOBL':
DEBUG = False
else:
DEBUG = True
4. 使用 exists() 函数判断是否取得数据
降低性能的代码:
books = Books.objects.filter(author__last_name='Brown')
if books:
# Do something
或者
books = Books.objects.filter(author__last_name='Brown')
if len(books):
# Do something
执行books = Books.Object…语句时并没有连接数据库,进行下一步判断才会实际对数据库进行操作.
exists()函数会判断只要存在数据,就会返回1,不会load模型属性或者在DB和APP之间传递大型数据.
所以,使用exists函数能提高性能,如下:
books = Books.objects.filter(author__last_name='Brown')
if books.exists():
# Do something
5. 合理配置使用 URLs
不要将所有url配置在 (mysite/urls.py)一个文件内,可以根据不同Apps,分别配置在自己的urls.py文件中,这样做的好处之一是简洁明了,并可以容易重复使用App到不同的项目中,示例代码如下:
urlpatterns = patterns('',
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
)
在polls的urls.py文件中存在如下代码:
from polls import views
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
)
比如想实现如下功能,其中硬编码了/polls/,以后有相应变动,会很麻烦.
<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
优化后的代码如下:
<li><a href="{% url 'polls.detail' poll.id %}">{{ poll.question }}</a></li>
{% url %}标签会根据”polls.detail”在mysite/urls.py文件中寻找namespage=”polls”的相应URL,假如poll.id变量为5,演化后的实际代码想象中就是:
<li><a href="项目根目录/polls/5/">{{ poll.question }}</a></li>
这样做另外的好处是,避免了在 template 中硬编码 URL ,这也是 django 编程中要注意的要点(不要在模板中硬编码 URL )
6. 不要在模板中硬编码静态文件路径
不好的代码示范:
<img src="/static/images/test.png">{{ poll.question }}</img>
Django.contrib. staticfiles是静态资源管理的一个App, 相关的设置settings.py主要有三个:
STATIC_ROOT: 项目部署时,需要将所有用到的静态文件(包括INSTALLED_APPS下各个App的static文件夹下文件和STATICFILES_DIRS设置目录下文件)收集到一个目录,交给服务器进行处理(在项目实际部署时,要配置服务器来服务这个目录,请参考下条),STATIC_ROOT就是那个目录,只有在运行collectstatic命令时才会用到.
STATIC_URL: 静态文件的起始目录,浏览器访问时的地址前缀(可以随意修改STATIC_URL值,但是必须以斜线开始,否则找不到静态文件地址).STATIC_URL的目的即请求静态文件时,代表STATIC_ROOT. 所以,在开发阶段,Django会把
STATIC_URL
映射到
django.contrib.staticfiles
,
staticfiles
自动地从
STATICFILES_DIRS和
各个App的
static
子目录里面搜索静态文件. 在布署到生产环境的时候,则需要配置Apache(/etc/apache2/apache2.conf),把
STATIC
映射到
STATIC_ROOT(Alias /static /home/usrname/projectname/static/).
STATICFILES_DIRS: 除了各个app的static目录以外,其他还需要管理的静态文件设置.
优化后的代码:
<img src="{{ STATIC_URL }}/images/test.png">{{ poll.question }}</img>
或者
{% load staticfiles %}
<img src="{% static "my_app/myexample.jpg" %}" alt="My image"/>
7. 只加载一次自定义的模板标签
当需要使用自定义或者第三方的模板标签和模板过滤器时,通常要在模板中使用如下代码:
{% load cms_tags %}
实际情况是,需要在所有用到自定义模板标签和模板过滤器的模板中都使用上面的代码.
为了DRY, 优化后的解决办法是:将以下代码加到项目启动时能加载的文件中(setting.py、urls.py文件 etc.)
from django import template
template.add_to_builtins('cms.templatetags.cms_tags')
8. 了解一些第三方应用
a. 数据迁移 —— South(很好用,推荐)
常用命令:
python manage.py schemamigration youappname –initial
python manage.py schemamigration youappname --auto #检测对models的更改
python manage.py migrate youappnam
python manage.py syncdb
b. Django Debug ——Django-debug-toolbar






