尽管Django的流行和普及, 一些开发者仍然认为她是一个过时的web开发框架, 仅仅适合内容丰富的web程序。 然而现在大多数web程序往往不是富内容的, 这似乎让Django看起来不是最佳选择的web框架。
那么让我们花点时间从现在的web开发实践中重新认识下她吧。
简单清晰的Django
一个web框架主要是帮助web程序生成核心的架构, 以便在其他的项目中重用。 Django正是以此为基础, 快速构建web程序。 Django的核心主要是WSGI程序, 通过处理HTTP请求并返回有意义的HTTP应答。 她提供了各种工具, 像生成URL路由, cookie的处理, 解析表单数据和上传文件。
还有, Django为HTTP应答创建了动态的模板引擎。你可以立马使用, 为了丰富web程序构建体验, 她提供了很多的各种各样的过滤器和标签, 去创建动态的可扩展模板。
通过这些工具, 你能轻松地在Django的项目中创建简单清晰的微型框架。
我们知道有些人喜欢自己造*。 我们不是说贬低这种行为, 但是使用Django开发的话会让我们有更少的干扰。 比如, 当你在纠结 Jinja2,, Mako, Genshi, Cheetah的时候, 你可能已经在使用Django已存在的模板引擎。 更少的纠结让我们更多的享受愉快的开发过程。
培训新的Django使用者
在Django和其他的web框架的社区中有一个很大的问题, 就是对新使用者的培训问题。 就像有很多Django使用者是通过Django官网上的创建一个投票程序来学习Django的。 我们很多老道的Django开发者认为它是一个进入Django社区的“通过仪式”。 但是它是学习Django最好的方法吗? 我觉得不是。
目前, 这个投票程序有六个部分。 虽然每个部分都有它的意义, 但是直到第三个你才能写你的视图和构造HTTP应答。 相比较简单的“Hello World”程序在某些流行的python微型框架(像Flask和Bottle)的首页而言, 这太遥远了。 最好的学习方法是当我们学习Django的某一块的时候没有过多的阻碍, 并且能够专注于处理请求和应答的交互上。 新使用者在构建常见的web任务的时候能从框架的其他部分中获得帮助, 像回话管理, 用户验证和内置的admin接口。
那么, 按照我们的意思来构建一个简化版的Django教程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import sys
from django.conf import settings
from django.conf.urls import patterns
from django.http import HttpResponse
from django.core.management import execute_from_command_line
settings.configure(
DEBUG = True ,
SECRET_KEY = 'placerandomsecretkeyhere' ,
ROOT_URLCONF = sys.modules[__name__],
)
def index(request):
return HttpResponse( 'Powered by Django' )
urlpatterns = patterns('',
(r '^$' , index),
)
if __name__ = = "__main__" :
execute_from_command_line(sys.argv)
|
简单吧。 这段简短的代码是运行Django项目所需要的全部。 让我们开始逐步解释下各部分代码吧。
首先, 我们需要确保引入了HttpResponse, 并且返回我们希望返回的内容。
1
2
3
4
|
from django.http import HttpResponse
def index(request):
return HttpResponse( 'Powered by Django' )
|
一般来说, 这段代码应该在view.py里面。 不过在这个简化版的教程中, 我们把Django项目中所有代码放在一个单一的文件。
应用的当前部分与下一部分的完美纽带是链接结构。上面的代码就期望这样的一个url索引,所以我们需要为它创建一个。
1
2
3
4
5
6
7
8
9
|
from django.conf.urls import patterns
from django.http import HttpResponse
def index(request):
return HttpResponse( 'Powered by Django' )
urlpatterns = patterns('',
(r '^$' , index),
)
|
仅仅通过以上7行代码我们就为应用程序构建好了在Django上运行的基础!现在,让我们完成一些基本设置,使应用程序可以执行起来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import sys
from django.conf import settings
from django.conf.urls import patterns
from django.http import HttpResponse
settings.configure(
DEBUG = True ,
SECRET_KEY = 'placerandomsecretkeyhere' ,
ROOT_URLCONF = sys.modules[__name__],
)
def index(request):
return HttpResponse( 'Powered by Django' )
urlpatterns = patterns('',
(r '^$' , index),
)
|
你可能已经发现在上面的例子中,我们已经剥离了那些设置,并且尤其是省略了数据库的配置。这些设置将可以作为一个针对新用户进入的门槛,当这些新用户试图确定使用什么数据库时,可能避免出现混乱的情况。当开发一个项目时,我们希望确保自己的工作专注于特定部分,从而降低工作中的阻碍。
注意:在settings.configure文件里设置随机的 SECRET_KEY以便保护session and cross-site request forgery (CSRF).
由于没有使用 start project命令生成该结构,我们会丢掉manage.pyfile文件.因此需要手工添加相关的manage.pyand信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import sys
from django.conf import settings
from django.conf.urls import patterns
from django.http import HttpResponse
from django.core.management import execute_from_command_line
settings.configure(
DEBUG = True ,
SECRET_KEY = 'placerandomsecretkeyhere' ,
ROOT_URLCONF = sys.modules[__name__],
)
def index(request):
return HttpResponse( 'Powered by Django' )
urlpatterns = patterns('',
(r '^$' , index),
)
if __name__ = = "__main__" :
execute_from_command_line(sys.argv)
|
现在可以从命令行启动应用了:
1
|
$ python project_name.py runserver
|
访问 127.0.0.1:8000, 会看到 “Powered by Django”页面了!
看到这里, 你可能要问: “模型和视图在哪呢?”。 在此之前让我们先放松一下。 让我们讨论下Django到底是什么--她是一个包含一系列我们经常需要用到的工具的web框架, 并且你能很容易在项目中引用它们。 接下来我们将介绍如何引入这些工具。 构建一个模板就是个不错的列子。 让我们开始动手吧。
添加模板文件前我们要添加urls和一些必要设置, 要让Django知道模板文件放在哪。 把这些设置添加到文件里吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import os
import sys
BASE_PATH = os.path.dirname(__file__)
from django.conf import settings
from django.conf.urls import patterns, url
from django.core.management import execute_from_command_line
from django.shortcuts import render
settings.configure(
DEBUG = True ,
SECRET_KEY = 'placerandomsecretkeyhere' ,
ROOT_URLCONF = sys.modules[__name__],
TEMPLATE_DIRS = (
os.path.join(BASE_PATH, 'templates' ),
),
)
def index(request):
return render(request, 'index.html' , { 'request' : request})
urlpatterns = patterns('',
url(r '^$' , index, name = 'index' ),
)
if __name__ = = "__main__" :
execute_from_command_line(sys.argv)
|
你会注意到在顶部我们增加了os.path Python模块的导入。通过这样做,我们已经为新用户创建了一种容易的方式指向他们的项目文件夹。现在我们能在我们的TEMPLATE_DIRS设置中轻松的添加指向模板的路径,并开始体验Django的内置标签和过滤器的优势!
正如你可以看到,通过将创建一个Django应用程序的基础部分分解成较小的部分,我们可以创建一个更简单的方法给内建的新用户。我们需要重新学习怎样让Django在没有ORM和Django管理的时候创建Django应用程序。需要认识到Django的那些内置功能他们真是的是什么。在使用框架时他们不是必须的,如果你感觉他们不是必须的,你并没有失去太多。我们开始使用Django好的部分而不是感觉它的重量,就像我们学习Python的标准库。让我们开始移去过时的东西,看看它的源码,功能真的是很丰富。
因此,基于所有的这些,在轻量的模式中你正在考虑构建一些能够开发什么的应用程序?