我是边看Django相关文档边整理的这篇博客,相当于学习笔记,写的有点乱,如果你已经了解Django开发,就不用看了,不过这里还是涉及到了一点Django的设计思路,对理解Django还是有些好处的,文后有Django中英文档链接。
概述
本质上来说, Django 只不过是用 Python 编写的一组类库。 用 Django 开发站点就是使用这些类库编写 Python 代码。 因此,学习 Django 的关键就是学习如何进行 Python 编程并理解 Django 类库的运作方式。 ##环境准备## Django的安装请直接官方文档Django 安装章节 很容易懂,不多说了,如果搞不定推荐看看这篇博客
开始一个项目
执行命令创建Django项目的骨架
django-admin.py startproject mysit
创建的Django项目目录结构如下
mysite/
__init__.py
manage.py
settings.py
urls.py
启动服务
python manage.py runserver
控制台打印如下信息:
Validating models...
0 errors found
March 18, 2014 - 10:42:35
Django version 1.6.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
此时已经启动web服务,默认端口号为8000
浏览器访问 http://127.0.0.1:8000/ 展示出Django的欢迎 界面,就是这么简单
世界你好 Hello World
代码编写,建议您使用python自带的IDLE编辑器
编写视图(你会注意到Django的视图概念类似我们常说的MVC里的控制器C,概念稍有不同,后面会解释)
新建views.py,代码入下
from django.http import HttpResponse def hello(request): return HttpResponse('Hello world')
绑定视图
编辑urls.py(这个文件是框架生成的,在mysite目录下,为url映射文件)新增一行代码
url('^hello/$', hello),
后如下from django.conf.urls import patterns, include, url from django.contrib import admin from mysite.views import hello admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'mysite.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), # 这一行为新增,将url xxx/hello/ 映射到方法视图的函数 hello url('^hello/$', hello), )
浏览器访问 http://127.0.0.1:8000/hello 会展示你的Hello World
Django是怎么处理请求的
- 进来的请求转入/hello/.
- Django通过在ROOT_URLCONF配置(settings.py里面配置的)来决定根URLconf.
- Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
- 如果找到匹配,将调用相应的视图函数
- 视图函数返回一个HttpResponse
- Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来
第二个例子:展示下动态内容
编写视图 修改views.py,代码如下
from django.http import HttpResponse import datetime def hello(request): return HttpResponse('Hello world') def datetime_now(request): now=datetime.datetime.now() html="<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
修改视图
修改urls.py 类似上面新增一行映射代码
url(r'^nowtime/$', datetime_now),
浏览器访问 http://127.0.0.1:8000/nowtime 会展示当前时间在网页上
通过两个例子,已经可以看到,视图的函数总是接收一个request参数并且返回一个HttpResponse
再来一个例子
在这个例子中,看一下动态ur的处理,比如下面这种,你总不能每个都url都静态绑定进去,这里要用到正则表达式
,我们在例子中展示几个小时候的时间,给一个两位整数的小时偏移量
book/1
book/2
book/222
编辑视图
修改views.py,代码如下
from django.http import HttpResponse , Http404 import datetime #...省略部分代码... def hours_ahead(request, offset): try: offset = int(offset) except ValueError: raise Http404() dt = datetime.datetime.now() + datetime.timedelta(hours=offset) html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html)
绑定视图
修改urls.py,继续增加一行映射代码url(r'^nowtime/plus/(\d{1,2})/$', hours_ahead),
注意用圆括号把 \d{1,2} 包围起来:
浏览器访问
http://127.0.0.1:8000/nowtime/plus/2
http://127.0.0.1:8000/nowtime/plus/22
http://127.0.0.1:8000/nowtime/plus/7
Django模板技术解决html的硬编码
如上例子中的,html代码是写在python代码中的,下面介绍Django的模板技术,解决这种紧耦合,解耦网页设计和python代码,下面使用模板技术重写第二个例子
写模板
在mysite下新建文件夹templates用于存放所有模板,新建
datetime_now.html
,内容如下<html><body>It is now {{ datetime_now }}.</body></html>
修改视图
from django.http import HttpResponse , Http404 from django.template import Template , Context from django.template.loader import get_template import datetime #...省略部分代码... def datetime_now(request): now=datetime.datetime.now() #使用loader加载模板,创建Template对象 t=get_template('datetime_now.html') #创建Context对象,调用render()方法 html=t.render(Context({'datetime_now':now})) return HttpResponse(html)
另外还需要配置模板的路径,修改settings.py 增加如下,其中BASE_DIR是已有代码
#这行会是已经有的代码
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
#下面的为新增代码
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'templates').replace('\\','/'),
)
同样,浏览器访问 http://127.0.0.1:8000/nowtime 会展示当前时间在网页上
##数据模型层##
首先,Django对数据模型层的支持真心不错,下面例子选择内置的sqlite3作为数据库,因为简单
数据库的配置在settings.py里,sqlite的配置最简单,如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
因为Django默认约束如果使用到数据库(模型层)必须要创建app,实际上也是这样,一般一个 project包含多个app
下面创建一个app,名字为polls
python manage.py startapp polls
创建后的目录结构如下
polls/
__init__.py
models.py
tests.py
views.py
编辑models.py 定义模型
from django.db import models
from django.utils import timezone
import datetime
# Create your models here.
class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
你可以看出,上面定义了Poll 和 Choice两个实体,一对多关系,每个字段的名字,长度,类型 都是和数据库表对应起来的
编辑 settings.py 文件,激活你的app
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
)
检查模型有效性
python manage.py validate
查看数据库语句
python manage.py sqlall polls
你将会看到生成的建表语句,表名字段名等生成规则是可以自定义的
上面只是浏览,下面这条语句会真正执行创建表的动作
python manage.py syncdb
如你所见,表已经创建好了
启动shell
python manage.py shell
下面,执行下面的语句熟悉下django提供的数据操作API吧
>>> from polls.models import Poll, Choice
# 引入类
# 返回空的列表,因为还没有插入数据
>>> Poll.objects.all()
[]
#创建一个Poll,使用django的timezone模块
>>> from django.utils import timezone
>>> p = Poll(question="What's new?", pub_date=timezone.now())
# 保存到数据库
>>> p.save()
#id是自动生成的
>>> p.id
1
# 通过属性访问数据库字段
>>> p.question
"What's new?"
>>> p.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# 改变属性并保存
>>> p.question = "What's up?"
>>> p.save()
# 显示数据库的所有Poll,这里因为没有写__str__()方法(python2.x是__unicode())所以显示成这样,类似于Java的toString
>>> Poll.objects.all()
[<Poll: Poll object>]
###至此就差不多了,我去继续熟悉python和django的API了###
Django 的 MTV (MVC)
Django 的设计遵循MVC
Django中 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
M 代表模型(Model),即数据存取层。与传统 MVC 的 M 概念一致
T 代表模板(Template),即表现层。相当于 MVC 中的 V, 类比JSP,Velocity和Freemarker
V 代表视图(View),即业务逻辑层。相当于 MVC 中的 C,类比Spring的Controller或Struts的Action
MVC还是MTV,只是概念问题
参考文献
Django官方文档英文还可以的话当然建议看这个
Django中文手册(比较旧)