前言´・ᴗ・`
- 本節我們聊聊AJAX 順便深化動態網頁的局部內容加載的流程
- 本節可以幫您學習到…
- 動態網頁更新局部內容content 的時候流程是怎麼樣的
- AJAX的概念 優點 以及爲什麼
- web框架如何簡化了我們的後端開發?
AJAX 以及動態網站如何更新content
這裏我們深化一下上節提到的動態網站 然後講述AJAX。
上節說到的過程僅僅是我們打開動態網頁 加載的流程,如果我點擊一個按鈕(比如我做了個NBA比賽結果統計的網站,我想查詢春季賽表現最好的球隊信息),網頁動態更新,那麼流程又是怎麼個樣子呢?
- 我們僅僅是查看信息而並非上傳、更改信息,所以只需要GET方法 而且加上URL參數
/best_spring
- 如果是靜態網頁 web server可能就會在根目錄找一個名爲
best_spring
的htnl文件 然後通過HTTPserver傳出去 僅此而已 - 但是動態網頁 web server只會把事情交給我們的application server,它其實只會根據我們編程的規則,找到對應的,能夠執行這個任務的對象(函數對象也可能喲)
- 對象執行其方法,比如然後到數據庫查詢 然後返回數據(比如是JSON 或者XML格式的)
- web server將數據返回
可見 application server可能就返回一堆數據而已 連html 模板(template)都不沾
這就是網頁動態更新局部內容的方法(update content)
而且 這種先進的套路還有個名字 —— AJAX (Asynchronous Javascript And XML)
那麼他說採用的一個技術叫做XMLHttpRequest 猜得出來 意思就是不需要返回靜態的一整個HTML文件,而是返回數據 而且是XML格式的
- 爲啥說是Asynchronous 異步的 呢?
爲了裝逼
我們想象一下 我們要更新csdn首頁幾處小圖片 代碼當然是順序的代碼啦 比如:
update_picture_1()
update_picture_2()
update_picture_3()
......
如果是同步的話 我們會看到 圖片是一個一個加載出來的,當前加載的圖片會阻塞block你後面圖片的加載
也就是每個部分的加載都是阻塞執行的 或者說被同步調用的 這樣是不是效率很低啊?假設上百個內容,每個加載0.5s 你等50秒?
所以我們用異步 非阻塞的方式 各個部分的下載就是你行你上 互不干擾 大家都並行的加載
忘記異步知識的同學請移步:python 基礎(二)阻塞 非阻塞 同步 異步
如果說僅僅只有這個異步高效的優點 你就低估了AJAX思想的威力了
事實上 他把大量的計算損耗(computational cost)都甩鍋到我們瀏覽器上(你想想 只給你數據 數據放哪 格式是什麼 還可能一些數據是通過另一些數據計算得來的 都讓瀏覽器去幹了)
每個client都這樣甩鍋 對服務器是善莫大焉啊:)
web框架 如何簡化 服務端編程
我們之前提到,正是application server還有其內置的web application (web應用),讓web服務器動態起來,讓網站,動態起來。這個web 應用就是我們後端編程的內容。
Server-side web frameworks (a.k.a. “web application frameworks”) are software frameworks that make it easier to write, maintain and scale web applications.
官方這段說明 就說後端框架能夠幫我們更好的寫後端應用 而且是可以輕鬆維護 調節應用規模的
對於我們新手 我想 如果從底層實現恐怕會非常坎坷,然而有web應用框架(Web application frameworks),將會簡化我們後端的編程(server-side web programming)
下面簡要介紹後端框架的優點
- 直接操作HTTP response 的規則
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')
- 根據GET的URL參數 動態映射(map)所需要的資源
我們第一段將AJAX時說道 我們處理URL參數是通過找相應的對象來處理的
那麼怎麼實現 URL參數 與 對象 之間的對應呢?框架會幫我們省事很多
# file: best/urls.py
#
from django.conf.urls import url
from . import views
urlpatterns = [
# example: /best/
url(r'^$', views.index),
# example: /best/junior/
url(r'^junior/$', views.junior),
]
這段python Django代碼 就說明了 URL參數帶\best
就會指定view對象的index() 函數去處理
同樣 best/junior/
會指定junior() 函數處理
url(r'^junior/$', views.junior),
這段正則表達式其實不用管 就是用來匹配字段“best”或者“best/junior”的
- 簡化數據庫的操作訪問
那麼 我們調用數據庫的操作呢?
同樣 也有相應的封裝 你調用函數就行啦
#best/views.py
from django.shortcuts import render
from .models import Team
def junior(request):
list_teams = Team.objects.filter(team_type__exact="junior")
context = {'list': list_teams}
return render(request, 'best/index.html', context)
這裏filter函數輸入篩選條件(還記得我MySQL專欄課程中WHERE後面跟着的東西麼)
另外 你還可以限制數據庫的輸入數據(防止sql注入攻擊 也就是惡意代碼融入數據庫) 類似我們MySQL中的一些約束條件 或者是ENUM屬性 但是明顯經過框架管理 將會變得更加系統 功能更加強大(有沒有覺得用純sql語句寫應用是非常蛋疼的事)
-
簡化從request獲取信息的方式
還記得我們從Network找那些request 提取信息的時候嘛
是不是特別麻煩?後端框架可以幫我們傻瓜化的提取必要信息 這樣我們就不用弄底層的繁雜的東西,不需要再造輪子(reinvent wheel) -
SSR sever-side render
後端框架甚至可以幫你渲染前端的頁面 代替一部門瀏覽器還有前端框架的活 這就被稱爲是SSR(Server-side render)的頁面
類似Vue和Angular都有這種佔位符(placeholder){{value}}
後端的有些框架比如Django也同樣有這種功能 可以改造前端頁面
當然對於大型網站 這種過度消耗服務器的行爲可能不可取 但是確實可以實現的
#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>
總結 ´◡`
本節 你講進一步深化動態網站加載頁面以及更新局部內容的過程 也大致瞭解框架對我們後端開發的好處
下一節 我們將真正上手Django
- 本篇文章專欄:服務端編程專欄
學習Django的準備
Django是最好學的框架之一 我想 用來初學再合適不過了
運用框架 能夠做一些中小型的項目 但是開發便捷 沒太多坑 適合我們初學
注意 後端開發是需要數據庫的 你即便是不學習 我覺得MySQL的環境你得裝好
-
強烈建議還是好好把MySQL學習了 關鍵不是語法 而是掌握一些基本概念 否則運用Django的數據庫操作類 (Model)你也不知道這些是啥東西2333
傳送:MySQL專欄 -
你要實在想偷懶 那也得把下面這些文章讀了
-
還有就是 建議安裝可視化的數據庫管理軟件sqlyog 比較直觀的觀察MySQL表的結構
下一站 :服務端編程(六)- Django - 工程的安裝與配置 詳解原理 ORM sql urlpattern 數據庫遷移