先決條件: | 基本的計算機素養(yǎng)。 高級了解服務(wù)器端代碼如何處理和響應(yīng)HTTP請求(請參見客戶端 - 服務(wù)器概述)。 |
---|---|
目的: | 了解Web框架如何簡化服務(wù)器端代碼的開發(fā)/維護,并讓讀者考慮為自己的開發(fā)選擇一個框架。 |
以下部分說明了使用從真實Web框架中提取的代碼片段的一些點。 不要擔(dān)心,所有現(xiàn)在有意義; 我們將通過我們的框架特定模塊中的代碼來幫助您。
下一部分提供了有關(guān)Web框架如何簡化Web應(yīng)用程序開發(fā)的更多詳細信息。 然后,我們解釋一些可用于選擇Web框架的標準,然后列出一些選項。
Web框架提供了工具和庫來簡化常見的Web開發(fā)操作。 您不是使用服務(wù)器端網(wǎng)絡(luò)框架,但強烈建議 - 這將使你的生活更容易。
本節(jié)討論了Web框架常常提供的一些功能(并非每個框架都必須提供所有這些功能!)
正如我們在上一篇文章中看到的,Web服務(wù)器和瀏覽器通過HTTP協(xié)議進行通信 - 服務(wù)器等待來自瀏覽器的HTTP請求,然后返回HTTP響應(yīng)中的信息。 Web框架允許您編寫簡化的語法,生成服務(wù)器端代碼以處理這些請求和響應(yīng)。 這意味著你將有一個更容易的工作,與更容易,更高級的代碼,而不是低級網(wǎng)絡(luò)原語交互。
下面的示例顯示了如何在Django(Python)Web框架中工作。 每個"視圖"函數(shù)(請求處理程序)接收包含請求信息的 HttpRequest
對象,并且需要返回帶有格式化輸出的 HttpResponse
對象 )。
# Django view function from django.http import HttpResponse def index(request): # Get an HttpRequest (request) # perform operations using information from the request. ? # Return HttpResponse return HttpResponse('Output string to return')
大多數(shù)網(wǎng)站會提供多種不同的資源,可通過不同的網(wǎng)址訪問。 在一個函數(shù)中處理這些都很難維護,因此Web框架提供了簡單的機制來將URL模式映射到特定的處理函數(shù)。 這種方法在維護方面也有好處,因為您可以更改用于提供特定功能的URL,而無需更改底層代碼。
不同的框架使用不同的機制進行映射。 例如,F(xiàn)lask(Python)web框架使用裝飾器向視圖函數(shù)添加路由。
@app.route("/") def hello(): return "Hello World!"
雖然Django希望開發(fā)人員定義URL模式和視圖函數(shù)之間的URL映射列表。
urlpatterns = [ url(r'^$', views.index), # example: /best/myteamname/5/ url(r'^(?P<team_name>\w.+?)/(?P<team_number>[0-9]+)/$', views.best), ]
可以以多種方式在HTTP請求中對數(shù)據(jù)進行編碼。 從服務(wù)器獲取文件或數(shù)據(jù)的HTTP GET
請求可能會編碼URL參數(shù)或URL結(jié)構(gòu)中需要哪些數(shù)據(jù)。 用于更新服務(wù)器上的資源的HTTP POST
請求將在請求的主體內(nèi)包括更新信息作為"POST數(shù)據(jù)"。 HTTP請求還可以包括關(guān)于客戶端側(cè)cookie中的當(dāng)前會話或用戶的信息。
Web框架提供了編程語言適當(dāng)?shù)臋C制來訪問這些信息。 例如,Django傳遞給每個視圖函數(shù)的 HttpRequest
對象包含用于訪問目標URL的方法和屬性,請求的類型(例如HTTP GET
), > GET
或 POST
參數(shù),cookie和會話數(shù)據(jù)等。通過在URL映射器中定義"捕獲模式",Django還可以傳遞編碼在URL結(jié)構(gòu)中的信息 代碼片段在上面的部分)。
網(wǎng)站使用數(shù)據(jù)庫來存儲要與用戶和用戶共享的信息。 Web框架通常提供抽象數(shù)據(jù)庫讀取,寫入,查詢和刪除操作的數(shù)據(jù)庫層。 該抽象層被稱為對象關(guān)系映射器(ORM)。
使用ORM有兩個好處:
例如,Django web框架提供了一個ORM,并且將用于定義記錄結(jié)構(gòu)的對象稱為模型。 模型指定要存儲的字段類型,其可以提供對可以存儲什么信息(例如,電子郵件字段將僅允許有效的電子郵件地址)的字段級驗證。 字段定義還可以指定它們的最大大小,默認值,選擇列表選項,文檔的幫助文本,表單的標簽文本等。模型不陳述關(guān)于底層數(shù)據(jù)庫的任何信息,因為這是可以改變的配置設(shè)置 分開我們的代碼。
下面的第一個代碼片段為 Team
對象顯示了一個非常簡單的Django模型。 這將團隊名稱和團隊級別存儲為字符字段,并指定要為每個記錄存儲的最大字符數(shù)。 team_level
是一個選擇字段,因此我們還提供了要顯示的選擇和要存儲的數(shù)據(jù)之間的映射以及默認值。
#best/models.py from django.db import models class Team(models.Model): ? team_name = models.CharField(max_length=40) ? ? TEAM_LEVELS = ( ? ? ? ? ('U09', 'Under 09s'), ? ? ? ? ('U10', 'Under 10s'), ? ? ? ? ('U11, 'Under 11s'), ? ... #list our other teams ? ? ) ? ? team_level = models.CharField(max_length=3,choices=TEAM_LEVELS,default='U11')
Django模型提供了一個用于搜索數(shù)據(jù)庫的簡單查詢API。 這可以使用不同的標準(例如,精確,不區(qū)分大小,大于等)一次匹配多個字段,并且可以支持復(fù)雜語句(例如,您可以在具有團隊的U11團隊上指定搜索 以"Fr"開頭或以"al"結(jié)尾的名稱)。
第二個代碼片段顯示了一個用于顯示所有U09團隊的視圖函數(shù)(資源處理程序)。 在這種情況下,我們指定要過濾所有記錄,其中 team_level
字段正好是文本\'U09\'(請注意下面如何將此條件傳遞給 filter
>函數(shù)作為參數(shù),字段名稱和匹配類型由雙下劃線分隔: team_level__exact )。
#best/views.py from django.shortcuts import render from .models import Team def youngest(request): ? ? list_teams = Team.objects.filter(team_level__exact="U09") ? ? context = {'youngest_teams': list_teams} ? ? return render(request, 'best/index.html', context)
Web框架通常提供模板系統(tǒng)。 這些允許您指定輸出文檔的結(jié)構(gòu),為生成頁面時要添加的數(shù)據(jù)使用占位符。 模板通常用于創(chuàng)建HTML,但也可以創(chuàng)建其他類型的文檔。
Web框架通常提供一種機制,可以輕松地從存儲的數(shù)據(jù)生成其他格式,包括 JSON 和 XML 。
例如,Django模板系統(tǒng)允許您使用"雙句柄"語法(例如 {
{ variable_name
}
}
),它將被渲染頁面時從視圖函數(shù)傳遞的值替換。 模板系統(tǒng)還支持表達式(具有語法: {% expression %}
),允許模板執(zhí)行簡單操作,例如迭代傳遞到模板中的列表值。
注意:許多其他模板系統(tǒng)使用類似的語法,例如:Jinja2(Python),handlebars(JavaScript),mustache(JavaScript)等。
下面的代碼段顯示了如何工作。 繼續(xù)上一節(jié)中的"最新團隊"示例,HTML模板通過視圖傳遞一個名為 youngest_teams
的列表變量。 在HTML框架內(nèi)部,我們有一個表達式,首先檢查 youngest_teams
變量是否存在,然后在 for
循環(huán)中迭代它。 在每次迭代時,模板在列表項中顯示團隊的 team_name
值。
#best/templates/best/index.html <!DOCTYPE html> <html lang="en"> <body> {% if youngest_teams %} ? ? <ul> ? ? {% for team in youngest_teams %} ? ? ? ? <li>{{ team.team_name }}</li> ? ? {% endfor %} ? ? </ul> {% else %} ? ? <p>No teams are available.</p> {% endif %} </body> </html>
許多Web框架存在幾乎每一種可能需要使用的編程語言(我們列出了幾個更流行的框架在下一節(jié))。 有了這么多的選擇,它可能變得難以確定什么框架為您的新的Web應(yīng)用程序提供了最好的起點。
可能影響您決定的一些因素是:
還有許多其他可能的因素,包括許可,無論框架是否在積極發(fā)展等。
如果你是編程的絕對初學(xué)者,那么你可能會選擇基于"易于學(xué)習(xí)"的框架。 除了語言本身的"易用性"之外,高質(zhì)量的文檔/教程和活躍的社區(qū)幫助新用戶是您最寶貴的資源。 我們選擇了 Django (Python)和 ="external"> Express (Node / JavaScript)在后面的課程中寫我們的例子,主要是因為它們?nèi)菀讓W(xué)習(xí)和有良好的支持。
注意:讓我們訪問 Django (Python)和 ="http://expressjs.com/"class ="external"> Express (Node / JavaScript),并查看他們的文檔和社區(qū)。
讓我們繼續(xù),討論幾個特定的服務(wù)器端Web框架。
下面的服務(wù)器端框架代表了寫作時最流行的幾個。 他們都有你需要的一切,以生產(chǎn)力 - 他們是開源,正在積極發(fā)展,有熱情的社區(qū)創(chuàng)建文檔和幫助用戶討論板,并用于大量的高調(diào)網(wǎng)站。 有許多其他偉大的服務(wù)器端框架,你可以使用基本的互聯(lián)網(wǎng)搜索發(fā)現(xiàn)。
注意:說明來自(部分)來自框架網(wǎng)站!
Django 是一個高級Python Web框架,它鼓勵快速開發(fā)和干凈,務(wù)實的設(shè)計。 由經(jīng)驗豐富的開發(fā)人員構(gòu)建,它需要處理大量的網(wǎng)絡(luò)開發(fā)麻煩,所以你可以專注于編寫你的應(yīng)用程序,而不需要重新發(fā)明輪子。 它是免費和開源的。
Django遵循"包括電池"的理念,并提供幾乎所有大多數(shù)開發(fā)人員可能想做的"開箱即用"。 因為一切都包括在內(nèi),它一起工作,遵循一致的設(shè)計原則,并有廣泛和最新的文檔。 基于Python,Django代碼易于閱讀和維護。 Django的主要優(yōu)點是:
Django旨在幫助開發(fā)人員盡快將應(yīng)用程序從概念到完成。
Django認真對待安全性,并幫助開發(fā)人員避免許多常見的安全錯誤。
使用Django(來自Django主頁)的熱門網(wǎng)站包括:Disqus,Instagram,Knight基金會,MacArthur基金會,Mozilla,國家地理,開放知識基金會,Pinterest,開放堆棧。
Flask 是Python的微框架。
雖然簡約,F(xiàn)lask可以創(chuàng)建嚴肅的網(wǎng)站開箱。 它包含開發(fā)服務(wù)器和調(diào)試器,并且包括對 Jinja2 模板,安全Cookie, https://en.wikipedia.org/wiki/Unit_testing"class ="external">單元測試和 ="external"> RESTful 請求分派。 它有良好的文檔和活躍的社區(qū)。
Flask已經(jīng)變得非常受歡迎,特別是對于需要在小型,資源受限的系統(tǒng)上提供Web服務(wù)的開發(fā)人員(例如,在 "> Raspberry Pi ,無人機控制器等。 )
Express 是一個快速,無庸置疑,靈活和簡約的網(wǎng)絡(luò)框架,用于 en /"class ="external"> Node.js (節(jié)點是運行JavaScript的無瀏覽器環(huán)境)。 它為Web和移動應(yīng)用程序提供了一組強大的功能,并提供了有用的HTTP實用程序方法和中間件 。
Express非常受歡迎,部分原因是它簡化了客戶端JavaScript Web程序員在服務(wù)器端開發(fā)中的遷移,部分是因為它是資源高效的(基礎(chǔ)節(jié)點環(huán)境在線程中使用輕量級多任務(wù),而不是為每個線程創(chuàng)建單獨的進程 新的Web請求)。
因為Express是一個簡約的Web框架,它不包含您可能想要使用的每個組件(例如,數(shù)據(jù)庫訪問和對用戶和會話的支持通過獨立的庫提供)。 有許多優(yōu)秀的獨立組件,但有時可能很難找到,這是最好的特定目的!
許多流行的服務(wù)器端和全棧框架(包括服務(wù)器端和客戶端框架)都基于Express,包括羽毛 , ItemsAPI , KeystoneJS , Kraken , external"> LEAN-STACK , LoopBack , MEAN 和 Sails 。
許多知名公司使用Express,包括:Uber,Accenture,IBM等(提供了一個列表 ="external">此處)。
Rails (通常稱為"Ruby on Rails")是為Ruby編程語言編寫的Web框架。
Rails遵循與Django非常相似的設(shè)計理念。 像Django一樣,它提供了標準機制,用于路由URL,從數(shù)據(jù)庫訪問數(shù)據(jù),從模板生成HTML并將數(shù)據(jù)格式化為 ="glossaryLink"> JSON 或 XML 。 它同樣鼓勵使用像DRY("不重復(fù)自己" - 只寫一次代碼,如果可能的話),MVC(模型 - 視圖控制器)和許多其他設(shè)計模式。
由于具體的設(shè)計決定和語言的性質(zhì),當(dāng)然有許多差異。
Rails已用于高度重視的網(wǎng)站,包括: Basecamp , ://github.com/"class ="external"> GitHub , Shopify , "https://airbnb.com/"class ="external"> Airbnb , Twitch , class ="external"> SoundCloud , Hulu , Zendesk , Square >,高層。
ASP.NET 是由Microsoft開發(fā)的用于構(gòu)建現(xiàn)代Web應(yīng)用程序和服務(wù)的開源網(wǎng)絡(luò)框架。 使用ASP.NET,您可以快速創(chuàng)建基于HTML,CSS和JavaScript的網(wǎng)站,擴展它們供數(shù)百萬用戶使用,并輕松添加更復(fù)雜的功能,如Web API,數(shù)據(jù)形式或?qū)崟r通信。
ASP.NET的區(qū)別之一是它建立在公共語言運行時(CLR) ,允許程序員使用任何支持的.NET語言(C#,Visual Basic等)編寫ASP.NET代碼。 像許多Microsoft產(chǎn)品一樣,它受益于優(yōu)秀的工具(通常是免費的),活躍的開發(fā)者社區(qū)和精心撰寫的文檔。
ASP.NET由Microsoft,Xbox.com,Stack Overflow和許多其他人使用。
本文展示了Web框架可以使開發(fā)和維護服務(wù)器端代碼變得更加容易。 它還提供了一些流行框架的高級概述,并討論了選擇Web應(yīng)用程序框架的標準。 您現(xiàn)在至少應(yīng)該有一個如何選擇一個Web框架為您自己的服務(wù)器端開發(fā)的想法。 如果沒有,那么不要擔(dān)心 - 稍后我們將給你詳細的Django和Express教程,給你一些實際使用web框架的經(jīng)驗。
對于本單元中的下一篇文章,我們將稍微改變方向并考慮網(wǎng)絡(luò)安全。
更多建議: