原文地址 javascript
相信用過python的人都聽過Django的大名,知道它是一個web框架,用來支持動態網站、網絡應用程序以及網絡服務的開發。那麼爲何咱們須要一個web框架,而不是直接用python來寫web應用呢?其實簡單來講,就是爲了偷懶。css
若是不用框架的話,你可能須要鏈接數據庫、查詢數據庫、關閉數據庫,在python代碼文件裏摻雜html標籤、css樣式等。而且每次開始一個web應用,你都要從頭開始寫起,重複許多枯燥無味的代碼。html
而web框架提供了通用web開發模式的高度抽象,使咱們能夠專一於編寫清晰、易維護的代碼。Django做爲python下的web框架,從誕生到如今有着數以萬計的用戶和貢獻者,有着豐富的文檔,活躍的社區,是web開發很好的選擇。java
本文結合 Django 官方文檔 First steps
中的6個小教程,幫你瞭解Django。一共分上、下兩篇文章,上篇主要來分析Django處理Http Request的機制,下篇來介紹下Django提供的後臺管理,以及單元測試等強大的功能。python
<!--more-->mysql
在開始具體的代碼之旅前,先來宏觀地看下Django是如何處理Http Resquest的,以下圖:git
假設你已經在瀏覽器輸入了 http://127.0.0.1:8000/polls/,接下來瀏覽器會把請求交給Django處理。根據上圖,咱們知道Django須要根據url來決定交給誰來處理請求,那麼Django是如何完成這項工做呢?很簡單,Django要求程序員提供urls.py文件,而且在該類文件中指定請求連接與處理函數之間的一一對應關係。程序員
這裏請求連接是以正則表達式的方式指定,而且不用指定域名,好比說要精確匹配上面的例子, 只須要指定正則表達式爲 ^polls/$
便可。要匹配 http://| 5e46bd7270c4c5723394282dcc9f64f66 |(這裏polls後面只要是數字便可),那麼只須要 ^polls/\d+/$
便可。回到上面的例子,Django中只須要在urls.py添加如下語句便可。github
urlpatterns = patterns( '', url(r'^polls/$', views.index), )
這樣當請求連接爲http://127.0.0.1:8000/polls/時,就會用views.py
中的函數index()
來處理請求。如今Django知道由index來處理請求了,那麼index須要作哪些工做呢?web
它須要加載返回內容的模板,這裏好比說是index.html
。
def index(request): template = loader.get_template('polls/index.html')
模板文件就是返回頁面的一個骨架,咱們能夠在模板中指定須要的靜態文件,也能夠在模板中使用一些參數和簡單的邏輯語句,這樣就能夠將其變爲用戶最終看到的豐滿的頁面了。
要使用靜態文件,好比說css、javascript等,只須要用{% load staticfiles %}
來聲明一下,而後直接引用便可,好比說:
<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />
參數和邏輯語句也很簡單,好比說如下語句:
{% for question in latest_question_list %} <li>{{ question.question_text }}</a></li> {% endfor %}
用for循環遍歷latest_question_list,逐個輸出內容question_text。這裏咱們用到了參數latest_question_list,它的值實際上是在views.py中計算出來給模板文件的,咱們這裏假設是從數據庫中取出最新的5個question,以下:
latest_question_list = Question.objects.order_by('-pub_date')[:5]
這裏用到了數據庫,其實Django給咱們封裝了數據庫的讀寫操做,咱們不須要用SQL語句去查詢、更新數據庫等,咱們要作的是用python的方式定義數據庫結構(在model.py裏面定義數據庫),而後用python的方式去讀寫內容。至於鏈接數據庫、關閉數據庫這些工做交給Django去替你完成吧。上面例子中,Question數據庫結構的定義以下:
class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text
好了,如今有了模板文件這個骨架,又有參數、邏輯語句、靜態文件等血肉,一個豐滿的頁面就誕生了,來看一下完整的index函數吧:
def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] template = loader.get_template('polls/index.html') context = RequestContext(request, { 'latest_question_list': latest_question_list, }) return HttpResponse(template.render(context))
前面爲了使你們瞭解Django處理HTTP Request的過程,咱們簡化了一些內容,下面咱們將盡可能還原Django真實的面貌。在開始具體的技術細節前,咱們先來搞清楚Django中projects和apps的區別。App是專一於作某件事的web應用,好比說一個用戶認證系統,或者是公開投票系統;而project則是一個web站點,可能包括許多app和一些配置。一個project能夠包含許多app,一個app能夠用於許多project中。
使用Django時通常會先建立一個project,好比說是mysite,以下:
$ django-admin.py startproject mysite $ tree -L 2 mysite mysite ├── manage.py └── mysite ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py 1 directory, 5 files
而後咱們能夠在 mysite/settings.py
中進行項目的一些配置,好比配置時區,數據庫鏈接的相關信息,或者是應用的添加、刪除等。這裏須要特別注意的是數據庫設置,Django支持sqlite、mysql、oracle等數據庫,使用前必須安裝、啓動相應的數據庫,並創建相應的帳戶。這裏爲了簡單,咱們使用python內置的sqlite,settings裏面的數據庫配置不須要更改便可。
項目建立成功以後,能夠運行
$ python manage.py migrate
生成相應的數據庫表(migrate是Django 1.7引入的命令,較早的版本能夠用其餘的命令代替)。爲何新建的空項目裏就會有數據庫表呢?這是由於默認狀況下,項目配置文件settings.py
裏面已經配置有Django自帶的應用,以下:
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', )
這些應用須要和數據庫交互。(一般狀況下默認的應用頗有用,不過你能夠根據需求刪減)
到這裏爲止,咱們的Django項目已經能夠運行了,用下面簡單的命令開啓Django自帶的開發環境web服務
:
$ python manage.py runserver
接下來,試試在瀏覽器打開 http://127.0.0.1:8000/,看看Django的 It worked!
頁面吧。
如今咱們的項目初具雛形,而且運行良好,這是個好的開端,不過咱們可讓它變的更加實用,就讓她完成如下任務吧:
在一個問答系統中添加問題;
顯示全部已經添加的問題。
聽起來很簡單,不是嗎?不過這個任務已經涉及到向後臺寫數據,從後臺讀取數據,做爲一個例子而言,足夠用了。就讓咱們新建一個名爲questions的app來完成這項任務吧:
$ python manage.py startapp questions
首先咱們得設計好數據庫字段,用來存儲問題。上面的任務設計起來很簡單,只須要創建一個名爲Question的表格,而後裏面有context字段。Django提供了models來方便咱們設計數據庫,所以咱們的questions/models.py
看起來多是這樣的:
from django.db import models class Question(models.Model): context = models.CharField(max_length=200)
如今將questions應用添加進項目的配置文件mysite/settings
中:
INSTALLED_APPS = ( 'django.contrib.admin', ..., 'questions', )
而後經過如下命令來生成Question數據庫表格:
$ python manage.py makemigrations questions $ python manage.py migrate
接下來設計三個URL地址add/, add_done/, index/
(這裏的地址並不包含域名) 分別用來展現填寫問題頁面,添加成功後頁面,顯示全部問題頁面。而後在mysite/urls.py
中指定相應的處理函數,以下:
from django.conf.urls import patterns, include, url from questions import views urlpatterns = patterns( '', url(r'^add/$', views.add), url(r'^index/$', views.index), url(r'^add_done/$', views.add_done), )
固然了,咱們須要在questions/views.py
中實現 index, add 和 add_done:
index: 獲取當前全部問題,傳給模板文件,返回Response;
add: 直接返回添加問題表單頁面便可;
add_done: 獲取POST獲得的問題,將其添加到數據庫,返回Response;
代碼以下:
def index(request): question_list = Question.objects.all() return render( request, "questions/index.html", {'question_list': question_list}, ) def add_done(request): add_question = Question() content = request.POST['content'] add_question.context = content add_question.save() return render( request, "questions/add_done.html", {'question': content}, ) def add(request): return render(request, "questions/add.html")
這裏render函數加載模板,而且以字典的形式傳遞參數,返回Response頁面。模板文件內容不在這裏給出,運行結果截圖以下:
若是你讀到這裏,那麼應該會知道Django處理Http Request的過程,而且能動手寫一個簡單的Django小項目了。不過Django做爲一個優秀的Web框架,還提供了諸如後臺管理,單元測試等強大的功能,咱們會在下一篇文章來共同窗習。