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