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