讀書筆記一


第一部分 入門
第一章 Django Python實戰
1.3 Python基礎
注釋:Python的注釋是用井字符(#)表示的。
變量和賦值:Python是動態類型的語言,不要先為之聲明一個特定的類型。
1.4 Python標准類型
對象的布爾值: 所有的Python值都可以表示為布爾值。None在做判斷時總是為False。
序列和迭代
序列是一種可以讓你每次獲取一個元素的類型。列表是可變的,可以改變大小的序列,它能夠保存任何數據類型。
元祖是不可改變的。單個元素的元祖要求在最后必須跟一個逗號。
字典是映射類型,它是可變的,無序的,大小可變的鍵值映射。

1.6 異常處理
如果在運行時發生異常的話,解釋權會查找相應的處理語句(handler)。要是再當前函數里沒有找到的話,它會將異常傳遞給上層的調用函數,看看那里能不能處理。如果在最外層(全局"main")還是沒有找到的話,解釋器就會退出,同時打印traceback以便讓用戶找出錯誤產生的原因。

1.7 文件
一個文件對象本身就是一個迭代器

1.8 函數
聲明和調用函數,使用def關鍵字。
關鍵字參數:通過"鍵=值"的形式加以指定
默認參數:參數的默認值是在函數簽名里面用等於號直接指定的。
函數是First-Class對象。當執行def語句的時候,實際上是在創建一個函數對象並將其賦值或綁定到當前名字空間里的一個名字上。
匿名函數:使用lambda關鍵字。
裝飾器:Python的裝飾器指的是一種讓你能改變或者說"裝飾"函數行為的機制,它能讓函數執行一些和原本設計不同,或是在原有基礎上額外的操作。

1.9 面向對象編程
類的定義:使用class關鍵字。
變量self指向的是類的一個特定的實例。
實例化:在Python里只要像調用函數一樣調用類的名字就可以了。

1.10 正則表達式
re模塊:re.search返回一個匹配對象,可以用這個對象的group或groups方法獲取匹配的模式。
查找和匹配: 查找是在目標字符串里搜尋任何匹配的模式,而匹配則表示整個字符串都必須要符合模式的描述。

1.11 常見錯誤
一個模塊可以被導入任意多次,但是它只會被加載一次。
可改變性:指的是一個對象的值能否改變。所有Python對象都有三個屬性:類型、標識符和值。標識符指的是運行在解釋器里所有對象都有的唯一的一個標識號。

復制對象和可改變性
不可變對象(比如整數)被真正復制,而可變對象只是復制了一個對它們的引用。即在內存中只有一份對象,而有兩份引用。

第二章 Django速成:構建一個Blog
2.1 創建項目
項目:一個包含了組成單個網站的所有文件目錄。使用django-admin.py
django-admin.y startproject mysite
settings.py:包含了項目的默認設置。包括數據庫信息,調試標志以及其他一些重要的變量。
urls.py文件在Django里叫URLconf,它是一個將URL模式映射到你應用程序的配置文件。

2.2 運行開發服務器
python manage.py runserver

2.3 創建Blog應用
python manage.py startapp blog
要告訴Django這個app是項目里的一部分,需要去編輯settings.py文件。打開配置文件並在文件里找到INSTALLED_APPS。把你的app以模塊的形式添加到元祖:'mysite.blog', (注意結尾的逗號)。
Django用INSTALLED_APPS來決定系統里不同部分的配置,包括自動化的admin應用以及測試框架。

2.4 設計你的Model
from django.db import models

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length = 150)
    body = models.TextField()
    timestamp = models.DateTimeField
注意:Django會默認為每個model自動加上一個自增的、唯一的id變量。
這個新建的BlogPost類是django.db.models.Model的一個子類。每一個變量都和普通的類屬性一樣被定義為一個特定變量類(field class)的實例。

2.5 設置數據庫
使用數據庫服務器
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'C:\\Eclipse\\workspace\\mysite\\sqlite.db',    

創建表
python manage.py syncdb
當你執行suncdb的時候,Django會查找INSTALLED_APPS里的每一個models.py文件,並為找到的每一個model都創建一張數據庫表。INSTALLED_APPS里的其他默認條目也都擁有model。

2.6 設置自動admin應用
打開settings.py文件並在INSTALLED_APPS元祖里的'django.contrib.auth',下面添加'django.contrib.admin',
每次往項目里添加新的應用后,都要運行一下syncdb命令確保它所需的表已經在數據庫里創建了。
設置完app后,需要為它指定一個URL這樣才能訪問它。在urls.py文件中
    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
    
最后,你的應用程序需要告訴Django要在admin窗口里顯示哪一個model以供編輯。只要定義之前提到的admin站點,並向其注冊BlogPost model就行了。

2.7 試用admin
再次運行python manage.py runserver命令,在瀏覽器中輸入http://127.0.0.1:8000/admin/
三個最常見的"我的app沒有顯示在admin里"的原因是
1. 忘記向admin.site.register注冊你的model類
2. models.py里面有錯誤
3. 忘記在settings.py中得INSTALLED_APP里添加app
更新mysite/blog/models.py文件,添加以供BlogPostAdmin類,並將它加到注冊代碼那一行。
class BlogPostAdmin(admin.ModelAdmin):
    list_display = ('title', 'timestamp')
    
admin.site.register(BlogPost, BlogPostAdmin)
開發服務器會注意到你的修改並自動重新加載model文件。

2.8 建立Blog的公共部分
一個頁面具有三個典型的組件:
1. 一個模板(template),模板負責將傳遞進來的信息顯示出來(用一種類似Python字典的對象Context)
2. 一個視圖(view)函數,它負責獲取要顯示你的信息,通常都是從數據庫里取得。
3. 一個URL模式,它用來把收到的請求和你的視圖函數匹配,有時也會向視圖傳遞一些參數。

創建模板
它就是一個HTML加上一些大括號里的特殊模板標簽。這些是變量標簽(variable tag),用於顯示傳遞給模板的數據。在變量標簽里,你可以用Python風格的dotter-notation(點記號)來訪問傳遞給模板的的對象的屬性。
{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{post.timestamp}}</p>
<p>{{ post.body }}</p>
{% endfor %}

for塊標簽,用它將模板渲染到序列中的每個元素上。塊標簽是包含在{% .. %}里。
Django在默認情況下會在搜索模板時逐個查看你安裝的應用程序下的每一個templates目錄。

創建一個視圖函數
編寫一個從數據庫讀取所有blog帖子的視圖函數,並用我們的模板將它們顯示出來。打開blog/views.py輸入:
from django.template import loader, Context
from django.http import HttpResponse
from mysite.blog.models import BlogPost

def archive(request):
    posts = BlogPost.objects.all()
    t = loader.get_template("archive.html")
    c = Context({"posts": posts})
    return HttpResponse(t.render(c))

1. 每個Django視圖函數都將django.http.HttpRequest對象作為它的第一個參數。它還可以通過URLconf介紹其他參數。
2. 把BlogPost類作為django.db.model.Model的一個子類時,就獲得了Django對象關系映射的全部力量。這一行只是使用ORM(對象關系映射)獲取數據庫里所有BlogPost對象。
3. 告訴Django模板的名字就能創建模板對象t,因為我們保存在app下的templates目錄。
4. Django模板渲染的數據是由一個字典類的對象context提供的,這里的context c只有一對鍵和值。
5. 每個Django視圖函數都會返回一個django.http.HttpResponse對象。最簡單的就是給其構造函數傳遞一個字符串。這里模板的render方法返回的正是一個字符串。

創建一個URL模式。
第一步和激活admin很相似。在mysite/urls.py里面有一行被注釋的代碼,改成:
    url(r'^blog/', include('mysite.blog.urls')),
這會捕捉任何以blog/開始的請求,並把它們傳遞給一個你馬上要新建的URLconf。
第二步是在blog應用程序包里定義URL。創建一個包含如下內容的新文件:mysite/blog/urls.py
from django.conf.urls.defaults import *
from mysite.blog.views import archive

urlpatterns = patterns('', url(r'^$', archive))
URL請求和根URLconf匹配的blog/已經被去掉了--這樣blog應該程序就變得可以重用了。urlpatterns里的正則表達式可以匹配任何URL,比如/blog/。
視圖函數archive是在模式元祖第二部分提供的。(注意我們傳遞的不是函數的名字,而是一個first-class的函數對象。當然用字符串也行)
執行manage.py runserver啟動開發服務器,在瀏覽器里輸入http://localhost:8000/blog/,你可以看到一個頁面,顯示所有你輸入的blog帖子,有標題、發布時間和帖子本身。

2.9 最后的潤色
模板的精確定位:
在Django里的爭取的做法是創建一個基礎模板,然后在這基礎上擴展出其他特定模板來。
在mysite/blog/templates目錄下,創建一個叫base.html的模板,內容如下:
<html>
    <style>
        body {color: #efd; background: #453; padding: 0 5em; margin: 0}
        h1 {padding: 2em 1em; background: #675}
        h2 {color: #bf8; border-top: 1px dotted #fff; margin-top: 2em}
        p {margin: 1em 0}
    </style>
    <body>
        <h1>mysite.example.com</h1>
        {% block content %}
        {% endblock %}
    </body>
</html>

注意    {% block content %}標簽,它定義了一個子模板可以修改的命名塊(named block)。修改archive.html模板,讓它引用新的基礎模板和它的content塊,就能在blog app里使用它了。
{% extends "base.html" %}
{% block content %}
{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{post.timestamp}}</p>
<p>{{ post.body }}</p>
{% endfor %}
{% end block %}
這里的{% extends ...%}標簽告訴Django去找一個叫base.html的標簽,並將這個模板里命名塊的所有內容填入到那個模板里相應的塊里去。

按日期排序
可以在model里加入一個默認的順序,或者在視圖代碼里的BlogPost.objects().all()上添加排序功能。如果在model里設置我們想要的排序方式,Django里任何訪問數據的部分都會采用這個排序結果。
設置model默認排序的方法是給它設定一個Meta嵌套類。然后設置ordering屬性。
    class Meta:
        ordering = ('-timestamp', ) #千萬不要忘了小括號結尾的那個逗號,它代表的是一個單元素的元祖,而不是一個帶小括號的字符串。Django在這里要的是一個元祖,你可以排序任意數目的變量。
現在看一下blog的首頁(/blog/)。最新的帖子應該出現在頁面最上方了。字符串"-timestamp"告訴Django對"timestamp"變量安裝降序排列。(如果省略"-"的話則是按升序排列)

通過模板過濾器格式化時間戳。
打開archive.html文件並修改post.timestamp一行。
<p>{{post.timestamp|date}}</p>
也可以傳遞一個strftime風格的格式化字符串作為它的參數。
<p>{{ post.timestamp|date:"1, F jS" }}</p>
注意不要在冒號兩邊留有空格--Django的模板引擎對空格敏感。

第三章 起始
3.1 動態網站基礎
用戶向Web服務請求一個文檔;Web服務器隨即獲取或生成這個文檔;服務器再把結果返回給用戶的瀏覽器;最后瀏覽器將這個文檔渲染出來。

通信: HTTP、URL、請求、響應
HTTP主要是由請求(request, 客戶端到服務器端)和響應(response, 服務器端到客戶端)兩個部分組成。請求封裝了過程的第一部分--客戶端向服務器端要求一個給定的文檔。請求的核心就是URL(指向所需文檔的"路徑"),當然可以通過一系列方法進一步參數化,讓單個的地址或URL展現多種行為。
響應主要是由一個正文(body, 通常是web頁面的文本)和相應的包頭(header)組成。包頭里是關於所需數據的額外信息。另外,響應里非HTML的內容可以是純文本、文檔、聲音片段等。
Django將請求和響應表示成相對簡單的Python對象,用屬性來表示其數據,以及用方法來進行更復雜的操作。

數據存儲:SQL和關系數據庫
Django提供了一個強大的ORM機制,Python的類就代表了表,對象代表了其中的每一行,而對象的屬性則代表了列。

表示:將模板渲染成HTML或其他格式

組合在一起
3.2 理解模型、視圖和模板
分層(MVC):應用程序被分割成模型(控制數據),視圖(定義顯示的方法),以及控制器(在兩者之間斡旋,並且讓用戶可以請求和操作數據)

Django的辦法
首先模型部分保持不變:Django的模型只負責把數據傳入傳出數據庫。Django里的視圖並不是顯示數據的最后一步--Django的視圖其實更接近MVC里傳統意義上的控制器。它們是用來將模型層和表示層連接在一起的Python函數。

模型
視圖:
它們是鏈接到一個或多個定義URL上的Python函數。這些函數都返回一個HTTP響應對象。
模板

3.3 Django架構總覽
收到的HTTP請求被Web服務器轉發給Django,Django在請求的中間件層接受它們。隨后根據URLconf模式匹配分配到是和的視圖上去,視圖會執行所需工作的核心部分,用模型(model)和/或模板(template)按需要生成響應。隨后響應再次穿過中間件層進行最后的處理,最后將HTTP響應返回給Web服務器並轉發給用戶。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM