1. 程式人生 > 其它 >django框架之基礎學習

django框架之基礎學習

目錄
web框架本質上可以看成是一個功能強大的socket服務端,使用者的瀏覽器可以看成是擁有視覺化介面的socket客戶端。兩者通過網路請求實現資料互動,學者們也可以從架構層面上先簡單的將Web框架看做是對前端、資料庫的全方位整合

純手擼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.字尾匹配邏輯過於low
"""
程式碼展示:
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
3.jinja2模板功能闡述:
    支援將資料傳遞到html頁面並提供近似於後端的處理方式簡單快捷的操作資料

jinja模板

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
	非同步非阻塞,速度極快,效率極高甚至可以充當遊戲服務端
   	非同步:任務在提交以後不原地等待,繼續執行其他任務,如果有結果返回接收就行
    非阻塞:就緒態,執行態
其他的框架:sanic、factapi

Django簡介

1.版本問題
	Django1.X:同步				1.11
  	Django2.X:同步				 2.2
   Django3.X:非同步					3.2
   Django4.X:非同步					4.2
注意:版本之間的差異其實不大,主要是添加了額外的功能
    
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(ip和埠可以不寫)
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.sqlites3檔案	 django自帶的小型資料庫(專案啟動之後才會出現)
   manage.py		 入口檔案(命令提供)
	應用目錄
    	migrations目錄		儲存資料庫相關記錄
       admin.py				django內建的admin後臺管理功能
   		apps.py				 註冊app相關
       models.py			與資料庫打交道的(非常重要)
    	tests.py			 測試檔案
       views.py				儲存功能函式(不嚴謹)
    templates目錄				儲存html檔案(命令列不會自動建立,pycharm會,但是需要在配置檔案中配置路徑)
"""
重要名詞講解:
	網址字尾		路由
	函式			 檢視函式
	類			  檢視類
	
	urls.py			路由層
	views.py		檢視層
	models.py		模型層
	templates		模板層
"""

django小白必會的三板斧

from django.shortcuts import render, HttpResponse, redirect

HttpResponse			返回字串型別的資料

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

redirrct				重定向