3. Post and Get

weixin_33762321發表於2018-05-04

Django後端的工作流程

  1. 使用者發起http資源請求--->
  2. Urls.py 進行模式匹配--->
  3. 對映到相應的view函式邏輯---->
  4. 用資料渲染網頁模板返回給使用者,或者直接跳轉到相應的網頁。

Post and Get

超文字傳輸協議(HTTP)的設計目的是保證客戶機與伺服器之間的通訊。
HTTP 的工作方式是基於TCP/IP,客戶機與伺服器之間的請求-應答協議。

HTTP包含GET, POST, PUT, DELETE等等方法。常用的就是GET,POST。

Post 和 Get在本質上是沒有區別的,都是一個TCP/IP的連結。

TCP協議通過三次握手,建立埠到埠的,可靠的、基於位元組流(報文段)的連線;IP通過域名解析,路由定址,建立主機之間的交流。通過他們的配合,從而建立了HTTP的基礎。

我們給GET一個定義,你的引數只能放在url中。
同樣,我們給POST一個定義,你的引數(資料)放在Request body中。
那麼各大瀏覽器就會針對不同請求做不同的處理,來提高效率。

  1. POST:向指定的資源提交要被處理的資料
    POST 請求不會被快取
    POST 請求不會保留在瀏覽器歷史記錄中
    POST 不能被收藏為書籤
    POST 請求對資料長度沒有要求

  2. GET:從指定的資源請求資料
    GET 請求可被快取
    GET 請求保留在瀏覽器歷史記錄中
    GET 請求可被收藏為書籤
    GET 請求不應在處理敏感資料時使用
    GET 請求有長度限制
    GET 請求只應當用於取回資料

這兩種方式還有一個區別,GET只傳送一次請求,POST則大多數情況下(這也取決於瀏覽器)傳送兩次,一次報頭,一次資料。

回到Django

  1. Get作為一種method,可以用於Form,也可以用於<a>的href上。
    Get將表單中資料的按照variable=value的形式,新增到action所指向的URL後面,並且兩者使用“?”連線,而各個變數之間使用“&”連線。

用在Form上時,資料就會被新增在url上返回給伺服器

<form class="form-inline" action="{% url 'display:search' %}" method="get">
      {% csrf_token %}
      <input class="form-control" type="text" placeholder="Search" name="keywords">
      <button class="btn btn-success" type="submit">搜尋全站</button>
  </form>

用在<a>的href時,href屬性值就是我們返回給伺服器的url。

<div class="user-name"><a href="{% url 'display:personal_info' %}">{{ request.session.user_name}}</a></div>

這裡的url就是該網頁的位址列裡的地址。
如果Form不明確說明使用get 還是Post,則預設get

Attention: 只要使用了Form這個標籤,就可以用request去獲取引數:

name=request.GET.get('name1') # 獲取引數值

否則就要通過正規表示式去解析url,得到data,將其作為函式引數傳遞到view的函式裡。

<a class="nav-link" href="{% url 'display:category' '程式設計師' %}">IT</a>

url(r'^(?P<category>[\u4e00-\u9fa5]+)/$', views.category, name='category')
def category(request, category):
    news = Item.objects.order_by("collect_time")
    daily_news = news.order_by('collect_time').filter(category=category)[:6]

    context = {
        'daily_news': daily_news,
        }

    return render(request, 'display/category.html', context)
  1. Post作為一種傳輸資料的method,用在Form上。Post是將表單中的資料放在form的資料體中,按照變數和值相對應的方式,傳遞到action所指向URL。
    區別:
    request.POST['sth']會返回KeyError如果這裡沒有該引數
    request.POST.get('sth')會返回None如果這裡沒有該引數,而且它可以新增一個預設值作為返回。