服務端編程(五)- 背景知識 - AJAX

前言´・ᴗ・`

  • 本節我們聊聊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)

而且 這種先進的套路還有個名字 —— AJAXAsynchronous 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的環境你得裝好

下一站 :服務端編程(六)- Django - 工程的安裝與配置 詳解原理 ORM sql urlpattern 數據庫遷移

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章