`
waveeee
  • 浏览: 50644 次
  • 来自: 上海
社区版块
存档分类
最新评论

Django新手需要注意的10个要点

阅读更多

接触django是从上个月开始,学习python时间也不长,但我经常在社区看看别人发表的文章,早上看到一篇不错的博客,却一直不能访问,最终从bing的缓存里找到,因为害怕丢失和忘掉,所以顺便翻译过来,放到这里,同时也分享给大家,贡献给各位django初学的朋友们,希望能有一些帮助:)


原文地址是:http://zeroandone.posterous.com/top-10-tips-to-a-new-django-developer

 

 

1,不要将项目名称包含在引用代码里

 

比如你创建了一个名为"project"的项目,包含一个名为"app"的应用,那么如下代码是不好的:

 

Python代码  收藏代码
  1. from project.app.models import Author  

 

缺点在于:应用和项目变成了紧耦合,无法将应用轻易变得可重用。如果将来要换一个项目名称,那你可有得受了。

 

推荐的做法是:

 

Python代码  收藏代码
  1. from app.models import Author  

 

请注意,你需要将项目的路径配置在PYTHONPATH中。

 

2,不要硬编码MEDIA_ROOT和TEMPLATE_DIRS

 

项目配置文件settings.py中不要使用如下代码:

 

Python代码  收藏代码
  1. TEMPLATE_DIRS = ( "/home/html/project/templates",)  
  2. MEDIA_ROOT = "/home/html/project/appmedia/"   

 

当你在部署到生产环境,或者迁移服务器的时候,就会发生问题。

 

推荐使用如下方式:

 

Python代码  收藏代码
  1. SITE_ROOT = os.path.realpath(os.path.dirname(__file__))  
  2. MEDIA_ROOT = os.path.join(SITE_ROOT, 'appmedia')  
  3. 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或图片的时候,不建议使用如下方式:

 

Html代码  收藏代码
  1. <link rel="stylesheet" type="text/css" href="/appmedia/amazing.css" />  
  2. <script type="text/javascript" src="/appmedia/jquery.min.js"></script>  
 

当你的项目需要将静态文件用其他服务器提供的时候,通常会是另外一个http地址,那么你就得把所有的/appmedia/替换成新的地址,做网站写代码已经够乏味的了。

 

没有后顾之忧的解决方法是使用{{ MEDIA_URL }}代替硬编码的路径:

 

Html代码  收藏代码
  1. <link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}amazing.css" />  
  2. <script type="text/javascript" src="{{ MEDIA_URL }}jquery.min.js"></script>  
 

模板上下文变量怎么获取到呢?请使用RequestContext即可:

 

Python代码  收藏代码
  1. return render_to_response("app/template.html", {'var''foo'},  
  2. context_instance=RequestContext(request))  
 

从RequestContext里还可以获取到当前用户等信息,更详细的介绍请参考:http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/

 

4,不要将业务逻辑代码写到视图里

 

不要迷惑,虽然你可能看过很多书和例子,它们把逻辑都写在了views.py里,但请你别这么做。因为这样不利于单元测试,不利于重用代码。

 

那我的业务逻辑应该放哪里呢?推荐放到模型里或者单独建立一个辅助(helper)模块。

 

当然,从模型得到一个Author,获取Author列表的代码是可以放到视图里面的。

 

5,部署时别忘记将DEBUG设置成False

 

我们常常忘记在部署时禁用DEBUG,有很多种方法自动来处理这个配置:

 

Python代码  收藏代码
  1. import socket  
  2.   
  3. if socket.gethostname() == 'productionserver.com':  
  4.     DEBUG = False  
  5. else:  
  6.     DEBUG = True   

 

此方法请参考:http://nicksergeant.com/blog/django/automatically-setting-debug-your-django-app-based-server-hostname

 

另一种途径是使用不同的配置文件:

 

Python代码  收藏代码
  1. #文件名:settings_debuy.py  
  2. #包含调试模式的配置信息  
  3. #使用python manage.py runserver settings=settings_debug.py来运行项目  
  4.   
  5. from settings import *  
  6.   
  7. DEBUG = True  
  8.   
  9. #还可以配置更多在调试时使用的变量:)  
 

此方法请参考:http://blog.dpeepul.com/2009/07/02/from-now-you-will-never-forget-to-put-debug-true-in-django-production-environment/

 

6,只加载一次自定义的模板标签

 

当需要使用自定义或者第三方的模板标签和模板过滤器时,通常要在模板中使用:

 

Python代码  收藏代码
  1. {% load template_tags %}  
 

实际情况是,需要在所有用到自定义模板标签和模板过滤器的模板中都使用上面的代码,这样就不DRY了。

 

Python代码  收藏代码
  1. from django import template  
  2.   
  3. template.add_to_builtins('app.templatetags.custom_tag_module')  
 

请将以上代码放到项目启动时能加载的模块中(settings.py, urls.py, models.py等)即可。

 

上面代码的作用是在项目启动时就把自定义模板标签或过滤器加载进来,模板中任何一个地方都可以使用它们,而不需要{% load template_tags %}。

 

7,合理配置和使用URL

 

不要将URL全都配置在一个urls.py文件中,比如:

 

Python代码  收藏代码
  1. urlpatterns = patterns('',  
  2.   url(r'^askalumini/question/$','.....registerInstitution',name='iregister'),  
  3.   url(r'^askalumin/answer/$','someview.....',name='newmemberurl'),  
  4.   url(r'^institution/member/$','someview.....',name="dashboardurl"),  
  5.   url(r'^institution/faculty/$','editInstitute',name="editinstituteurl"),  
  6.   url(r'^memeber/editprofile/$','editProfile',name="editprofileurl"),  
  7.   url(r'^member/changepassword/$','changePassword',name="changepasswordurl"),  
  8.   url(r'^member/forgotpassword/$','forgotPassword',name="forgotpasswordurl"),  
  9.   url(r'^member/changepicture/$','changePicture',name="changepictureurl"),  
  10.   url(r'^member/logout/$','memeberlogout',name="logouturl"), ,  
  11. )  
 

建议的方式是将各应用的URL配置在各自的urls.py中,这样可以使应用更容易重复使用到不同项目里:

 

Python代码  收藏代码
  1. urlpatterns = patterns('',  
  2.   (r'^$', include('institution.urls')),  
  3.   (r'^institution/', include('institution.urls')),  
  4.   (r'^askalumini/', include('askalumini.urls')),  
  5.   (r'^member/', include('member.urls')),  
  6. )  
 

如下是应用askalumini的urls.py:

 

Python代码  收藏代码
  1. urlpatterns = patterns('askalumini.views',  
  2.   url(r'^$','askHome',name='askaluminiurl'),  
  3.   url(r'^questions/(?P<questionno>\d+)/$','displayQuestion',name='askquestiondisplay'),  
  4.   url(r'^askquestions/$','askQuestion',name='askquestionurl'),  
  5.   url(r'^postcomment/$','postComment',name="askquestioncomment")  
  6. )  
 

刚才提到静态文件路径不要硬编码,url的处理方式也尽量不要硬编码,否则当你更改一个地址时会牵涉到多处的修改,可以使用一些url函数来处理。

 

在/project/askalumini/urls.py中,为每一个url定义了name,它可以帮助我们有效地在视图、模板和模型中处理url,而不是硬编码。

 

为保证名称的唯一,请遵照将url命名为<appname>/<somelabel>的习惯用法。

 

举例来说,在views.py文件中有如下代码:

 

Python代码  收藏代码
  1. HttpResponseRedirect("/askalumini/questions/54")  
 

请改为:

 

Python代码  收藏代码
  1. from django.core.urlresolvers import reverse  
  2. HttpResponseRedirect(reverse('askquestiondisplay',kwargs={'questionno':q.id}))   

 

在模型中使用models.permalink装饰器来格式url:

 

Python代码  收藏代码
  1. @models.permalink  
  2. def get_absolute_url(self):  
  3.     return ('profileurl2',(),{'userid'self.user.id})  
 

在模板中使用url标签代替硬编码:

 

相关推荐

    (简体中文) Python新手使用Django架站的16堂课

    本书分4部分 以16堂课来介绍Python新手使用Django架站的要点。靠前部分-靠前~3堂以一个小型的个人博客网站为主轴 介绍如何快速建立一个实用的Django网站;D1二部分-D14~7堂是Django架构深入剖析 详细分析Django的...

    Django开发的一个简单的员工管理系统源码.zip

    Django开发的一个简单的员工管理系统源码 Django开发的一个简单的员工管理系统源码 Django开发的一个简单的员工管理系统源码 Django开发的一个简单的员工管理系统源码 Django开发的一个简单的员工管理系统...

    Python基于Django框架实现的一个学生信息管理系统源码.zip

    Python基于Django框架实现的一个学生信息管理系统源码 Python基于Django框架实现的一个学生信息管理系统源码 Python基于Django框架实现的一个学生信息管理系统源码 Python基于...

    用Django写的一个简单的OA办公系统源码.zip

    用Django写的一个简单的OA办公系统源码 用Django写的一个简单的OA办公系统源码 用Django写的一个简单的OA办公系统源码 用Django写的一个简单的OA办公系统源码 用Django写的一个简单的OA办公系统源码 用...

    使用python的django开发的一个商城项目源码.zip

    使用python的django开发的一个商城项目源码 使用python的django开发的一个商城项目源码 使用python的django开发的一个商城项目源码 使用python的django开发的一个商城项目源码 使用python的django...

    django电子商务网站源码.zip

    django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django...

    Python + Django 搭建的一个生鲜店源码.zip

    Python + Django 搭建的一个生鲜店源码 Python + Django 搭建的一个生鲜店源码 Python + Django 搭建的一个生鲜店源码 Python + Django 搭建的一个生鲜店源码 Python + Django 搭建的一个生鲜店源码 Python + ...

    前端vue+后端django的一个分享交流平台源码.zip

    前端vue+后端django的一个分享交流平台源码 前端vue+后端django的一个分享交流平台源码 前端vue+后端django的一个分享交流平台源码 前端vue+后端django的一个分享交流平台源码 前端vue+后端django的一个分享...

    Django实现商城网站源码.zip

    Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django...

    Django客户管理系统源码.zip

    Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统...

    django4中文文档

    从事Python编程工作的人员,一定听说过这三个框架:Django、Flask、Tornado,它们就像神一样的存在 Django是最有代表性的一种。许多成功的网站和APP都基于Django。 Django是一个开源的Web应用框架,由Python写成。 ...

    django笔记 django笔记

    django笔记 django笔记

    django项目实例(django 简易博客开发)

    前几天写的django 简易博客开发记录,贴个链接吧 django 简易博客开发 1 安装、创建、配置、admin使用 http://www.cnblogs.com/cacique/archive/2012/09/29/2707976.html django 简易博客开发 2 模板和数据查询 ...

    Django10个使用技巧

    简单的关于Django使用的10个技巧和建议,纯属个人使用心得

    Django版Django版

    Django版 Django版 Django版Django版Django版

    django实现的一个图书管理系统源码.zip

    使用django实现的一个图书管理系统,可以进行借书,还书,后台登录,多用户借书功能。 使用django实现的一个图书管理系统,可以进行借书,还书,后台登录,多用户借书功能。 使用django实现的一个...

    基于python的web框架django开发的一个统计论文发表的系统源码.zip

    基于python的web框架django开发的一个统计论文发表的系统源码 基于python的web框架django开发的一个统计论文发表的系统源码 基于python的web框架django开发的一个统计论文发表的系统源码 基于python的web框架...

    基于Django的个人网盘源码.zip

    基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django...

    Python基于Django的就业系统源码.zip

    基于Django就业系统源码 基于Django就业系统源码 基于Django就业系统源码 基于Django就业系统源码 基于Django就业系统源码 基于Django就业系统源码 基于Django就业系统源码 基于Django就业系统源码 基于...

    Python新手使用Django架站的16堂课的范例 随书光盘

    本书分4部分,以16堂课来介绍Python新手使用Django架站的要点。第一部分(第1~3堂)以一个小型的个人博客网站为主轴,介绍如何快速建立一个实用的Django网站;第二部分(第4~7堂)是Django架构深入剖析,详细分析...

Global site tag (gtag.js) - Google Analytics