1. 程式人生 > >Django基礎回顧與補充(79-80)

Django基礎回顧與補充(79-80)

Django框架之回顧與補充(d79-80)
一 HTTP協議:(重點)
  1 請求
   -請求首行
    -GET /index HTTP/1.1
   -請求頭部(在django框架中,可以從META中取出來)
    -key:value------>\r\n分割
   -請求體(post請求發的資料)   -----\r\n\r\n
    -往後臺傳資料的時候,有編碼方式(urlencoded,form-data,json/text)
     預設urlencoded---->name=lqz&name=18---->從POST中取出
    -form-data---上傳檔案,資料在body體中的格式---->也從POST中取出
    -json---->從POST中取不出來,只能從body中取出,然後反序列化
  2 響應
   -響應首行(用空格區分)
    -HTTP/1.1 200 OK   ---\r\n    
   -響應頭
    -key:value
   -響應體
    -html/css/js程式碼
二 web框架
  -django:大而全
  -flask:輕量級,第三方的外掛
  -tornado:非同步非阻塞
  -wsgi:Web Server Gateway Interface web服務閘道器介面---是一個協議
  -django測試階段用的:wsgiref
   import socket
   def server_run():
    soc = socket.socket()
    soc.bind(('127.0.0.1', 8008))
    soc.listen(5)
    while True:
     conn, addr = soc.accept()
     recv_data = conn.recv(1024)    
     ----->django框架
     路由層
     模板層
     模型層    
     conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))
     conn.close()
三 django框架所在位置:
  from wsgiref.simple_server import make_server
  def mya(environ, start_response):
   # print(environ)
   start_response('200 OK', [('Content-Type', 'text/html')])    
   return [b'404']
  class Test():
   pass
  test=Test()
  if __name__ == '__main__':
   myserver = make_server('127.0.0.1', 8011, test)
   print('監聽8010')
   myserver.serve_forever()  
四 django簡介
  -pip3 install django==1.11.09 -i 指定國內源
  -安裝成功後,會在script資料夾下多django-admin.exe
  -用來建立django專案
  -django-admin startproject 專案名字(到指定資料夾下)
  -cd到專案目錄下,可以建立app,可以執行專案,可以資料庫遷移
  -建立app:python3 manage.py startapp app的名字
  -執行專案app:python3 manage.py runserver
  -資料庫遷移1:python3 manage.py makemigrations
  -資料庫遷移2:python3 manage.py migrate  
五 mvc和mtv
  -django 是mtv模式:
   -M:model   ---->模型
   -T:Template  --->模板
   -V:view    ---->檢視
  -mvc模式:
   -M:model---->模型,資料庫相關
   -v:view----->模板---->頁面相關
   -C:controller--->控制器:url+view
  本質上:MTV就是MVC
   
六 Django請求生命週期
  詳見部落格
七 路由層
  一 Django中路由的作用
   -根據客戶請求的路徑,分發到不同的檢視函式
  二 簡單的路由配置
   -url('正則',函式,預設值,name)
   url(r'^author_update/', author.author_update,{'id':1}),
  三 有名分組,無名分組
   -利用正則分組:
    -有名分組:(?P<名字>\d+),分出的名字,會以關鍵字引數的形式,傳到檢視函式
    -無名分組:(\d+)分出的名字,會以位置引數的形式,傳到檢視函式  
  四 路由分發
   - url(r'^author_update/', include('子路由的路徑')),
   -可以傳子路由的路徑字串----推薦這種
   -可以傳子路由的py檔案
  五 反向解析
   -url(r'^author_update/', author.author_update,name='test'),
   -檢視函式重定向,或者模板中寫死了路徑
   -可以用反向解析來動態生成路徑
   -檢視層:(有引數)
    -url=reverse('test',args=(引數一,引數二,))
   -模板層:(有引數)
    {%url 'test' 引數一 引數二%}
  六 名稱空間
   -路徑重新命名,可能會重複,反向解析,就會出問題
   -指定名稱空間
   -url(r'^author_update/',include('子路由路徑',namespace='app01')),
   -reverse('app01:test')
  七 django2.0版的path
   -re_path根url一樣
   -path是準確路徑
   -5個轉換器:int,str,slug,path,uuid
   -自定義轉換器
    class Test:
     regex='正則'
     def to_python(self,value):
      邏輯處理
      return value
     def to_url(self,value)
      return '%04d'%value
   -使用:
    -register_converter(converters.FourDigitYearConverter, 'yyyy')
    -<yyy:year>
  八 偽靜態:
 8 檢視層
  -請求
   -request物件:POST,GET(post提交資料,瀏覽器位址列,也可以攜帶引數),method(大寫),body(post提交的所有資料),path(路徑),get_full_paht()-->(全路徑,包含資料),FILES(前臺傳過來的檔案,它是一個字典),META
  -響應:
   -render,HttpResponse,redirect
   -JsonResponse-->往前臺返回一個json格式資料(本質:繼承了HttpResponse,封裝了json)
   -不能轉換列表,想轉換,safe=False
   -編碼方式
  -cbv和fbv
   基於類的檢視cbv
    -路由:url(r'^test/', views.Test.as_view()),
    -檢視:
     class Test(View):
      def dispatch(self, request, *args, **kwargs):
       # 加點東西
       # request=request.POST
       response=super().dispatch(request, *args, **kwargs)
       # 加點東西
       return response
      def get(self,request):
       return HttpResponse('get')
   基於函式的檢視fbv
        
 9 模版層
  一 模版簡介
   渲染頁面
  二 模版語法之變數
   -{{ 變數 }}
   -{{深度查詢用.}}
  三 模版之過濾器
   -自帶過濾器
    {{ 引數|過濾器名字:引數 }}
    -date
    -add
    -length
    -upper
    -lower
   -可以自定義過濾器
  四 模版之標籤(都要有結束)
   -{% for %}
    -迴圈字典:(在模板裡,方法不能加括號)
     {% for key,value in 字典.items%}
    -forloop物件:parentloop,last,first,count,count0,revcountcount,revcount0
   -{% if %}
    -跟python if判斷一樣
    -可以巢狀在for迴圈中
    -{% elif%}
    -{% else%}
   -{% with%}
    -重新命名
  五 自定義標籤和過濾器
   -先註冊app
   -在app下建立一個templatetags的模組
   -在模組下新建一個py檔案
   -from django.template import Library
   -register=Library()------>名字必須叫register
   -標籤:
    -用裝飾器裝飾 @register.simple_tag
   -過濾器
    -用裝飾器裝飾 @register.filter
   -過濾器最多隻能傳兩個引數,標籤可以傳多個
   -在模板中使用:
    -{% load py檔名%}
    -{{引數|自定義的過濾器:引數}}----->過濾器
    -{% 自定義的標籤名 引數一 引數二 %}----->標籤
   
  補充:inclusion_tag 
   -先註冊app
   -在app下建立一個templatetags的模組
   -在模組下新建一個py檔案
   -from django.template import Library
   -register=Library()------>名字必須叫register
   -使用裝飾器:@register.inclusion_tag('test.html')
   -寫個函式my_inclusion,返回字典
   -模板裡就能取到字典,渲染模板
   -使用:
    在模板中:{%load py檔名%}
    {% my_inclusion 引數%}
  六 模版匯入和繼承
   -在模板中
    -{% include '模板的名字'%}----->不要再以html開頭,結尾了
   -繼承
    -寫一個母版,留幾個盒子
     -{%block 名字%}
      {%endblock%}
    -其他模板繼承該母版,擴寫盒子
     {%extends '母版名字'%}
     {%block 名字%}
     寫內容
     {%endblock%}
    -block.super--->可以顯式盒子中原來有的東西
    -多個盒子,跟寫的位置無關
  七 靜態檔案相關
   - 基本配置<link rel="stylesheet" href="/static/mycss.css">
   -static配置:
    -{%load static%}
    -{% static 'mycss.css'%}
    -<link rel="stylesheet" href="{% static 'mycss.css'%}">
   -get_static_prefix配置
   -{% load static %}
   -<link rel="stylesheet" href="{% get_static_prefix %}mycss.css">
   
 10 模型層
  -單表操作
   -增:兩種方式,create,物件.save()
   -刪:兩種方式:queryset,物件都要刪除方法
   -修改:queryset的update方法,物件修改--->沒有update,用save
   -查:
    -查詢api
    -模糊查詢:基於雙下劃線
  -多表操作
   -增加:
    一對一:authordetail=物件----authordetail_id=id
    一對多:可以傳物件,可以傳id
    多對多:
     -add,remove,
      -*args--可以傳物件,可以傳id
     -clear()清空所有
     -set
      -傳一個可迭代物件(可以傳物件,可以傳id)
   -刪除:如果設定了級聯刪除,就會級聯刪除
   -查詢
    -正向:關聯欄位在那個表,從哪個表往外查,是正向
    -反向:反過來
    -基於物件
     -正向按欄位
     -反向
      -一對一 :表名小寫
      -其他:表名小寫_set
     -子查詢,多條查詢
    -基於雙下劃線
     -核心:__連表
     -聚合:Count,Sum,Max.... aggregate
     -分組:annotate
      -總結:
       value在前表示group by,在後,表示取值
       filter在前,表示where,在後,表示having
     -F函式,Q函式
      -F函式,因為等號後面不能傳欄位,所以用F函式包裹一下
      -Q函式:表示與&  或|   非~  關係
  -常用,非常用欄位
   -常用的記住,非常用的知道
   -dateField型別:auto_now和auto_add_now
  常用引數:
   -級聯刪除:2.0以後,必須顯示指定
   -唯一性
   -索引
  元資訊:
   -重名名錶名
   -聯合索引
   -聯合唯一
補充事務:
 from django.db import transaction
 with transaction.atomic():
  # 兩條create
  pass
補充choice:
 -在模型表中定義mychoice=((1,'男'),(2,'女'),(3,'其他'))
 -在欄位上用:dd = models.IntegerField(choices=mychoice)
 -取對應的文字:
  -在檢視層:(get_欄位名_display())
   sex=author.get_dd_display()
   
補充defer和only(資料庫優化)
 only:只取我指定的欄位,返回值是queryset裡套物件,只是物件裡只有指定的欄位
 defer:反過來