python入門系列之(三) 初識Django

我是邊看Django相關文檔邊整理的這篇博客,至關於學習筆記,寫的有點亂,若是你已經瞭解Django開發,就不用看了,不過這裏仍是涉及到了一點Django的設計思路,對理解Django仍是有些好處的,文後有Django中英文檔連接。html

概述

本質上來講, Django 只不過是用 Python 編寫的一組類庫。 用 Django 開發站點就是使用這些類庫編寫 Python 代碼。 所以,學習 Django 的關鍵就是學習如何進行 Python 編程並理解 Django 類庫的運做方式。 ##環境準備## Django的安裝請直接官方文檔Django 安裝章節 很容易懂,很少說了,若是搞不定推薦看看這篇博客python

開始一個項目

執行命令建立Django項目的骨架web

django-admin.py startproject mysit

建立的Django項目目錄結構以下正則表達式

mysite/
    __init__.py
    manage.py
    settings.py
    urls.py

啓動服務sql

python manage.py runserver

控制檯打印以下信息:shell

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的歡迎 界面,就是這麼簡單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中文手冊(比較舊)

相關文章
相關標籤/搜索