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.staticfilesstaticfiles自动地从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

使用Django时需要注意的八个要点的更多相关文章

  1. Django 系列博客(八)

    Django 系列博客(八) 前言 本篇博客介绍 Django 中的模板层,模板都是Django 使用相关函数渲染后传输给前端在显式的,为了想要渲染出我们想要的数据,需要学习模板语法,相关过滤器.标签 ...

  2. gunicorn启动django时静态文件的加载

    目前在用nginx+gunicorn对django进行部署 当我用gunicorn -w 4 -b 127.0.0.1:8080 myproject.wsig:application启动django时 ...

  3. [Django基础] gunicorn启动django时静态文件的加载

    目前在用nginx+gunicorn对django进行部署 当我用gunicorn -w 4 -b 127.0.0.1:8080 myproject.wsig:application启动django时 ...

  4. 解决nginx+uWSGI部署Django时遇到的static文件404的问题

    昨天是利用Django自带的runserver部署的服务器,但是由于runserver比较不稳定,因此决定采用uWSGI+nginx进行部署. 昨天已经安装好了uwsgi和nginx,使用该指令打开8 ...

  5. 安装Django时解决的问题-mysql及访问(附pycharm激活)

    1.做些软链接和virtualenv的基本使用: ln -s /data/linkdood/im/vrv/python36/bin/python3.6 /usr/bin/python3 ln -s / ...

  6. 使用mysql连接django时,需要的步骤以及错误解决办法

    django默认使用的sqlite3,更改为SQL时需要按照如下操作进行 1.在settings.py中的78行进行更改 DATABASES = { 'default': { 'ENGINE': 'd ...

  7. Django框架(二十八)—— Django缓存机制

    目录 Django缓存机制 一.什么是缓存 二.Django的6中缓存方式及配置(只需要改配置文件) 1.开发调试缓存(此模式为开发调试使用,实际上不执行任何操作) 2.内存缓存(将缓存内容保存至内存 ...

  8. Linux - 运行 django 时 :django.db.utils.Notsupportederror: urls not supported

    运行 django 是异常:django.db.utils.Notsupportederror: urls not supported 原因:sqlite3版本3.7的问题 解决:直接改源码 1. p ...

  9. dapi 基于Django的轻量级测试平台八 Docker部署

    QQ群: GitHub:https://github.com/yjlch1016/dapi 采用Docker+Supervisor+Nginx+uWSGI+Django 一.Dockerfile文件: ...

随机推荐

  1. 报错:WARN [WorkerSender[myid=1]:QuorumCnxManager@584] - Cannot open channel to 2 at election address /x.x.x.x:3888

    报错背景: zookeeper安装完成之后,启动之后正常,但是查看log文件zookeeper.log时发现报错. 报错现象: -- ::, [myid:] - INFO [WorkerSender[ ...

  2. Spring Cloud Eureka 服务发现 4.2

      在微服务架构中,服务发现可以说是最为核心和基础的模块,该模块主要用于实现各个微服务实例的自动化注册与发现.在Spring Cloud的子项目中,Spring Cloud Netflix提供了Eur ...

  3. npm publish 一直报错 404

    在封装 zswui  react ui 组件库的时候,尝试了下 github的 packages 包设置,然后就给自己挖坑了. zswui   这是一个从零开始配置,实现组件开发测试的项目. 因为设置 ...

  4. Elasticsearch - 处理冲突

    http://blog.csdn.net/xifeijian/article/details/49615559

  5. web端自动化——Selenium3+python自动化(3.7版本)-火狐62版本环境搭建

    前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要.本系列依然以selenium3为基础. 一.selenium简介 Sel ...

  6. Keras代码超详细讲解LSTM实现细节

    1.首先我们了解一下keras中的Embedding层:from keras.layers.embeddings import Embedding: Embedding参数如下: 输入尺寸:(batc ...

  7. 雨幕——RainCurtian

    今天19年10月14日,也不算是个什么特别的日子.不多能让我的这一天变得特殊的,或许就是在今天我开通了我的第一个博客吧.细想过来每一天都是那么的相似,不过是因为有了某些事情,才变得特殊起来,比如新生命 ...

  8. JS 多数组中取最大数组,分组

    代码小结,使用 JS 对数据进行分组,对分组中的数组取最大数组: var combineTemplate = JSON.parse(data.combineTemplate); //根据仪器种类ID分 ...

  9. layui开关switch显示不全问题

    先看效果: 开关显示不全,高度也不对称. 解决: 在所用到的html/jsp中自己加css .layui-form-switch { width: 52px; height: 23px; } 再看效果 ...

  10. linux下源码安装rabbitMq

    一.安装erlang前期环境安装1.利用yum安装erlang编译所依赖的环境 yum -y install make gcc gcc-c++ kernel-devel m4ncurses-devel ...