什麼是web框架?
框架,即framework,特指為解決一個開放性問題而設計的具有一定約束性的支撐結構,使用框架可以幫你快速開發特定的系統,簡單地說,就是你用別人搭建好的舞臺來做表演。
我們可以這樣理解:所有的Web應用本質上就是一個socket服務端,而使用者的瀏覽器就是一個socket客戶端。 這樣我們就可以自己實現Web框架了。
簡易版本自定義web框架
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8000))
sock.listen()
while True:
conn, addr = sock.accept()
data = conn.recv(8096)
# 給回覆的訊息加上響應狀態行
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
conn.send(b"OK")
conn.close()
複製程式碼
最簡單的Web應用就是先把HTML用檔案儲存好,用一個現成的HTTP伺服器軟體,接收使用者請求,從檔案中讀取HTML,返回。
伺服器程式和應用程式
對於真實開發中的python web程式來說,一般會分為兩部分:伺服器程式和應用程式。
伺服器程式負責對socket伺服器進行封裝,並在請求到來時,對請求的各種資料進行整理。
應用程式則負責具體的邏輯處理。為了方便應用程式的開發,就出現了眾多的Web框架,例如:Django、Flask、web.py等。不同的框架有不同的開發方式,但是無論如何,開發出的應用程式都要和伺服器程式配合,才能為使用者提供服務。
這樣,伺服器程式就需要為不同的框架提供不同的支援。這樣混亂的局面無論對於伺服器還是框架,都是不好的。對伺服器來說,需要支援各種不同框架,對框架來說,只有支援它的伺服器才能被開發出的應用使用。
這時候,標準化就變得尤為重要。我們可以設立一個標準,只要伺服器程式支援這個標準,框架也支援這個標準,那麼他們就可以配合使用。一旦標準確定,雙方各自實現。這樣,伺服器可以支援更多支援標準的框架,框架也可以使用更多支援標準的伺服器。
WSGI(Web Server Gateway Interface)就是一種規範,它定義了使用Python編寫的web應用程式與web伺服器程式之間的介面格式,實現web應用程式與web伺服器程式間的解耦。
常用的WSGI伺服器有uwsgi、Gunicorn。而Python標準庫提供的獨立WSGI伺服器叫wsgiref,Django開發環境用的就是這個模組來做伺服器。
伺服器程式,正常開發環境下用wsgiref,而在正式假設服務上線用uWSGI。
wsgiref
利用wsgiref模組來替換我們自己寫的web框架的socket server部分
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
print(env) # 是個字典型別
# 固定寫法
response('200 OK',[]) # 列表裡面放的是請求首行的資訊,可以不放,但是必須寫
# 獲取當前使用者訪問路徑
current_path = env.get('PATH_INFO')
# 定義一個函式標誌位
func = None
for url_list in urls: # urls:[[],[],[]] url_list:['',func]
if current_path == url_list[0]:
func = url_list[1]
# 結束for迴圈了
break
if func:
res = func(env)
else:
# 匹配不上 走error
res = error(env)
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1',8888,run)
server.serve_forever()
複製程式碼
jinja2
為了能實現從資料庫中查詢資料,然後替換html中的對應內容再傳送給瀏覽器完成渲染, 這個過程就相當於HTML模板渲染資料,本質上就是HTML內容中利用一些特殊的符號來替換要展示的資料。 因此可以使用jinja2(模版渲染工具)
模板的原理就是字串替換,我們只要在HTML頁面中遵循jinja2的語法規則寫上,其內部就會按照指定的語法進行相應的替換,從而達到動態的返回內容。
Django
應用APP
app即一個個分支,專案好比是一個學校,應用app就好比一個個學院,所以一個專案下可以有多個app應用
目錄介紹:
應用名下的
migrations 資料庫遷移記錄相關
models.py 資料庫模型表(ORM)
views.py 檢視函式(執行相關功能的)
專案名下
__init__.py
settings.py 專案配置檔案
urls.py 路由與檢視函式的對應關係
wsgi.py wsgiref相關
manage.py 專案入口檔案
templates 存放html檔案
複製程式碼
建立方式
命令列建立django專案
django-admin startproject mysite
命令列建立app
python manage.py startapp 應用名
命令列啟動django
python manage.py runserver
注意:用命令列建立的時候,預設沒有templates資料夾,需要你自己手動建立並且在settings配置檔案中寫上路徑
在Django中約定俗成的幾個方面
- html資料夾約定俗成的放在templates資料夾下
#在setting檔案中需要有以下配置,若沒有則需要進行配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
複製程式碼
- 靜態檔案都在放在static資料夾下,一般情況下static資料夾下建議分成css,js及其他相關資料夾實現分層
#在setting檔案中需要進行配置
#django靜態檔案配置
STATIC_URL = '/static/'
# 靜態檔案路徑配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]
複製程式碼
Django基礎必備三件套
from django.shortcuts import HttpResponse, render, redirect
HttpResponse
內部傳入一個字串引數,返回給瀏覽器。
render
除request引數外還接受一個待渲染的模板檔案和一個儲存具體資料的字典引數。
將資料填充進模板檔案,最後把結果返回給瀏覽器。(類似於上面用到的jinja2)
redirect
重定向:接受一個URL引數,表示跳轉到指定的URL。
redirect與render的區別在於:redirect走的是路徑,而render返回的是模板
啟動Django報錯
- Django 啟動時報錯 UnicodeEncodeError ...
報這個錯誤通常是因為計算機名為中文,改成英文的計算機名重啟下電腦就可以了。
- Django 啟動時報錯 SyntaxError: Generator expression must be parenthesized...
報這個錯誤通常是由於直譯器與Django之間的相容問題,建議使用3.6版本的直譯器,就不會有該問題了。