拜讀了網上的Django Book,現在來總結一下吧。。。。。。
一.Django的配置
非常的蛋疼,由於Django的塊組之間耦合度低,這既是它的優點,也是它的缺點。我在Ubuntu所配置的Django的開發環境是:Django1.6+PostgreSQL+Nginx+uwsgi+Memcached(快取機制)。配置起來確實麻煩,但不得不說Nginx的反向代理真的非常好用,uwsgi作為Django和Nginx之間的橋樑。
想知道怎麼配置自己上網查吧。這裡不多說了。
二.Django的幾條重要的命令
>>>python manage.py shell #啟動互動介面 >>>python setup.py install #安裝Django $:django-admin.py startproject mysite #新建一個web專案 >>>python manage.py runserver 埠號 #啟動Django自帶的伺服器 $:uwsgi -s :埠號 -w run_uwsgi(配置檔案)
>>>python manage.py startapp books #新建一個APP
>>>python manage.py syncdb #列印sql語句
三.檢視與URL設定
hello 的demo:
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
同時在urls.py作出相應的配置:
from django.conf.urls.defaults import * from mysite.views import hello urlpatterns = patterns('', ('^hello/$', hello), )
附錄一下Django要用到的正則符號吧(不過還是自己先學一下正規表示式比較好):
符號 | 匹配 |
---|---|
. (dot) | 任意單一字元 |
\d | 任意一位數字 |
[A-Z] | A 到 Z中任意一個字元(大寫) |
[a-z] | a 到 z中任意一個字元(小寫) |
[A-Za-z] | a 到 z中任意一個字元(不區分大小寫) |
+ | 匹配一個或更多 (例如, \d+ 匹配一個或 多個數字字元) |
[^/]+ | 一個或多個不為‘/’的字元 |
* | 零個或一個之前的表示式(例如:\d? 匹配零個或一個數字) |
* | 匹配0個或更多 (例如, \d* 匹配0個 或更多數字字元) |
{1,3} | 介於一個和三個(包含)之前的表示式(例如,\d{1,3}匹配一個或兩個或三個數字) |
Django中請求檢視(request)與響應檢視(response)的過程大抵是這樣:
-
進來的請求轉入/hello/.
-
Django通過在ROOT_URLCONF配置來決定根URLconf.
-
Django在URLconf中的所有URL模式中,查詢第一個匹配/hello/的條目。
-
如果找到匹配,將呼叫相應的檢視函式
-
檢視函式返回一個HttpResponse
6.Django轉換HttpResponse為一個適合的HTTP response, 以Web page顯示出來
四.模板
模板的呼叫並不複雜,但是關於模板的標籤的內容有點多,這部分估計還是要看一下Django Book
下面給出一個有用到模板繼承以及最精簡呼叫試圖的demo:
Bash.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <h1>My helpful timestamp site</h1> {% block content %}{% endblock %} {% block footer %} <hr> <p>Thanks for visiting my site.</p> {% endblock %} </body> </html>
current_datetime.html {% extends "base.html" %} {% block title %}The current time{% endblock %} {% block content %} <p>It is now {{ current_date }}.</p> {% endblock %}
#views.py中的current_datetime函式 from django.shortcuts import render_to_response import datetime def current_datetime(request): now = datetime.datetime.now() return render_to_response('current_datetime.html', {'current_date': now})
五.模型
在將模型之前,先介紹一下Django不同於其他MVC框架的一種另外的思想:MTV思想。
Django 緊緊地遵循這種 MVC 模式,可以稱得上是一種 MVC 框架。 以下是 Django 中 M、V 和 C 各自的含義:
-
M ,資料存取部分,由django資料庫層處理,本章要講述的內容。
-
V ,選擇顯示哪些資料要顯示以及怎樣顯示的部分,由檢視和模板處理。
-
C ,根據使用者輸入委派檢視的部分,由 Django 框架根據 URLconf 設定,對給定 URL 呼叫適當的 Python 函式。
由於 C 由框架自行處理,而 Django 裡更關注的是模型(Model)、模板(Template)和檢視(Views),Django 也被稱為 MTV 框架 。在 MTV 開發模式中:
-
M 代表模型(Model),即資料存取層。 該層處理與資料相關的所有事務: 如何存取、如何驗證有效性、包含哪些行為以及資料之間的關係等。
-
T 代表模板(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其他型別文件中進行顯示。
-
V 代表檢視(View),即業務邏輯層。 該層包含存取模型及調取恰當模板的相關邏輯。 你可以把它看作模型與模板之間的橋樑。
如果你熟悉其它的 MVC Web開發框架,比方說 Ruby on Rails,你可能會認為 Django 檢視是控制器,而 Django 模板是檢視。 很不幸,這是對 MVC 不同詮釋所引起的錯誤認識。 在 Django 對 MVC 的詮釋中,檢視用來描述要展現給使用者的資料;不是資料 如何展現 ,而且展現 哪些 資料。 相比之下,Ruby on Rails 及一些同類框架提倡控制器負責決定向使用者展現哪些資料,而檢視則僅決定 如何 展現資料,而不是展現 哪些 資料。
兩種詮釋中沒有哪個更加正確一些。 重要的是要理解底層概念。
模型的內容有很多,還是自己看一下書吧。
六.管理
Django有自己的管理資料庫的模組,類似與php的phpmyadmin。
七.表單
GET方法的demo:
def search(request): error = False if 'q' in request.GET: q = request.GET['q'] if not q: error = True else: books = Book.objects.filter(title__icontains=q) return render_to_response('search_results.html', {'books': books, 'query': q}) return render_to_response('search_form.html', {'error': error})
POST方法的demo:
from django.core.mail import send_mail from django.http import HttpResponseRedirect from django.shortcuts import render_to_response def contact(request): errors = [] if request.method == 'POST': if not request.POST.get('subject', ''): errors.append('Enter a subject.') if not request.POST.get('message', ''): errors.append('Enter a message.') if request.POST.get('email') and '@' not in request.POST['email']: errors.append('Enter a valid e-mail address.') if not errors: send_mail( request.POST['subject'], request.POST['message'], request.POST.get('email', 'noreply@example.com'), ['siteowner@example.com'], ) return HttpResponseRedirect('/contact/thanks/') return render_to_response('contact_form.html', {'errors': errors})
記得:對於成功的GET請求,我們應使用render_to_response返回;而對於成功的POST請求,我們應用HttpResponseRedirect做重定向,這是web開發的最佳實踐。
八.輸出非html內容
檢視與MIME型別:
檢視函式只是一個以Web請求為引數並返回Web響應的Python函式。這個響應可以是一個Web頁面的HTML內容,或者一個跳轉,或者一個404錯誤,或者一個XML文件,或者一幅圖片,或者對映到任何東西上。
輸出png影象:
from django.http import HttpResponse def my_image(request): image_data = open('/home/dzhwen/swift.jpg') return HttpResponse(image_data,mimetype="image/png")
輸出CSV檔案:
import csv from django.http import HttpResponse # Number of unruly passengers each year 1995 - 2005. In a real application # this would likely come from a database or some other back-end data store. UNRULY_PASSENGERS = [146,184,235,200,226,251,299,273,281,304,203] def unruly_passengers_csv(request): # Create the HttpResponse object with the appropriate CSV header. response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename=unruly.csv' # Create the CSV writer using the HttpResponse as the "file." writer = csv.writer(response) writer.writerow(['Year', 'Unruly Airline Passengers']) for (year, num) in zip(range(1995, 2006), UNRULY_PASSENGERS): writer.writerow([year, num]) return response
輸出pdf檔案:
from cStringIO import StringIO from reportlab.pdfgen import canvas from django.http import HttpResponse def hello_pdf(request): response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=hello.pdf' temp = StringIO() p = canvas.Canvas(temp) p.drawString(100,100,"Hello world.") p.showPage() p.save() return response
九.會話,使用者和註冊
好壞參半的Cookies
也許你已經注意到了,cookies的工作方式可能導致的問題。 讓我們看一下其中一些比較重要的問題:
- cookie的儲存是自願的,一個客戶端不一定要去接受或儲存cookie。 事實上,所有的瀏覽器都讓使用者自己控制 是否接受cookies。 如果你想知道cookies對於Web應用有多重要,你可以試著開啟這個瀏覽器的 選項:
- 儘管cookies廣為使用,但仍被認為是不可靠的的。 這意味著,開發者使用cookies之前必須 檢查使用者是否可以接收cookie。
- Cookie(特別是那些沒通過HTTPS傳輸的)是非常不安全的。 因為HTTP資料是以明文傳送的,所以 特別容易受到嗅探攻擊。 也就是說,嗅探攻擊者可以在網路中攔截並讀取cookies,因此你要 絕對避免在cookies中儲存敏感資訊。 這就意味著您不應該使用cookie來在儲存任何敏感資訊。
- 還有一種被稱為”中間人”的攻擊更陰險,攻擊者攔截一個cookie並將其用於另一個使用者。 第19章將深入討論這種攻擊的本質以及如何避免。
- 即使從預想中的接收者返回的cookie也是不安全的。 在大多數瀏覽器中您可以非常容易地修改cookies中的資訊。有經驗的使用者甚至可以通過像mechanize(http://wwwsearch.sourceforge.net/mechanize/) 這樣的工具手工構造一個HTTP請求。
- 因此不能在cookies中儲存可能會被篡改的敏感資料。 在cookies中儲存 IsLoggedIn=1 ,以標識使用者已經登入。 犯這類錯誤的站點數量多的令人難以置信; 繞過這些網站的安全系統也是易如反掌。