兩篇文章幫你入門Django(上)

原文地址 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 工做流程

在開始具體的代碼之旅前,先來宏觀地看下Django是如何處理Http Resquest的,以下圖:git

Django工做流程

假設你已經在瀏覽器輸入了 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項目

前面爲了使你們瞭解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! 頁面吧。

Django 歡迎頁面

如今咱們的項目初具雛形,而且運行良好,這是個好的開端,不過咱們可讓它變的更加實用,就讓她完成如下任務吧:

  • 在一個問答系統中添加問題;

  • 顯示全部已經添加的問題。

聽起來很簡單,不是嗎?不過這個任務已經涉及到向後臺寫數據,從後臺讀取數據,做爲一個例子而言,足夠用了。就讓咱們新建一個名爲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框架,還提供了諸如後臺管理,單元測試等強大的功能,咱們會在下一篇文章來共同窗習。

相關文章
相關標籤/搜索