溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django中web框架的本質(zhì)是什么

發(fā)布時(shí)間:2021-08-25 09:28:06 來源:億速云 閱讀:117 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Django中web框架的本質(zhì)是什么,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

一 web框架的本質(zhì)及自定義web框架

我們可以這樣理解:所有的Web應(yīng)用本質(zhì)上就是一個(gè)socket服務(wù)端,而用戶的瀏覽器就是一個(gè)socket客戶端,基于請(qǐng)求做出響應(yīng),客戶都先請(qǐng)求,服務(wù)端做出對(duì)應(yīng)的響應(yīng),按照http協(xié)議的請(qǐng)求協(xié)議發(fā)送請(qǐng)求,服務(wù)端按照http協(xié)議的響應(yīng)協(xié)議來響應(yīng)請(qǐng)求,這樣的網(wǎng)絡(luò)通信,我們就可以自己實(shí)現(xiàn)Web框架了。

通過對(duì)socket的學(xué)習(xí),我們知道網(wǎng)絡(luò)通信,我們完全可以自己寫了,因?yàn)閟ocket就是做網(wǎng)絡(luò)通信用的,下面我們就基于socket來自己實(shí)現(xiàn)一個(gè)web框架,寫一個(gè)web服務(wù)端,讓瀏覽器來請(qǐng)求,并通過自己的服務(wù)端把頁(yè)面返回給瀏覽器,瀏覽器渲染出我們想要的效果。

html文件內(nèi)容如下,名稱為test.html:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <link rel="icon" href="wechat.ico" rel="external nofollow" rel="external nofollow" rel="external nofollow" > 
 <!--直接寫在html頁(yè)面里面的css樣式是直接可以在瀏覽器上顯示的-->
 <style>
  h2{
   background-color: green;
   color: white;
  }
 </style>
</head>
<body>

<h2>姑娘,你好,我是Jaden,請(qǐng)問約嗎?嘻嘻~~</h2>
<!--直接寫在html頁(yè)面里面的img標(biāo)簽的src屬性值如果是別人網(wǎng)站的地址(網(wǎng)絡(luò)地址)是直接可以在瀏覽器上顯示的-->
<!--<img src="https://cache.yisu.com/upload/information/20200622/113/29300.html" alt="">--> <!--如果都是網(wǎng)絡(luò)地址,那么只要你的電腦有網(wǎng),就可以看到,不需要自己在后端寫對(duì)應(yīng)的讀取文件,返回圖片文件信息的代碼,因?yàn)閯e人的網(wǎng)站就做了這個(gè)事情了-->
<img src="meinv.png" alt="" width="100" height="100"> <!--如果你是本地的圖片想要返回給頁(yè)面,你需要對(duì)頁(yè)面上的關(guān)于這個(gè)圖片的請(qǐng)求要自己做出響應(yīng),這個(gè)src就是來你本地請(qǐng)求這個(gè)圖片,你只要將圖片信息讀取出來,返回給頁(yè)面,頁(yè)面拿到這個(gè)圖片的數(shù)據(jù),就能夠渲染出來了,是不是很簡(jiǎn)單-->

<!--直接寫在html頁(yè)面里面的js操作是直接可以在瀏覽器上顯示的-->
<script>
 alert('這是我們第一個(gè)網(wǎng)頁(yè)')
</script>

<script src="test.js"></script>
</body>
</html>

<!--再準(zhǔn)備一個(gè)圖片,名稱為meinv.jpg,再準(zhǔn)備一個(gè)ico文件,名稱為wechat.ico,其實(shí)就是個(gè)圖片文件,微信官網(wǎng)打開之后,在瀏覽器最上面能夠看到-->

然后開始寫我們的web框架,我們分這么幾步來寫:

一、簡(jiǎn)單的web框架

創(chuàng)建一個(gè)python文件,內(nèi)容如下,名稱為test.py:

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8001))
sk.listen()
conn,addr = sk.accept()
from_b_msg = conn.recv(1024)
str_msg = from_b_msg.decode('utf-8')
#socket是應(yīng)用層和傳輸層之間的抽象層,每次都有協(xié)議,協(xié)議就是消息格式,那么傳輸層的消息格式我們不用管,因?yàn)閟ocket幫我們搞定了,但是應(yīng)用層的協(xié)議還是需要咱們自己遵守的,所以再給瀏覽器發(fā)送消息的時(shí)候,如果沒有按照應(yīng)用層的消息格式來寫,那么你返回給瀏覽器的信息,瀏覽器是沒法識(shí)別的。而應(yīng)用層的協(xié)議就是我們的HTTP協(xié)議,所以我們按照HTTP協(xié)議規(guī)定的消息格式來給瀏覽器返回消息就沒有問題了,關(guān)于HTTP我們會(huì)細(xì)說,首先看一下直接寫conn.send(b'hello')的效果,然后運(yùn)行代碼,通過瀏覽器來訪問一下,然后再看這一句conn.send(b'HTTP/1.1 200 ok \r\n\r\nhello')的效果
#下面這句就是按照http協(xié)議來寫的
# conn.send(b'HTTP/1.1 200 ok \r\n\r\nhello')
#上面這句還可以分成下面兩句來寫
conn.send(b'HTTP/1.1 200 ok \r\n\r\n')
with open('test.html','rb') as f:
 f_data = f.read()
conn.send(f_data)

但是我們知道,我們的css和js基本都是寫在本地的文件里面的啊,而且我們的圖片基本也是我們自己本地的啊,怎么辦,我們將上面我們提前準(zhǔn)備好的js和css還有那個(gè).ico結(jié)尾的圖片文件都準(zhǔn)備好,來我們?cè)趤硪粋€(gè)升級(jí)版的web框架,其實(shí)css、js、圖片等文件都叫做網(wǎng)站的靜態(tài)文件。

首先我們先看一個(gè)效果,如果我們直接將我們寫好的css和js還有.ico和圖片文件插入到我們的html頁(yè)面里面,就是下面這個(gè)html文件

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <link rel="stylesheet" href="test.css" rel="external nofollow" rel="external nofollow" >
 <link rel="icon" href="wechat.ico" rel="external nofollow" rel="external nofollow" rel="external nofollow" > 
</head>
<body>
<h2>姑娘,你好,我是Jaden,請(qǐng)問約嗎?嘻嘻~~</h2>
<img src="meinv.png" alt="" width="100" height="100"> 
<script src="test.js"></script>
</body>
</html>



<!--css文件內(nèi)容如下,名稱為test.css: -->
 h2{
  background-color: green;
  color: white;
 }


<!-- js文件內(nèi)容如下,名稱為test.js:-->
 alert('這是我們第一個(gè)網(wǎng)頁(yè)');

二、返回靜態(tài)文件的高級(jí)web框架

import socket

sk = socket.socket()
sk.bind(('127.0.0.1',8001))
sk.listen()

#首先瀏覽器相當(dāng)于給我們發(fā)送了多個(gè)請(qǐng)求,一個(gè)是請(qǐng)求我們的html文件,而我們的html文件里面的引入文件的標(biāo)簽又給我們這個(gè)網(wǎng)站發(fā)送了請(qǐng)求靜態(tài)文件的請(qǐng)求,所以我們要將建立連接的過程循環(huán)起來,才能接受多個(gè)請(qǐng)求,沒毛病
while 1:
 conn,addr = sk.accept()
 # while 1:
 from_b_msg = conn.recv(1024)
 str_msg = from_b_msg.decode('utf-8')
 #通過http協(xié)議我們知道,瀏覽器請(qǐng)求的時(shí)候,有一個(gè)請(qǐng)求內(nèi)容的路徑,通過對(duì)請(qǐng)求信息的分析,這個(gè)路徑我們?cè)谡?qǐng)求的所有請(qǐng)求信息中可以提煉出來,下面的path就是我們提煉出來的路徑
 path = str_msg.split('\r\n')[0].split(' ')[1]
 print('path>>>',path)
 conn.send(b'HTTP/1.1 200 ok \r\n\r\n')
 #由于整個(gè)頁(yè)面需要html、css、js、圖片等一系列的文件,所以我們都需要給人家瀏覽器發(fā)送過去,瀏覽器才能有這些文件,才能很好的渲染你的頁(yè)面
 #根據(jù)不同的路徑來返回響應(yīng)的內(nèi)容
 if path == '/': #返回html文件
  print(from_b_msg)
  with open('test.html','rb') as f:
  # with open('Python開發(fā).html','rb') as f:
   data = f.read()
  conn.send(data)
  conn.close()
 elif path == '/meinv.png': #返回圖片
  with open('meinv.png','rb') as f:
   pic_data = f.read()
  # conn.send(b'HTTP/1.1 200 ok \r\n\r\n')
  conn.send(pic_data)
  conn.close()
 elif path == '/test.css': #返回css文件
  with open('test.css','rb') as f:
   css_data = f.read()
  conn.send(css_data)
  conn.close()

 elif path == '/wechat.ico':#返回頁(yè)面的ico圖標(biāo)
  with open('wechat.ico','rb') as f:
   ico_data = f.read()
  conn.send(ico_data)
  conn.close()

 elif path == '/test.js': #返回js文件
  with open('test.js','rb') as f:
   js_data = f.read()
  conn.send(js_data)
  conn.close()

 #注意:上面每一個(gè)請(qǐng)求處理完之后,都有一個(gè)conn.close()是因?yàn)?,HTTP協(xié)議是短鏈接的,一次請(qǐng)求對(duì)應(yīng)一次響應(yīng),這個(gè)請(qǐng)求就結(jié)束了,所以我們需要寫上close,不然瀏覽器自己斷了,你自己寫的服務(wù)端沒有斷,就會(huì)出問題。

完全搞定了,自己通過socket已經(jīng)完全搞定了web項(xiàng)目,激動(dòng)不,哈哈,我們?cè)賮硗晟埔幌?/p>

三、更高級(jí)版(函數(shù)+多線程版+動(dòng)態(tài)獲取時(shí)間戳)web框架

# -*- coding: utf-8 -*-
# @Time : 2019/7/12 17:11
# @Author : AnWen
import time
import socket
from threading import Thread

server = socket.socket()
server.bind(('127.0.0.1', 9000))
server.listen()


def html(conn):
 time_msg=str(time.time())
 with open('test.html', 'r',encoding='utf-8') as f:
  date = f.read()
 # 在網(wǎng)頁(yè)中定義好特殊符號(hào),用動(dòng)態(tài)的數(shù)據(jù)去替換提前定義好的特殊符號(hào)
 date=date.replace('%這是被替換字符串%',time_msg)
 date=date.encode('utf-8')
 conn.send(date)
 conn.close()


def css(conn):
 with open('test.css', 'rb') as f:
  date = f.read()
 conn.send(date)
 conn.close()


def js(conn):
 with open('test.js', 'rb') as f:
  date = f.read()
 conn.send(date)
 conn.close()


def ico(conn):
 with open('wechat.ico', 'rb') as f:
  date = f.read()
 conn.send(date)
 conn.close()


def jpg(conn):
 with open('window.jpg', 'rb') as f:
  date = f.read()
 conn.send(date)
 conn.close()

#定義一個(gè)路徑和執(zhí)行函數(shù)的對(duì)應(yīng)關(guān)系,不再寫一堆的if判斷了
urlpatterns = [
 ('/', html),
 ('/test.css', css),
 ('/test.js', js),
 ('/wechat.ico', ico),
 ('/window.jpg', jpg)
]

while True:
 conn, addr = server.accept()
 request_str = conn.recv(1024).decode('utf-8')
 path = request_str.split('\r\n')[0].split(' ')[1]
 print(path)
 # 因?yàn)橐裱璈TTP協(xié)議,所以回復(fù)的消息也要加狀態(tài)行
 conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
 #遍歷路徑和函數(shù)的對(duì)應(yīng)關(guān)系列表,并開多線程高效的去執(zhí)行路徑對(duì)應(yīng)的函數(shù),
 for item in urlpatterns:
  if path==item[0]:
   t=Thread(target=item[1],args=(conn,))
   t.start()

四、wsgiref模塊版web框架

wsgiref模塊其實(shí)就是將整個(gè)請(qǐng)求信息給封裝了起來,就不需要你自己處理了,假如它將所有請(qǐng)求信息封裝成了一個(gè)叫做request的對(duì)象,那么你直接request.path就能獲取到用戶這次請(qǐng)求的路徑,request.method就能獲取到本次用戶請(qǐng)求的請(qǐng)求方式(get還是post)等,那這個(gè)模塊用起來,我們?cè)賹憌eb框架是不是就簡(jiǎn)單了好多啊。

對(duì)于真實(shí)開發(fā)中的python web程序來說,一般會(huì)分為兩部分:服務(wù)器程序和應(yīng)用程序。

服務(wù)器程序負(fù)責(zé)對(duì)socket服務(wù)器進(jìn)行封裝,并在請(qǐng)求到來時(shí),對(duì)請(qǐng)求的各種數(shù)據(jù)進(jìn)行整理。

應(yīng)用程序則負(fù)責(zé)具體的邏輯處理。為了方便應(yīng)用程序的開發(fā),就出現(xiàn)了眾多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的開發(fā)方式,但是無論如何,開發(fā)出的應(yīng)用程序都要和服務(wù)器程序配合,才能為用戶提供服務(wù)。

這樣,服務(wù)器程序就需要為不同的框架提供不同的支持。這樣混亂的局面無論對(duì)于服務(wù)器還是框架,都是不好的。對(duì)服務(wù)器來說,需要支持各種不同框架,對(duì)框架來說,只有支持它的服務(wù)器才能被開發(fā)出的應(yīng)用使用。最簡(jiǎn)單的Web應(yīng)用就是先把HTML用文件保存好,用一個(gè)現(xiàn)成的HTTP服務(wù)器軟件,接收用戶請(qǐng)求,從文件中讀取HTML,返回。如果要?jiǎng)討B(tài)生成HTML,就需要把上述步驟自己來實(shí)現(xiàn)。不過,接受HTTP請(qǐng)求、解析HTTP請(qǐng)求、發(fā)送HTTP響應(yīng)都是苦力活,如果我們自己來寫這些底層代碼,還沒開始寫動(dòng)態(tài)HTML呢,就得花個(gè)把月去讀HTTP規(guī)范。

正確的做法是底層代碼由專門的服務(wù)器軟件實(shí)現(xiàn),我們用Python專注于生成HTML文檔。因?yàn)槲覀儾幌M佑|到TCP連接、HTTP原始請(qǐng)求和響應(yīng)格式,所以,需要一個(gè)統(tǒng)一的接口協(xié)議來實(shí)現(xiàn)這樣的服務(wù)器軟件,讓我們專心用Python編寫Web業(yè)務(wù)。

這時(shí)候,標(biāo)準(zhǔn)化就變得尤為重要。我們可以設(shè)立一個(gè)標(biāo)準(zhǔn),只要服務(wù)器程序支持這個(gè)標(biāo)準(zhǔn),框架也支持這個(gè)標(biāo)準(zhǔn),那么他們就可以配合使用。一旦標(biāo)準(zhǔn)確定,雙方各自實(shí)現(xiàn)。這樣,服務(wù)器可以支持更多支持標(biāo)準(zhǔn)的框架,框架也可以使用更多支持標(biāo)準(zhǔn)的服務(wù)器。

WSGI(Web Server Gateway Interface)就是一種規(guī)范,它定義了使用Python編寫的web應(yīng)用程序與web服務(wù)器程序之間的接口格式,實(shí)現(xiàn)web應(yīng)用程序與web服務(wù)器程序間的解耦。

常用的WSGI服務(wù)器有uwsgi、Gunicorn。而Python標(biāo)準(zhǔn)庫(kù)提供的獨(dú)立WSGI服務(wù)器叫wsgiref,Django開發(fā)環(huán)境用的就是這個(gè)模塊來做服務(wù)器。

好,接下來我們就看一下(能理解就行,了解就可以了):先看看wsfiref怎么使用:

from wsgiref.simple_server import make_server
# wsgiref本身就是個(gè)web框架,提供了一些固定的功能(請(qǐng)求和響應(yīng)信息的封裝,不需要我們自己寫原生的socket了也不需要咱們自己來完成請(qǐng)求信息的提取了,提取起來很方便)
#函數(shù)名字隨便起
def application(environ, start_response):
 '''
 :param environ: 是全部加工好的請(qǐng)求信息,加工成了一個(gè)字典,通過字典取值的方式就能拿到很多你想要拿到的信息
 :param start_response: 幫你封裝響應(yīng)信息的(響應(yīng)行和響應(yīng)頭),注意下面的參數(shù)
 :return:
 '''
 start_response('200 OK', [('Content-Type', 'text/html'),('k1','v1')])
 print(environ)
 print(environ['PATH_INFO']) #輸入地址127.0.0.1:8080,這個(gè)打印的是'/',輸入的是127.0.0.1:8080/index,打印結(jié)果是'/index'
 return [b'<h2>Hello, web!</h2>']

#和咱們學(xué)的socketserver那個(gè)模塊很像啊
httpd = make_server('127.0.0.1', 8080, application)

print('Serving HTTP on port 8080...')
# 開始監(jiān)聽HTTP請(qǐng)求:
httpd.serve_forever()

來一個(gè)完整的web項(xiàng)目,我們需要連接數(shù)據(jù)庫(kù)了,所以先到mysql數(shù)據(jù)庫(kù)里面準(zhǔn)備一些表和數(shù)據(jù)

# -*- coding: utf-8 -*-
# @Time : 2019/7/12 18:33
# @Author : AnWen
import pymysql

conn = pymysql.connect(
 host='127.0.0.1',
 port=3306,
 user='root',
 password='123456',
 database='day53',
 charset='utf8',
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
#創(chuàng)建表
sql = "create table userinfo(id int primary key auto_increment,name char(12),age int not null);"
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()
import pymysql
conn = pymysql.connect(
 host='127.0.0.1',
 port=3306,
 user='root',
 password='123456',
 database='day53',
 charset='utf8',
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
#插入數(shù)據(jù)
sql = "insert into userinfo(name,age) values ('anwen',20);"
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()
# -*- coding: utf-8 -*-
# @Time : 2019/7/12 18:55
# @Author : AnWen
import pymysql
def showdata():
 conn = pymysql.connect(
  host='127.0.0.1',
  port=3306,
  user='root',
  password='123456',
  database='day53',
  charset='utf8',
 )
 cursor = conn.cursor(pymysql.cursors.DictCursor)
 #查詢數(shù)據(jù)
 sql = 'select * from userinfo'
 cursor.execute(sql)
 data=cursor.fetchone()
 conn.close()
 conn.cursor()
 return data
# showdata()

wsgiref模塊版web框架

# -*- coding: utf-8 -*-
# @Time : 2019/7/12 12:17
# @Author : AnWen
import time
from wsgiref.simple_server import make_server
from showdata import showdata


def html():
 #獲取數(shù)據(jù)庫(kù)數(shù)據(jù)
 userinfo_data=showdata()
 # {'id': 1, 'name': 'anwen', 'age': 20}
 with open('test.html', 'r', encoding='utf-8') as f:
  date = f.read()
 date = date.replace('%這是被替換字符串%', userinfo_data['name'])
 date = date.encode('utf-8')
 return date


def css():
 with open('test.css', 'rb') as f:
  date = f.read()
 return date


def js():
 with open('test.js', 'rb') as f:
  date = f.read()
 return date


def ico():
 with open('wechat.ico', 'rb') as f:
  date = f.read()
 return date


def jpg():
 with open('window.jpg', 'rb') as f:
  date = f.read()
 return date


urlpatterns = [
 ('/', html),
 ('/test.css', css),
 ('/test.js', js),
 ('/wechat.ico', ico),
 ('/window.jpg', jpg)
]


def application(environ, start_response):
 '''
  :param environ: 是全部加工好的請(qǐng)求信息,加工成了一個(gè)字典,通過字典取值的方式就能拿到很多你想要拿到的信息
  :param start_response: 幫你封裝響應(yīng)信息的(響應(yīng)行和響應(yīng)頭),注意下面的參數(shù)
  :return:
  '''
 # print(environ)
 start_response('200 ok', [('k1', 'v1')])
 path = environ['PATH_INFO']
 for item in urlpatterns:
  if path == item[0]:
   ret = item[1]()
   break
 else:
  ret = '404 not found!'
 return [ret]


httpd = make_server('127.0.0.1', 9000, application)
print('Serving HTTP on port 9000...')
# 開始監(jiān)聽HTTP請(qǐng)求:
httpd.serve_forever()

# wsgiref本身就是個(gè)web框架,提供了一些固定的功能(請(qǐng)求和響應(yīng)信息的封裝,不需要我們自己寫原生的socket了也不需要咱們自己來完成請(qǐng)求信息的提取了,提取起來很方便)

模板渲染JinJa2

上面的代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的動(dòng)態(tài)頁(yè)面(字符串替換),我完全可以從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù),然后去替換我html中的對(duì)應(yīng)內(nèi)容(專業(yè)名詞叫做模板渲染,你先渲染一下,再給瀏覽器進(jìn)行渲染),然后再發(fā)送給瀏覽器完成渲染。

這個(gè)過程就相當(dāng)于HTML模板渲染數(shù)據(jù)。 本質(zhì)上就是HTML內(nèi)容中利用一些特殊的符號(hào)來替換要展示的數(shù)據(jù)。 我這里用的特殊符號(hào)是我定義的,其實(shí)模板渲染有個(gè)現(xiàn)成的工具: jinja2  

下載:

pip install jinja2

使用jinja2渲染index2.html文件

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>第一個(gè)Web框架</title>
 <link rel="stylesheet" href="test.css" rel="external nofollow" rel="external nofollow" >
 <link rel="icon" href="wechat.ico" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
</head>
<body>
<h2>%這是被替換字符串%</h2>
<h2>{{userinfo}}</h2>
<!--<ul>-->
<!-- {% for k,v in userinfo.items() %}-->
<!--  <li>{{k}}&#45;&#45;{{v}}</li>-->
<!-- {% endfor %}-->
<!--</ul>-->
<ul>
 {% for k,v in userinfo.items() %}
  <li>{{v}}</li>
 {% endfor %}
</ul>

<h2>嘻嘻~~</h2>
<img src="window.jpg" alt="" width="100px" height="100px">
<script src="test.js"></script>
</body>
</html>
# -*- coding: utf-8 -*-
# @Time : 2019/7/12 12:17
# @Author : AnWen
import time
from wsgiref.simple_server import make_server
from showdata import showdata
from jinja2 import Template

def html():
 userinfo_data=showdata()
 with open('6jinja2和wsgiref動(dòng)態(tài)框架.html', 'r', encoding='utf-8') as f:
  date = f.read()
 # print(date)
 tem=Template(date) ## 生成模板文件
 print(userinfo_data) #{'id': 1, 'name': 'anwen', 'age': 20}
 date=tem.render({'userinfo':userinfo_data})
 #模板的原理就是字符串替換,我們只要在HTML頁(yè)面中遵循jinja2的語法規(guī)則寫上,其內(nèi)部就會(huì)按照指定的語法進(jìn)行相應(yīng)的替換,從而達(dá)到動(dòng)態(tài)的返回內(nèi)容。

 date = date.encode('utf-8')
 return date
def css():
 with open('test.css', 'rb') as f:
  date = f.read()
 return date
def js():
 with open('test.js', 'rb') as f:
  date = f.read()
 return date
def ico():
 with open('wechat.ico', 'rb') as f:
  date = f.read()
 return date
def jpg():
 with open('window.jpg', 'rb') as f:
  date = f.read()
 return date

urlpatterns = [
 ('/', html),
 ('/test.css', css),
 ('/test.js', js),
 ('/wechat.ico', ico),
 ('/window.jpg', jpg)
]

def application(environ, start_response):
 '''
  :param environ: 是全部加工好的請(qǐng)求信息,加工成了一個(gè)字典,通過字典取值的方式就能拿到很多你想要拿到的信息
  :param start_response: 幫你封裝響應(yīng)信息的(響應(yīng)行和響應(yīng)頭),注意下面的參數(shù)
  :return:
  '''
 # print(environ)
 ## 設(shè)置HTTP響應(yīng)的狀態(tài)碼和頭信息
 start_response('200 ok', [('k1', 'v1')])
 path = environ['PATH_INFO']
 for item in urlpatterns:
  if path == item[0]:
   ret = item[1]()
   break
 else:
  ret = '404 not found!'
 return [ret]

httpd = make_server('127.0.0.1', 9000, application)
print('Serving HTTP on port 9000...')
httpd.serve_forever()

關(guān)于“Django中web框架的本質(zhì)是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI