python入门系列之(三) 初识Django

我是边看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是怎么处理请求的

  1. 进来的请求转入/hello/.
  2. Django通过在ROOT_URLCONF配置(settings.py里面配置的)来决定根URLconf.
  3. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
  4. 如果找到匹配,将调用相应的视图函数
  5. 视图函数返回一个HttpResponse
  6. 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中文手册(比较旧)

    原文作者:python入门
    原文地址: https://my.oschina.net/wyyft/blog/210361
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞