django初識

django

[TOC]css

django初識html

django的本質就是基於socket通訊python

一。127.0.0.1 本地迴環地址 後面:8001是端口號 /ppt是根目錄下的ppt子網頁
二。/當前網站的客戶端(根目錄)
例如:
127.0.0.1/#默認80能夠不寫

 

web框架的功能;

1.使用socket收發信息
2.根據不一樣路徑返回不一樣的內容
3. 返回動態的數據(字符串的替換 模板的渲染)

web框架的幾個開源版本

low版web框架

 1 import socket
 2 server=socket.socket()
 3  4 server.bind(('127.0.0.1',8001))
 5 server.listen()
 6  7 while 1:
 8     conn,addr=server.accept()
 9 10     from_brower_msg=conn.recv(1024)
11     path=from_brower_msg.decode('utf-8').split(' ')[1]#對收到消息編碼轉換成字符串,切割成列表【0】是方法【1】是對應的頁面
12 #GET / HTTP/1.1
13     #/是本頁面的主頁面 /後面的home page什麼的都是對應的子頁面
14     print(path)
15     conn.send(b'http/1.1 200 ok\r\n\r\n')
16     if path=='/':#讀取文件都用rb
17         with open("04test.html",'rb')as f:
18             data=f.read()
19     elif path=='/style.css':#判斷路徑是否存在
20         with open('style.css','rb')as f:
21             data=f.read()
22     elif path == '/mi.png':#每遇到一個url都會請求一次
23         with open('mi.png', 'rb') as f:
24             data = f.read()
25     elif path=="./test.js":
26         with open("test.js","rb")as f:
27             data=f.read()
28     conn.send(data)
29     conn.close()

 

html頁面web

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="./style.css"><!--從上往下執行 遇到io(地址主動向服務端發送請求)-->
</head>
<body>
<h2>24期官網</h2>
<div>
    <img src="./mi.png" alt=""><!--從上往下執行 遇到io(地址主動向服務端發送請求)-->
</div>
<script src="test.js"></script><!--從上往下執行 遇到io(地址主動向服務端發送請求)-->
</body>
​
</html>

  

只要跳出html文件就會出問題shell

升級函數版多線程數據庫

 

 1 import socket
 2 from concurrent.futures import ThreadPoolExecutor
 3  4 server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 5 server.bind(("127.0.0.1",8848))
 6 server.listen()
 7  8 #必定記得關閉鏈接 等待下一個鏈接請求
 9 #處理頁面請求的函數
10 def home(conn):
11     with open('04test.html','rb')as f:
12         data=f.read()
13         conn.send(data)
14         conn.close()#關閉鏈接等待下一個請求
15 #處理頁面link( <link rel="stylesheet" href="test.css">)標籤href屬性值是本地路徑的時候的請求        
16 def css(conn):
17     with open('style.css','rb')as f:
18         data=f.read()
19         conn.send(data)
20         conn.close()#關閉鏈接
21 #處理頁面script(<script src="test.js"></script>)標籤src屬性值是本地路徑的時候的請求
22 def js(conn):
23     with open("test.js","rb")as f:
24         data=f.read()
25         conn.send(data)
26         conn.close()
27 28 #處理頁面img標籤src屬性值是本地路徑的時候的請求
29 30 def pic(conn):
31     with open("mi.png","rb")as f:
32         data=f.read()
33         conn.send(data)
34         conn.close()#關閉
35 while 1:
36     conn,addr=server.accept()
37     from_brower_msg = conn.recv(1024)
38     # print(from_brower_msg)
39     path = from_brower_msg.decode('utf-8').split(' ')[1]
40     print(path)
41     conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
42     urlpatterns = [
43         ('/',home),
44     ('/style.css',css),
45     ('/test.js',js),
46     ('/mi.png',pic)
47     ]
48     #線程池
49     for url in urlpatterns:
50         if path ==url[0]:
51             # ret=url)[1](
52             t=ThreadPoolExecutor()#開啓一個線程池
53             t.submit(url[1],conn)#
54             break
55       else:
56         conn.send(b'404')
57  ············································       #多線程
58     for url in urlpatterns:
59         if path == url[0]:
60            t = Thread(target=url[1],args=(conn,))
61             t.start()
62             break
63     else:
64         conn.send(b'404')

 

jinja2 第三方內置框架和wsgiref相似socketserverdjango

jinja2 本質是字符串替換json

把數據庫中查詢到的內容進行文本的替換,讀取用r flask

字符串替換replace瀏覽器

用jinja2獨有的渲染方法 flask 裏面的東西 沒有渲染 利用jinja2渲染

wsgiref和jinja

from wsgiref.simple_server import make_server
from jinja2 import Template


def index():
  # 把數據庫中查詢到的內容進行文本的替換,讀取用r
   with open("index2.html", "r",encoding='utf-8') as f:
       data = f.read()
   template = Template(data)  # 生成模板文件
   ret = template.render({"name": "于謙", "hobby_list": ["燙頭", "泡吧"]})  # 把數據填充到模板裏面
   return [bytes(ret, encoding="utf8"), ]


# 定義一個url和函數的對應關係
URL_LIST = [
  ("/index/", index),
]
#environ返回的是一個字典
def run_server(environ, start_response):
   start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 設置HTTP響應的狀態碼和頭信息
   url = environ['PATH_INFO']  # 取到用戶輸入的url
   func = None  # 將要執行的函數
   for i in URL_LIST:
       if i[0] == url:
           func = i[1]  # 去以前定義好的url列表裏找url應該執行的函數
           break
   if func:  # 若是能找到要執行的函數
       return func()  # 返回函數的執行結果
   else:
       return [bytes("404沒有該頁面", encoding="utf8"), ]


if __name__ == '__main__':
   httpd = make_server('', 8000, run_server)
   print("Serving HTTP on port 8000...")
   httpd.serve_forever()#發送給瀏覽器

html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
 <meta charset="UTF-8">
 <meta http-equiv="x-ua-compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>Title</title>
</head>
<body>
   <h1>姓名:{{name}}</h1>#第一種寫法
   <h1>愛好:</h1>
   <ul>
      {% for hobby in hobby_list %}#第二種寫法循環鍵值對
       <li>{{hobby}}</li>
      {% endfor %}
   </ul>
</body>
</html>

reponse

wsgiref框架

http 規定請求和響應的標準

get獲取數據 post 提交數據

1.客戶端連接web服務器

2.發送http請求

3.服務器接收請求並返回http響應

4.釋放連接tcp鏈接

5.客戶端瀏覽器解析html內容

http的分爲兩種

短連接和無鏈接 無狀態
無鏈接發送完就斷開連接,
無鏈接有兩種模式
短連接
發送完數據等待幾秒客戶端的操做
無狀態
不會保留狀態

http

http協議
請求信息格式
GET / HTTP/1.1   請求行
Host: 127.0.0.1:8003 請求頭
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
指定 瀏覽器格式
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
#空行
請求數據 username=ziwen password=666


get請求 請求數據部分是沒有數據的,get請求的數據在url上,在請求行裏面,有大小限制,常見的get請求方式: 瀏覽器輸入網址,a標籤
post請求 請求數據在請求體(請求數據部分) ,數據沒有大小限制, 常見方式:form表單提交數據

 

HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端。HTTP協議採用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行做爲響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據.
如下是 HTTP 請求/響應的步驟:
1. 客戶端鏈接到Web服務器
一個HTTP客戶端,一般是瀏覽器,與Web服務器的HTTP端口(默認爲80)創建一個TCP套接字鏈接。例如,http://www.luffycity.com。
2. 發送HTTP請求
經過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。
3. 服務器接受請求並返回HTTP響應
Web服務器解析請求,定位請求資源。服務器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。
4. 釋放鏈接TCP鏈接
若connection 模式爲close,則服務器主動關閉TCP鏈接,客戶端被動關閉鏈接,釋放TCP鏈接;若connection 模式爲keepalive,則該鏈接會保持一段時間,在該時間內能夠繼續接收請求;
5. 客戶端瀏覽器解析HTML內容
客戶端瀏覽器首先解析狀態行,查看代表請求是否成功的狀態代碼。而後解析每個響應頭,響應頭告知如下爲若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。
````````````````````````````````````
在瀏覽器地址欄鍵入URL,按下回車以後會經歷如下流程:

1.瀏覽器向 DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址;
2.解析出 IP 地址後,根據該 IP 地址和默認端口 80,和服務器創建TCP鏈接;
3.瀏覽器發出讀取文件(URL 中域名後面部分對應的文件)的HTTP 請求,該請求報文做爲 TCP 三次握手的第三個報文的數據發送給服務器;(根據不一樣路徑返回不一樣數據)
4.服務器對瀏覽器請求做出響應,並把對應的 html 文本發送給瀏覽器;
5.釋放 TCP鏈接;(conn.close())由於tcp是長鏈接 http協議的特色
6.瀏覽器將該 html 文本並顯示內容;  

請求方法

八種動做

經常使用get post

#GET
//向指定的資源發出「顯示」請求。使用GET方法應該只用在讀取數據,而不該當被用於產生「反作用」的操做中,例如在Web Application中。其中一個緣由是GET可能會被網絡蜘蛛等隨意訪問。
#HEAD//
//與GET方法同樣,都是向服務器發出指定資源的請求。只不過服務器將不傳回資源的本文部分。它的好處在於,使用這個方法能夠在沒必要傳輸所有內容的狀況下,就能夠獲取其中「關於該資源的信息」(元信息或稱元數據)。
#POST
//向指定資源提交數據,請求服務器進行處理(例如提交表單或者上傳文件)。數據被包含在請求本文中。這個請求可能會建立新的資源或修改現有資源,或兩者皆有。(把信息放入了請求數據)
PUT
//向指定資源位置上傳其最新內容。
DELETE
//請求服務器刪除Request-URI所標識的資源。
TRACE
//回顯服務器收到的請求,主要用於測試或診斷。
OPTIONS
//這個方法可以使服務器傳回該資源所支持的全部HTTP請求方法。用'*'來代替資源名稱,向Web服務器發送OPTIONS請求,能夠測試服務器功能是否正常運做。
#CONNECT
//HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器。一般用於SSL加密服務器的連接(經由加密的HTTP代理服務器)。

http狀態碼

1xx消息——請求已被服務器接收,繼續處理
2xx成功——請求已成功被服務器接收、理解、並接受
3xx重定向——須要後續操做才能完成這一請求
4xx請求錯誤——請求含有詞法錯誤或者沒法被執行
5xx服務器錯誤——服務器在處理某個正確請求時發生錯誤

重定向

例如一個http:jd.com/auth
1.輸入 username和passwerd 提交數據
2.判斷用戶是否合法
3.若是是重定向 3xx
4.瀏覽器拿到網址,get請求獲取對應的html
首頁 http:www.jd.com

 

mvc和mtv框架

mvc
M --- models 數據庫相關
v --- views 視圖相關(邏輯)
C -- controller url控制器(url分發器,路由分發)
django-mtv
M -- models 數據庫相關
T -- templates HTML相關 html就是模板
V -- views  視圖相關(邏輯)s
+ controller url控制器(url分發器,路由分發)

url

https默認 443端口

http默認 80端口

查詢參數

?k1=v1&k2=v2

超文本傳輸協議(HTTP)的統一資源定位符將從因特網獲取信息的五個基本元素包括在一個簡單的地址中:
傳送協議。
層級URL標記符號(爲[////],固定不變)
訪問資源須要的憑證信息(可省略)
1.服務器。
   #//(一般爲域名,有時爲IP地址(dns解析))
2.端口號。
   //(以數字方式表示,若爲HTTP的默認值「:80」可省略)
路徑。
   //(以「/」字符區別路徑中的每個目錄名稱)
查詢。
   //(GET模式的窗體參數,以「?」字符爲起點,每一個參數以「&」隔開,再以「=」分開參數名稱與數據,一般以UTF8的URL編碼,避開字符衝突的問題)
片斷。
   //以「#」字符爲起點
····································    
以http://www.luffycity.com:80/news/index.html?id=250&page=1 爲例, 其中:
1.  http,是協議;
2.  www.luffycity.com,是服務器;
3.  80,是服務器上的網絡端口號;
4.  /news/index.html,是路徑;
5.  ?id=250&page=1,是查詢。
大多數網頁瀏覽器不要求用戶輸入網頁中「http://」的部分,由於絕大多數網頁內容是超文本傳輸協議文件。一樣,「80」是超文本傳輸協議文件的經常使用端口號,所以通常也沒必要寫明。通常來講用戶只要鍵入統一資源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就能夠了。

響應格式

url是127.0.0.1 /路徑

響應能夠不寫頭部字段 在回覆信息的時候能夠定製響應頭

wsgi 是一種規範定義python的接口規範 能夠搭配不一樣的應用程序

本地測試用wsgiref

請求(網址訪問,提交數據等等) request
響應(回覆頁面,回覆數據等等) response

下載安裝django

pip3 install django==1.11.23

django建立項目

命令行

下載安裝django

pip3 install django==1.11.23
pip3 install django==1.11.23 http://mirrors.aliyun.com/pypi/simple/

python36 manage.py runserver#開啓django項目
python36 manage.py runserver 80 把端口號改爲默認80
python36 manage.py runserver 0.0.0.0:80 其餘人就能夠訪問了

djnago的py文件的分類

1.manage.py ----- Django項目裏面的工具,經過它能夠調用django shell和數據庫,啓動關閉項目與項目交互等,無論你將框架分了幾個文件,必然有一個啓動文件,其實他們自己就是一個文件。
2.settings.py ---- 包含了項目的默認設置,包括數據庫信息,調試標誌以及其餘一些工做的變量。
3.urls.py ----- 負責把URL模式映射到應用程序w。
4.wsgi.py ---- runserver命令就使用wsgiref模塊作簡單的web server,後面會看到renserver命令,全部與socket相關的內容都在這個文件裏面了,目前不須要關注它。

子項目的文件分類

views是寫視圖函數 視圖類 代碼邏輯

models是數據庫的源 寫與數據庫相關的的

templatses 是模板 放置html xml等網絡文件

wsgi用於書寫socket

django基本操做

 

request對象 封裝了全部請求  
request.method是當前請求方法 
````````````````````````````````````
.post 獲取post請求的數據
.get 獲取get請求的數據
request.GET.get('pwd') 獲取get 字典的值
request.POST.get('pwd')獲取post 字典的值
post。get(「鍵」)取得的值是一個字符串
·······································
​
`````````````````````````````````````````````
注意'django.middleware.csrf.CsrfViewMiddleware',#安全機制
​
返回一個字典 獲取值要把一個安全機制註釋才能過

 

須要引用模塊

關鍵字
from django.shortcuts import render,HttpResponse#引用一個快捷鍵
render (request,'home.html')
#模板渲染 模板就是html頁面 渲染就是字符串替換
HttpResponse("")
#傳入一個字符串 向瀏覽器返回一個頁面

視圖函數

視圖函數
def articles(request,year,month): # 位置參數(形參) 2019 9
print(year,type(year)) #2019 <class 'str'>  
#匹配出來的全部數據都是字符串
  print(month)
return HttpResponse(year+'年'+ month +'月' +'全部文章')
 # 無名分組參數
   url(r'^articles/(\d+)/(\d+)/', views.articles), #articles/2019/9/

# 有名分組參數
url(r'^articles/(?P<xx>\d+)/(?P<oo>\d+)/', views.articles), #articles/2019/9/
#xx=2019 oo=9 關鍵字傳參

def articles(request,oo,xx):  # 關鍵字傳參 2019 9
   print(xx,type(xx)) #2019 <class 'str'> #匹配出來的全部數據都是字符串
   print(oo)
   return HttpResponse(xx+'年'+ oo +'月' +'全部文章')

有名函數

 

# 有名分組參數
url(r'^articles/(?P<xx>\d+)/(?P<oo>\d+)/', views.articles), #articles/2019/9/
#xx=2019  oo=9  關鍵字傳參
def articles(request,oo,xx):  # 關鍵字傳參 2019  9
    print(xx,type(xx)) #2019 <class 'str'>  #匹配出來的全部數據都是字符串
    print(oo)
    return HttpResponse(xx+''+ oo +'' +'全部文章')

 

無名分組參數

 # 無名分組參數
url(r'^articles/(\d+)/(\d+)/', views.articles), #articles/2019/9/
正則分組/(\d+)/(\d+)/會把匹配的  一一對應單獨存儲一個變量
(\d+)正則貪婪 知足一個或多個整數

 

具體示例

例如/articles/2019/9會把路徑進行正則匹配 
#(要一一對應)
url(r"^articles/(\d+)/(\d+)/",views.articles),
#匹配的時候,返回對應的匹配的內容,
#articles是返回路徑 兩個參數進行

 

視圖函數(request請求)補充

request是wsgirequest實例化的對象
1.print(request)打印出來的是--str--的返回值
requesrt這個對象含有————str————
#返回的都是字符串
2.print(request.path) #/home/ 純路徑

3.print(request.path_info) #/home/ 純路徑

4.print(request.get_full_path()) #/home/?a=1&b=2 全路徑(不包含ip地址和端口)

5.print(request.body)  可以拿到請求數據部分的數據(post,get沒有),get數據的內容在url裏

6.print(request.META)
是一個Python字典,包含了全部本次HTTP請求的Header信息
查看須要在線json轉換
user-agent返回

7.print(request.GET)返回get請求的數據相似字典的值
8.print(request.POST)返回get請求的數據相似字典的值
訪問其餘路徑服務端會返回狀態信息(狀態碼)

response響應的三個方法

三個方法都須要模塊的引用
底部都有一個httpResponse 把字符串傳入頁面
form django.shortcuts import render,HttpResponse,redirect
1.HTTPResponse('字符串')#傳入一個字符串 向瀏覽器返回一個頁面
render 和redirect都是經過httpresponse傳遞給瀏覽器

2.render(request,'xx.html')返回瀏覽器一個xx.html
#模板渲染 模板就是html頁面 渲染就是字符串替換
'''
示例
'''
#home.html頁面
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
</head>
<body>
<h1>24期官網</h1>
<h2>{{ namxx }}</h2>
</body>
</html>


#views視圖.py (render有第三個參數是html傳參使用)
def home(request):
   name = 'chao'
   return render(request, 'home.html', {'namxx':name,})  #模板渲染(先把字符串替換了),這是在回覆給瀏覽器以前作的事情
·······································

3.redirect 重定向

#用法 redirect(路徑) 示例:redirect('/index/')

會返回瀏覽器3xx一個重定向 返回一個redirect('/index/')路徑

redirect示例
瀏覽器訪問/index/#例如127.0.0.1/index/
urls.py
from django.conf.urls import url
from django.contrib import admin
from Django_test import views#引用 視圖函數模塊
urlpatterns = [
  url(r'^index/', views.index),
]
def home(request):
   print('xxxxx')
return redirect('/index/') #重定向路徑

1569402912947

FBV和CBV 視圖(視圖函數和視圖類)

FBV是視圖函數

def 函數名(request):
   函數體#進行判斷
   return 要一個返回值返回給瀏覽器

CBV是視圖類

urls寫法

url(r'^login',views.LoginView.as_view())
1.加載到這一句的時候LoginView這個類直接調用執行類方法,LoginView沒有as_view方法 去父類View去尋找這個方法
2.執行完以後返回一個view方法名
3.至關於視圖函數#執行url(r'^login',views.view)
4.等待源碼調用view方法(函數)

views視圖類的寫法

from django.views import View#引用View方法
class LoginView(View):#建立一個類 繼承父類view
   def get(self,request):##處理get請求直接定義get方法,不須要本身判斷請求方法了,源碼中用dispatch方法中使用了反射來處理的
       print('小小小小')
       return render(request,'login.html')
   def post(self,request)

view源碼簡化分析

執行步驟:
1.加載類名去調用執行as_view方法#views.loginview.as_view()#as_view
2.as_view返回一個view方法名
3.urls執行view方法
4.執行到view方法self = cls(**initkwargs)#實例化一個對象cls對應的就是 LoginView視圖類
5. 繼續往下執行return self.dispatch(request, *args, **kwargs)#這時self是LoginView視圖類的實例化對象 去LoginView類中去尋找dispatch方法
6.LoginView視圖類沒有找到去對應的父類View去尋找
dispatch方法
7.找到http_method_names對應屬性裏面有各種方法
8.請求的方法名在這個屬性中繼續往下執行反射
9.利用反射去尋找對應的方法,若是找不到對應方法執行第三個參數報錯
#注意
getattr 第二個參數找不到就執行第三個參數 執行第三個方法直接報錯返回 日誌打印405


父類view
class View(object):

   http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
   @classonlymethod
   def as_view(cls, **initkwargs):
       for key in initkwargs:
           if key in cls.http_method_names:
               raise TypeError("You tried to pass in the %s method name as a "
                               "keyword argument to %s(). Don't do that."
                               % (key, cls.__name__))
           if not hasattr(cls, key):
               raise TypeError("%s() received an invalid keyword %r. as_view "
                               "only accepts arguments that are already "
                               "attributes of the class." % (cls.__name__, key))
     2.#as_view裏面有一個view方法
      def view(request, *args, **kwargs):
           self = cls(**initkwargs)
           3.#實例化cls方法(就是LoginView視圖類) 拿到本身類的對象
           if hasattr(self, 'get') and not hasattr(self, 'head'):
               self.head = self.get
           self.request = request
           self.args = args
           self.kwargs = kwargs
           return self.dispatch(request, *args, **kwargs)
       4.#執行到這發現 類調用一個方法 去試圖類(LoginView)尋找dispatch方法,沒有這個方法就去繼承的父類去尋找 執行
       view.view_class = cls
       view.view_initkwargs = initkwargs

       update_wrapper(view, cls, updated=())

       update_wrapper(view, cls.dispatch, assigned=())
       return view 1.#返回一個view方法
   """
  dispatch方法
  """
5.找到dispatch方法執行
def dispatch(self, request, *args, **kwargs):
  #request.method.lower()取得請求對應的方法 方法名都是大寫的因此須要小寫對應
  #http_method_names去LoginView類去找,找不到去在源碼中尋找(也就是繼承的父類)
  if request.method.lower() in self.http_method_names:
      #請求的方法名在這個屬性中繼續往下執行反射
      handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
      #利用反射去尋找對應的方法
      #getattr 第二個參數找不到就執行第三個參數 執行第三個方法直接報錯返回 日誌打印405
  else:
      handler = self.http_method_not_allowed
  return handler(request, *args, **kwargs)
'''http_method_not_allowed方法'''

```python
def http_method_not_allowed(self, request, *args, **kwargs):
  logger.warning(
      'Method Not Allowed (%s): %s', request.method, request.path,
      extra={'status_code': 405, 'request': request}
  )
  return http.HttpResponseNotAllowed(self._allowed_methods())
類名裏面有一個視圖方法

```python
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
getattr 第二個參數找不到就執行第三個參數

想法 在進行分發操做以前想要執行一些命令

本身重構父類的時候必須執行父類的分發操做

若是沒有這個方法他會報錯(重構父類dispatch方法)

class LoginView(View):
   def dispatch(self,request,*args,**kwargs):
       print("xxx請求來了")
   ret=super(LoginView,self).dispatch(request,*args,**)
  重構父類(view)的dispatch方法
#def dispatch(self, request, *args, **kwargs):
 # if request.method.lower() in self.http_method_names:
   #handler = getattr(self,request.method.lower(),
#self.http_method_not_allowed)
# else:
 #handler = self.http_method_not_allowed
 #return handler(request, *args, **kwargs)
#執行對應方法 得到返回值

   print("執行結束")
   return ret
#至關於執行return handler(request, *args, **kwargs)
   def get(self,request):
       print('xxxx')
       return render(request,"login.html")
   def post(self,request):
       print(request.POST)
       return HttpResponse('登陸成功')

圖解

![1569416028460](C:\Users\安小文\AppData\Roaming\Typora\typora-user-images\1569416028460.png)

裝飾器

有三種方式

在類上面必須指定請求方法

from django.utils.decorators import method_decorator
#必須引用django封裝的裝飾器
def wrapper(func):
   def inner(*args, **kwargs):
       print(11111)
       ret = func(*args, **kwargs)
       print(22222)

       return ret

   return inner

@method_decorator(wrapper,name='get')#第一種放鬆
class LoginView(View):
   def get(self,request):
       print('xxxx')
       return render(request,"login.html")

   @method_decorator(wrapper) #方式2
   def dispatch(self, request, *args, **kwargs):
       print('xx請求來啦!!!!')

       ret = super().dispatch(request, *args, **kwargs)

       print('請求處理的邏輯已經結束啦!!!')
       return ret

   @method_decorator(wrapper)#方式3
   def post(self,request):
        print(request.POST)
        return HttpResponse('登陸成功')

模板渲染

 

 

開源的djnago初識

low版登錄跳轉頁面

思路

1.開啓django 配置好路徑
2.在瀏覽器訪問路徑例如:#127.0.0.1(迴環地址)/後面寫路徑
3.路徑的相應的請求 去urls這個文件去尋找相應匹配的路徑 ,調用相應視圖函數(views是視圖函數)
4.根據對應匹配的函數 返回瀏覽器相應的頁面
render(requset,返回頁面)
第一個爲 固定requset
例如#return render(request,"home.html")

第三方模塊

jinja2 本質是字符串替換

使用數據庫進行 文本的替換

用jinja2獨有的渲染方法 flask 裏面的東西 沒有渲染 利用jinja2渲染

wsgiref模塊web框架

 1 from wsgiref.simple_server import make_server
 2 # wsgiref自己就是個web框架,提供了一些固定的功能(請求和響應信息的封裝,不須要咱們本身寫原生的socket了也不須要我們本身來完成請求信息的提取了,提取起來很方便)
 3 #函數名字隨便起
 4 def application(environ, start_response):
 5     '''
 6     :param environ: 是所有加工好的請求信息,加工成了一個字典,經過字典取值的方式就能拿到不少你想要拿到的信息
 7     :param start_response: 幫你封裝響應信息的(響應行和響應頭),注意下面的參數
 8     :return:
 9     '''
10     start_response('200 OK', [('Content-Type', 'text/html'),('k1','v1')])
11     print(environ)
12     print(environ['PATH_INFO'])  #輸入地址127.0.0.1:8000,這個打印的是'/',
13  #輸入的是127.0.0.1:8000/index,打印結果是'/index'
14     return [b'<h1>Hello, web!</h1>']
15 16 #和我們學的socketserver那個模塊很像啊
17 httpd = make_server('127.0.0.1', 8080, application)
18 19 print('Serving HTTP on port 8080...')
20 # 開始監聽HTTP請求:
21 httpd.serve_forever()
相關文章
相關標籤/搜索