1. 程式人生 > 其它 >12月8日內容總結——

12月8日內容總結——

目錄

今日內容概要

  • 純手擼web框架
  • 基於wsgiref模組
  • 程式碼封裝優化
  • 動靜態網頁
  • jinja2模板語法
  • python主流web框架
  • django框架簡介
  • django基本操作命令
  • django小白必會三板斧

今日內容概要

一、純手擼web框架

1.web框架的本質
	理解1:連線前端與資料庫的中間介質
	理解2:socket服務端
2.手寫web框架
	1.編寫socket服務端程式碼
 	2.瀏覽器訪問響應無效>>>:HTTP協議
 	3.根據網址字尾的不同獲取不同的頁面內容
	4.想辦法獲取到使用者輸入的字尾>>>:請求資料
 	5.請求首行
    	GET /login HTTP/1.1
 		GET請求
        朝別人索要資料
  		POST請求
        朝別人提交資料
 	6.處理請求資料獲取網址字尾
"""
1.socket程式碼過於重複
2.針對請求資料處理繁瑣
3.字尾匹配邏輯過於LowB
"""
import socket


server = socket.socket()  # TCP UDP
server.bind(('127.0.0.1', 8080))  # IP PORT
server.listen(5)  # 半連線池


while True:
    sock, address = server.accept()  # 等待連線
    data = sock.recv(1024)  # 位元組(bytes)
    # print(data.decode('utf8'))  # 解碼列印
    sock.send(b'HTTP/1.1 200 OK\r\n\r\n')
    data_str = data.decode('utf8')  # 先轉換成字串
    target_url = data_str.split(' ')[1]  # 按照空格切割字串並取索引1對應的資料
    # print(target_url)  # /index /login /reg
    if target_url == '/index':
        # sock.send(b'index page')
        with open(r'myhtml01.html','rb') as f:
            sock.send(f.read())
    elif target_url == '/login':
        sock.send(b'login page')
    else:
        sock.send(b'home page!')

二、基於wsgiref模組

內建模組 很多web框架底層使用的模組
	功能1:封裝了socket程式碼
 	功能2:處理了請求資料
1.固定程式碼啟動服務端
2.檢視處理之後的request大字典
3.根據不同的網址字尾返回不同的內容>>>:研究大字典鍵值對
4.立刻解決上述純手擼的兩個問題
5.針對最後一個問題程式碼如何優化

from wsgiref.simple_server import make_server


def run(request, response):
    """
    :param request: 請求相關資料
    :param response: 響應相關資料
    :return: 返回給客戶端的真實資料
    """
    response('200 OK', [])  # 固定格式 不用管它
    # print(request)  是一個處理之後的大字典
    path_info = request.get('PATH_INFO')
    if path_info == '/index':
        return [b'index']
    elif path_info == '/login':
        return [b'login']
    return [b'hello wsgiref module']


if __name__ == '__main__':
    server = make_server('127.0.0.1', 8080, run)  # 實時監聽127.0.0.1:8080 一旦有請求過來自動給第三個引數加括號並傳引數呼叫
    server.serve_forever()  # 啟動服務端

三、程式碼封裝優化

1.網址字尾的匹配問題
2.每個字尾匹配成功後執行的程式碼有多有少
	麵條版	函式版	模組版
3.將分支的程式碼封裝成一個個函式
4.將網址字尾與函式名做對應關係
5.獲取網址字尾迴圈匹配
6.如果想新增功能只需要先寫函式再新增一個對應關係即可
7.根據不同的功能拆分成不同的py檔案
	views.py		儲存核心業務邏輯(功能函式)
 	urls.py			儲存網址字尾與函式名對應關係
 	templates目錄	   儲存html頁面檔案
8.為了使函式體程式碼中業務邏輯有更多的資料可用
	將request大字典轉手傳給這個函式(可用不用但是不能沒有)

四、動靜態網頁

動態網頁
	頁面資料來源於後端
靜態網頁
	頁面資料直接寫死
    
1.訪問某個網址字尾 後端程式碼獲取當前時間 並將該時間傳到html檔案上再返回給瀏覽器展示給使用者看
	讀取html內容(字串型別) 然後利用字串替換 最後再返回給瀏覽器
    
2.將字典傳遞給頁面內容 並且在頁面上還可以通過類似於後端的操作方式操作該資料
	模板語法>>>:jinja2模組

五、jinja2模組

pip3 install jinja2


from jinja2 import Template


def get_dict_func(request):
    user_dict = {'name': 'jason', 'age': 18, 'person_list': ['阿珍', '阿強', '阿香', '阿紅']}
    with open(r'templates/get_dict_page.html', 'r', encoding='utf8') as f:
        data = f.read()
    temp_obj = Template(data)  # 將頁面資料交給模板處理
    res = temp_obj.render({'d1': user_dict})  # 給頁面傳了一個 變數名是d1值是字典資料的資料
    return res

<p>{{ d1 }}</p>
<p>{{ d1.name }}</p>
<p>{{ d1['age'] }}</p>
<p>{{ d1.get('person_list') }}</p>

六、前端、後端、資料庫三者聯動

1.前端瀏覽器訪問get_user 後端連線資料庫查詢use表中所有的資料 傳遞到某個html頁面 弄弄好樣式 再發送給瀏覽器展示

{% for user_dict in user_data_list %}
    <tr>
        <td>{{ user_dict.id }}</td>
        <td>{{ user_dict.name }}</td>
        <td>{{ user_dict.age }}</td>
    </tr>
{% endfor %}

七、python主流web框架

"""
作為小白的你 初學階段不要混著學 很容易走火入魔
"""
1.django
	大而全 自身自帶的功能元件非常的多 類似於航空母艦 		
2.flask
	小而精 自身自帶的功能元件非常的少 類似於遊騎兵
 	幾乎所有的功能都需要依賴於第三方模組 
3.tornado
	非同步非阻塞 速度極快效率極高甚至可以充當遊戲服務端
ps:sanic、fastapi...

八、django簡介

1.版本問題

​ django1.X:同步 1.11
​ django2.X:同步 2.2
​ django3.X:支援非同步 3.2
​ django4.X:支援非同步 4.2
ps:版本之間的差異其實不大 主要是添加了額外的功能

2.執行django注意事項

​ 1.django專案中所有的檔名目錄名不要出現中文
​ 2.計算機名稱儘量也不要出現中文
3.一個pycharm儘量就是一個完整的專案(不要巢狀 不要疊加)
​ 4.不同版本的python直譯器與不同版本的django可能會出現小問題

九、django基本使用

1.下載

	pip3 install django 				預設最新版
 	pip3 install django==版本號		  指定版本
    pip3 install django==2.2.22
	pip下載模組會自動解決依賴問題(會把關聯需要用到的模組一起下了)

2.驗證

django-admin

3.常見命令

	1.建立django專案
    	django-admin startproject 專案名
 	2.啟動django專案
    	cd 專案名
    	python38 manage.py runserver ip:port

4.pycharm自動建立django專案

	會自動建立templates資料夾 但是配置檔案中可能會報錯
 		os.path.join(BASE_DIR,'templates')

十、django app的概念

django類似於是一所大學 app類似於大學裡面的各個學院

django裡面的app類似於某個具體的功能模組
	user	app 所有使用者相關的都寫在user app下
 	goods	app 所有商品相關的都寫在goods app下
 
命令列建立應用
	python38 manage.py startapp 應用名
pycharm建立應用
	新建django專案可以預設建立一個 並且自動註冊
"""
建立的app一定要去settings.py中註冊,
	INSTALLED_APPS = [
    	'app01.apps.App01Config',
		'app02'
	]
"""

十一、django主要目錄結構

django專案目錄名
	django專案同名目錄
    	settings.py		 配置檔案
    	urls.py			儲存網址字尾與函式名對應關係(不嚴謹)
   		wsgi.py			wsgiref閘道器檔案
	db.sqlite3檔案	   django自帶的小型資料庫(專案啟動之後才會出現)
	manage.py			 入口檔案(命令提供)
 	應用目錄
    	migrations目錄	儲存資料庫相關記錄
    	admin.py		 django內建的admin後臺管理功能
       apps.py			註冊app相關
   		models.py		 與資料庫打交道的(非常重要)
    	tests.py		 測試檔案
    	views.py		 儲存功能函式(不嚴謹)
   	templates目錄			儲存html檔案(命令列不會自動建立 pycharm會)
    	配置檔案中還需要配置路徑
        	[os.path.join(BASE_DIR,'templates'),]
 
"""
	網址字尾			路由
	函式				 檢視函式
	類				  檢視類
重要名詞講解
	urls.py				 路由層	
	views.py			 檢視層
	models.py			 模型層
	templates			 模板層
"""

十二、django小白必會三板斧

from django.shortcuts import render,HttpResponse,redirect

HttpResponse		 返回字串型別的資料

render				返回html頁面並且支援傳值

redirect			重定向

十三、作業

1.整理今日及部落格
2.嘗試使用django完成資料庫資料展示