摘要:本文結(jié)合官方文檔中的個小教程,幫你了解。一共分上下兩篇文章,上篇主要來分析處理的機(jī)制,下篇來介紹下提供的后臺管理,以及單元測試等強大的功能。項目創(chuàng)建成功之后,可以運行生成相應(yīng)的數(shù)據(jù)庫表是引入的命令,較早的版本可以用其他的命令代替。
原文地址
相信用過python的人都聽過Django的大名,知道它是一個web框架,用來支持動態(tài)網(wǎng)站、網(wǎng)絡(luò)應(yīng)用程序以及網(wǎng)絡(luò)服務(wù)的開發(fā)。那么為什么我們需要一個web框架,而不是直接用python來寫web應(yīng)用呢?其實簡單來說,就是為了偷懶。
如果不用框架的話,你可能需要連接數(shù)據(jù)庫、查詢數(shù)據(jù)庫、關(guān)閉數(shù)據(jù)庫,在python代碼文件里摻雜html標(biāo)簽、css樣式等。并且每次開始一個web應(yīng)用,你都要從頭開始寫起,重復(fù)許多枯燥無味的代碼。
而web框架提供了通用web開發(fā)模式的高度抽象,使我們可以專注于編寫清晰、易維護(hù)的代碼。Django作為python下的web框架,從誕生到現(xiàn)在有著數(shù)以萬計的用戶和貢獻(xiàn)者,有著豐富的文檔,活躍的社區(qū),是web開發(fā)很好的選擇。
本文結(jié)合 Django 官方文檔 First steps 中的6個小教程,幫你了解Django。一共分上、下兩篇文章,上篇主要來分析Django處理Http Request的機(jī)制,下篇來介紹下Django提供的后臺管理,以及單元測試等強大的功能。
Django 工作流程在開始具體的代碼之旅前,先來宏觀地看下Django是如何處理Http Resquest的,如下圖:
假設(shè)你已經(jīng)在瀏覽器輸入了 http://127.0.0.1:8000/polls/,接下來瀏覽器會把請求交給Django處理。根據(jù)上圖,我們知道Django需要根據(jù)url來決定交給誰來處理請求,那么Django是如何完成這項工作呢?很簡單,Django要求程序員提供urls.py文件,并且在該類文件中指定請求鏈接與處理函數(shù)之間的一一對應(yīng)關(guān)系。
這里請求鏈接是以正則表達(dá)式的方式指定,并且不用指定域名,比如說要精確匹配上面的例子, 只需要指定正則表達(dá)式為 ^polls/$ 即可。要匹配 http://|5e46bd7270c4c5723394282dcc9f64f66|(這里polls后面只要是數(shù)字即可),那么只需要 ^polls/d+/$ 即可。回到上面的例子,Django中只需要在urls.py添加以下語句即可。
urlpatterns = patterns( "", url(r"^polls/$", views.index), )
這樣當(dāng)請求鏈接為http://127.0.0.1:8000/polls/時,就會用views.py中的函數(shù)index()來處理請求。現(xiàn)在Django知道由index來處理請求了,那么index需要做哪些工作呢?
它需要加載返回內(nèi)容的模板,這里比如說是index.html。
def index(request): template = loader.get_template("polls/index.html")
模板文件就是返回頁面的一個骨架,我們可以在模板中指定需要的靜態(tài)文件,也可以在模板中使用一些參數(shù)和簡單的邏輯語句,這樣就可以將其變?yōu)橛脩糇罱K看到的豐滿的頁面了。
要使用靜態(tài)文件,比如說css、javascript等,只需要用{% load staticfiles %}來聲明一下,然后直接引用即可,比如說:
參數(shù)和邏輯語句也很簡單,比如說以下語句:
{% for question in latest_question_list %}
用for循環(huán)遍歷latest_question_list,逐個輸出內(nèi)容question_text。這里我們用到了參數(shù)latest_question_list,它的值其實是在views.py中計算出來給模板文件的,我們這里假設(shè)是從數(shù)據(jù)庫中取出最新的5個question,如下:
latest_question_list = Question.objects.order_by("-pub_date")[:5]
這里用到了數(shù)據(jù)庫,其實Django給我們封裝了數(shù)據(jù)庫的讀寫操作,我們不需要用SQL語句去查詢、更新數(shù)據(jù)庫等,我們要做的是用python的方式定義數(shù)據(jù)庫結(jié)構(gòu)(在model.py里面定義數(shù)據(jù)庫),然后用python的方式去讀寫內(nèi)容。至于連接數(shù)據(jù)庫、關(guān)閉數(shù)據(jù)庫這些工作交給Django去替你完成吧。上面例子中,Question數(shù)據(jù)庫結(jié)構(gòu)的定義如下:
class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField("date published") def __str__(self): return self.question_text
好了,現(xiàn)在有了模板文件這個骨架,又有參數(shù)、邏輯語句、靜態(tài)文件等血肉,一個豐滿的頁面就誕生了,來看一下完整的index函數(shù)吧:
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的過程,我們簡化了一些內(nèi)容,下面我們將盡量還原Django真實的面貌。在開始具體的技術(shù)細(xì)節(jié)前,我們先來搞清楚Django中projects和apps的區(qū)別。App是專注于做某件事的web應(yīng)用,比如說一個用戶認(rèn)證系統(tǒng),或者是公開投票系統(tǒng);而project則是一個web站點,可能包括許多app和一些配置。一個project可以包含許多app,一個app可以用于許多project中。
使用Django時一般會先創(chuàng)建一個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 中進(jìn)行項目的一些配置,比如配置時區(qū),數(shù)據(jù)庫連接的相關(guān)信息,或者是應(yīng)用的添加、刪除等。這里需要特別注意的是數(shù)據(jù)庫設(shè)置,Django支持sqlite、mysql、oracle等數(shù)據(jù)庫,使用前必須安裝、啟動相應(yīng)的數(shù)據(jù)庫,并建立相應(yīng)的賬戶。這里為了簡單,我們使用python內(nèi)置的sqlite,settings里面的數(shù)據(jù)庫配置不需要更改即可。
項目創(chuàng)建成功之后,可以運行
$ python manage.py migrate
生成相應(yīng)的數(shù)據(jù)庫表(migrate是Django 1.7引入的命令,較早的版本可以用其他的命令代替)。為什么新建的空項目里就會有數(shù)據(jù)庫表呢?這是因為默認(rèn)情況下,項目配置文件settings.py里面已經(jīng)配置有Django自帶的應(yīng)用,如下:
INSTALLED_APPS = ( "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", )
這些應(yīng)用需要和數(shù)據(jù)庫交互。(通常情況下默認(rèn)的應(yīng)用很有用,不過你可以根據(jù)需求刪減)
到這里為止,我們的Django項目已經(jīng)可以運行了,用下面簡單的命令開啟Django自帶的開發(fā)環(huán)境web服務(wù):
$ python manage.py runserver
接下來,試試在瀏覽器打開 http://127.0.0.1:8000/,看看Django的 It worked! 頁面吧。
現(xiàn)在我們的項目初具雛形,并且運行良好,這是個好的開端,不過我們可以讓它變的更加實用,就讓她完成以下任務(wù)吧:
在一個問答系統(tǒng)中添加問題;
顯示所有已經(jīng)添加的問題。
聽起來很簡單,不是嗎?不過這個任務(wù)已經(jīng)涉及到向后臺寫數(shù)據(jù),從后臺讀取數(shù)據(jù),作為一個例子而言,足夠用了。就讓我們新建一個名為questions的app來完成這項任務(wù)吧:
$ python manage.py startapp questions
首先我們得設(shè)計好數(shù)據(jù)庫字段,用來存儲問題。上面的任務(wù)設(shè)計起來很簡單,只需要建立一個名為Question的表格,然后里面有context字段。Django提供了models來方便我們設(shè)計數(shù)據(jù)庫,因此我們的questions/models.py看起來可能是這樣的:
from django.db import models class Question(models.Model): context = models.CharField(max_length=200)
現(xiàn)在將questions應(yīng)用添加進(jìn)項目的配置文件mysite/settings中:
INSTALLED_APPS = ( "django.contrib.admin", ..., "questions", )
然后通過以下命令來生成Question數(shù)據(jù)庫表格:
$ python manage.py makemigrations questions $ python manage.py migrate
接下來設(shè)計三個URL地址add/, add_done/, index/(這里的地址并不包含域名) 分別用來展示填寫問題頁面,添加成功后頁面,顯示所有問題頁面。然后在mysite/urls.py中指定相應(yīng)的處理函數(shù),如下:
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), )
當(dāng)然了,我們需要在questions/views.py中實現(xiàn) index, add 和 add_done:
index: 獲取當(dāng)前所有問題,傳給模板文件,返回Response;
add: 直接返回添加問題表單頁面即可;
add_done: 獲取POST得到的問題,將其添加到數(shù)據(jù)庫,返回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函數(shù)加載模板,并且以字典的形式傳遞參數(shù),返回Response頁面。模板文件內(nèi)容不在這里給出,運行結(jié)果截圖如下:
如果你讀到這里,那么應(yīng)該會知道Django處理Http Request的過程,并且能動手寫一個簡單的Django小項目了。不過Django作為一個優(yōu)秀的Web框架,還提供了諸如后臺管理,單元測試等強大的功能,我們會在下一篇文章來共同學(xué)習(xí)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/45311.html
摘要:原文地址在兩篇文章幫你入門上一文中,我們已經(jīng)做了一個簡單的小網(wǎng)站,實現(xiàn)了保存用戶數(shù)據(jù)到數(shù)據(jù)庫,以及從后臺數(shù)據(jù)庫讀取數(shù)據(jù)顯示到網(wǎng)頁上這兩個功能。注意測試時并不需要運行服務(wù),這樣能節(jié)省服務(wù)的開銷,提高測試的速度。 原文地址 在兩篇文章幫你入門Django(上)一文中,我們已經(jīng)做了一個簡單的小網(wǎng)站,實現(xiàn)了保存用戶數(shù)據(jù)到數(shù)據(jù)庫,以及從后臺數(shù)據(jù)庫讀取數(shù)據(jù)顯示到網(wǎng)頁上這兩個功能。 看上去沒有什么問...
摘要:每一條日志記錄也包含級別,代表對應(yīng)消息的嚴(yán)重程度。即格式化器,主要功能是確定最終輸出的形式和內(nèi)容。最好是日志能夠按自然天進(jìn)行記錄和分割。 上一章學(xué)習(xí)了自動化測試,很好,現(xiàn)在我們可以絞盡腦汁寫出一份全面的測試,來保證代碼永遠(yuǎn)健康了。 話雖如此,但是作為一個獨立開發(fā)者很難寫出真正全面的測試代碼。這是因為用戶在使用你的網(wǎng)站時可不會循規(guī)蹈矩,而是會以各種怪異的姿勢瀏覽網(wǎng)頁、上傳數(shù)據(jù)。但這也不是...
摘要:編程從入門到實踐筆記。執(zhí)行命令后,項目的根目錄下會多出一個名為的數(shù)據(jù)庫文件。下面創(chuàng)建一個主題類用戶學(xué)習(xí)的主題返回模型的字符串表示類是中的一個定義了模型基本功能的類。這種交互式環(huán)境稱為,常用語測試項目和排除故障。 《Python編程:從入門到實踐》筆記。從本篇開始將是該書的最后一個項目,將用3篇文章來介紹Django的基礎(chǔ)。完成一個學(xué)習(xí)筆記的小網(wǎng)站。 1. 前言 在本篇中,我們將: 用...
摘要:首發(fā)于我的博客線程池進(jìn)程池網(wǎng)絡(luò)編程之同步異步阻塞非阻塞后端掘金本文為作者原創(chuàng),轉(zhuǎn)載請先與作者聯(lián)系。在了解的數(shù)據(jù)結(jié)構(gòu)時,容器可迭代對象迭代器使用進(jìn)行并發(fā)編程篇二掘金我們今天繼續(xù)深入學(xué)習(xí)。 Python 算法實戰(zhàn)系列之棧 - 后端 - 掘金原文出處: 安生??? 棧(stack)又稱之為堆棧是一個特殊的有序表,其插入和刪除操作都在棧頂進(jìn)行操作,并且按照先進(jìn)后出,后進(jìn)先出的規(guī)則進(jìn)行運作。 如...
閱讀 3557·2021-08-02 13:41
閱讀 2390·2019-08-30 15:56
閱讀 1520·2019-08-30 11:17
閱讀 1174·2019-08-29 15:18
閱讀 580·2019-08-29 11:10
閱讀 2671·2019-08-26 13:52
閱讀 508·2019-08-26 13:22
閱讀 2949·2019-08-23 15:41