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

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的...

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

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

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

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

    Learning Website Development with Django

    作者通过一系列的教程和实践案例,逐步引导读者理解Django的核心概念和技术要点。 - **适合人群**:本书适合那些希望了解和学习Django框架的初学者,包括没有太多编程经验的新手。 - **主要内容**: - **基础知识*...

    md格式编写的良心教程 Python 100天从新手到大师 共100个完整源文件 含课程源代码.rar

    Day01-15\10.图形用户界面和游戏开发.md Day01-15\11.文件和异常.md Day01-15\12.字符串和正则表达式.md Day01-15\13.进程和线程.md Day01-15\14.网络编程入门和网络应用开发.md Day01-15\15.图像和办公文档处理.md ...

    探索Python编程世界的全面指导-从基础知识到实战技巧

    内容概要:本文详述了Python的多重应用场景及其独特价值,覆盖了Python的基础特性、环境搭建步骤、核心编程概念以及更深层次的技术要点。不仅讲解了面向对象编程、异常处理、文件操作等理论知识,还提供了数据科学和...

    Python爬虫总结教学提纲.docx

    - 实践小项目,例如创建一个终端计算器或完成Codecademy上的互动练习。 2. **了解Python标准库和常用第三方库** - 通过官方文档了解Python标准库:`The Python Standard Library`。 - 学习并实践常用的第三方库...

    人事档案管理系统.rar

    对于初学者而言,这是一个很好的学习项目,能够帮助他们理解和掌握软件开发的基本流程和技术要点。 首先,人事档案管理系统的功能模块通常包括以下几个部分: 1. 员工信息管理:这是系统的核心部分,用于录入、...

    Python Essential Reference 4th edition

    - **跨平台开发**:讨论在不同操作系统上开发Python应用时需要注意的问题和解决方案。 #### 三、实践案例与应用场景 - **Web开发**:利用Python进行Web开发的相关技术和框架,如Django、Flask等。 - **数据分析**...

    Python 3 Web Development Beginner's Guide.pdf

    - **Web框架**:介绍多个流行的Python Web框架,如Flask和Django,并通过实例演示如何使用这些框架快速构建Web应用。 - **数据库集成**:讲解如何在Python Web应用中集成数据库,支持常见的关系型数据库如MySQL、...

    投资组合模型.pdf

    无论是对于希望通过实践来巩固理论基础的新手还是希望挑战更高难度项目的进阶学习者来说,都是一个极佳的学习平台。通过这些项目资源的学习和实践,不仅可以帮助个人快速提升技能水平,还能促进整个技术社区的持续...

    python编程经典

    1. **Web开发实战**:通过构建一个简单的Web应用来学习Flask或Django等框架的基本用法。 2. **数据分析项目**:利用Pandas、NumPy等库进行数据清洗、处理和分析的实际操作。 3. **机器学习入门**:介绍如何使用...

    程序员面试宝典(第2版)

    - **编程语言与框架**:深入讲解各种主流编程语言(如Java、C++、Python等)的核心特性和最佳实践,以及相关的开发框架(如Spring、Django等)的应用场景与实现细节。 - **Java**:面向对象特性、集合框架、多线程...

Global site tag (gtag.js) - Google Analytics