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:反過來css

相關文章
相關標籤/搜索