1. 程式人生 > >python學習筆記(91) Django基礎之視圖

python學習筆記(91) Django基礎之視圖

本質 fun pre port pytho 模式 反向 正則 book

1. 視圖(接收請求返回響應那部分)
1. CBV(class base view)和FBV(function base view)
CBV:
  from django.views import View
  class AddPublisher(View):
  def get(self, request):
    pass
  def post(self, request):
    pass

url(r‘^add_publisher/‘, views.AddPublisher.as_view())

2. request對象
  1. 之前學過的
    1. request.method --> 獲取請求的方法(GET、POST等)
    2. request.GET --> 通常用來獲取URL裏面的參數
      127.0.0.1:8000/edit_book/?id=1&name=yimi
      request.GET --> {"id":1, "name":"yimi"}
      request.GET.get("id")
    3. request.POST --> 用來獲取POST提交過來的數據
      request.POST.get("book_name")
  2. 補充其他常用的:
    1. request.path_info --> 獲取用戶請求的路徑(不包含IP和端口和URL參數)
    /add_publisher/
    2. request.body
    POST的數據(字節類型)
    3.request.FILES
    上傳的文件

3. response
基礎必備三件套(求學要嚴謹)
  1. HttpResponse --> 返回字符串內容
  2. render --> 返回一個html頁面
  3. redirect --> 返回一個重定向(告訴瀏覽器再去訪問另外的網址)

4. JsonResponse
  from django.http import JsonResponse
  return JsonResponse(data) # 不設置safe=False的話只能接收字典格式

2. 路由系統(urls.py) http://www.cnblogs.com/liwenzhou/p/8271147.html
  1. 正則表達式的模糊匹配 # 匹配到的永遠是字符串類型
  2. 分組匹配 --> 相當於給視圖函數傳遞位置參數
    url(r‘^book/([0-9]{2,4})/([a-zA-Z]{3})‘, views.book)

    url(r‘^publisjer_delete/([0-9]+)$‘, views.publisher_delete),
    def publisher_delete(request, del_id)
  3. 分組命名匹配 --> 相當於給視圖函數傳遞關鍵字參數
    url(r‘^(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/‘, views.date)
    (兩個不要混合使用)

---------------------------- 這裏是坎 ------------------------------------

4. 反向解析URL
本質上就是給url匹配模式起別名,然後用過別名拿到具體的URL路徑

  1. 怎麽起別名?
  在url匹配模式中,定義name="別名"
  2. 如何使用?
    1. 在模板語言(html)裏面使用:
      {% url "別名" %} --> 得到具體的URL路徑
    2. 在視圖中如何使用:
      from django.urls import reverse
      reverse("別名") --> 得到具體的URL路徑
      redirect()
  3. 如何傳參數?(分組命名匹配)
    1. 模板語言中:
      {% url "別名" 2018 "nb" %}
    2. 視圖函數中
      傳位置參數:
      reverse("別名", args=(2018, "nb"))

    傳關鍵字參數:
      reverse("別名" kwargs={"year": 2018, "title": "nb"})
  4. namespace
    為了防止不同的app下面的url匹配模式有重復的別名

  5.使用include包含其他的url(二級路由)
    from app01 import views, urls
    url(r‘^app01/‘, include(urls)), # 所有以app01開頭的url都交給app01/urls.py來處理

python學習筆記(91) Django基礎之視圖