【目錄】
一、引子
二、 Django框架
一、引子
1、后端舉足輕重的地位
前端 —————— 后端 ———————— 資料庫
2、接下來,一起靠近Django框架
純手擼web框架
# HTTP協議 """ 網路協議 HTTP協議 資料傳輸是明文 HTTPS協議 資料傳輸是密文 websocket協議 資料傳輸是密文 四大特性 1.基于請求回應 2.基于TCP、IP作用于應用層之上的協議 3.無狀態 4.短/無鏈接 資料格式 請求首行 請求頭 請求體 回應狀態碼 1XX 2XX 200 3XX 4XX 403 404 5XX 500 """ # 如何做到后綴的不同回傳不同的內容 # 拿到用戶輸入的后綴 做判斷 # 不足之處 1.代碼重復(服務端代碼所有人都要重復寫) 2.手動處理http格式的資料 并且只能拿到url后綴 其他資料獲取繁瑣(資料格式一樣處理的代碼其實也大致一樣 重復寫) 3.并發的問題
# 你可以將web框架理解成服務端 import socket server = socket.socket() # TCP 三次握手四次揮手 osi七層 server.bind(('127.0.0.1',8080)) # IP協議 以太網協議 arp協議... server.listen(5) # 池 ... """ b'GET / HTTP/1.1\r\n Host: 127.0.0.1:8082\r\n Connection: keep-alive\r\n Upgrade-Insecure-Requests: 1\r\n User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n Sec-Fetch-Site: none\r\n Sec-Fetch-Mode: navigate\r\n Sec-Fetch-User: ?1\r\n Sec-Fetch-Dest: document\r\n Accept-Encoding: gzip, deflate, br\r\n Accept-Language: zh-CN,zh;q=0.9\r\n Cookie: csrftoken=KYJnVBLPpJxwt09TOmTXzpb5qkFJwHVxVGpi0NxEGIg4z5VUuazZ1O2RMwSisu14\r\n \r\n' """ while True: conn, addr = server.accept() data = conn.recv(1024) # print(data) # 二進制資料 data = https://www.cnblogs.com/bigorangecc/p/data.decode('utf-8') # 字串 # 獲取字串中特定的內容 正則 如果字串有規律也可以考慮用切割 conn.send(b'HTTP/1.1 200 OK\r\n\r\n') current_path = data.split(' ')[1] # print(current_path) if current_path == '/index': # conn.send(b'index heiheihei') with open(r'templates/01 myhtml.html', 'rb') as f: conn.send(f.read()) elif current_path == '/login': conn.send(b'login') else: # 你直接忽略favicon.ico conn.send(b'hello web') conn.close()View Code
借助于wsgiref模塊
先匯入模塊(事先需要安裝該模塊)
from wsgiref.simple_server import make_server
from wsgiref.simple_server import make_server def run(env, response): """ :param env:請求相關的所有資料 :param response:回應相關的所有資料 :return: 回傳給瀏覽器的資料 """ # print(env) # 大字典 wsgiref模塊幫你處理好http格式的資料 封裝成了字典讓你更加方便的操作 # 從env中取 response('200 OK', []) # 回應首行 回應頭 current_path = env.get('PATH_INFO') if current_path == '/index': return [b'index'] elif current_path == '/login': return [b'login'] return [b'404 error'] if __name__ == '__main__': server = make_server('127.0.0.1',8080,run) """ 會實時監聽127.0.0.1:8080地址 只要有客戶端來了 都會交給run函式處理(加括號觸發run函式的運行) flask啟動原始碼 make_server('127.0.0.1',8080,obj) __call__ """ server.serve_forever() # 啟動服務端View Code
代碼封裝以及主要檔案介紹
基于wsgiref模塊的代碼,進行代碼封裝;
""" urls.py 路由(url的后綴)與視圖函式對應關系 views.py 視圖函式(后端業務邏輯) templates檔案夾 專門用來存盤html檔案 """ # 按照功能的不同拆分之后 后續添加功能只需要在urls.py書寫對應關系,然后取views.py書寫業務邏輯即可
from wsgiref.simple_server import make_server from urls import urls from views import * def run(env, response): """ :param env:請求相關的所有資料 :param response:回應相關的所有資料 :return: 回傳給瀏覽器的資料 """ # print(env) # 大字典 wsgiref模塊幫你處理好http格式的資料 封裝成了字典讓你更加方便的操作 # 從env中取 response('200 OK', []) # 回應首行 回應頭 current_path = env.get('PATH_INFO') # if current_path == '/index': # return [b'index'] # elif current_path == '/login': # return [b'login'] # return [b'404 error'] # 定義一個變數 存盤匹配到的函式名 func = None for url in urls: # url (),() if current_path == url[0]: # 將url對應的函式名賦值給func func = url[1] break # 匹配到一個之后 應該立刻結束for回圈 # 判斷func是否有值 if func: res = func(env) else: res = error(env) return [res.encode('utf-8')] if __name__ == '__main__': server = make_server('127.0.0.1',8080,run) """ 會實時監聽127.0.0.1:8080地址 只要有客戶端來了 都會交給run函式處理(加括號觸發run函式的運行) flask啟動原始碼 make_server('127.0.0.1',8080,obj) __call__ """ server.serve_forever() # 啟動服務端封裝版-基于wsgiref模塊的web框架
from views import * # url與函式的對應關系 urls = [ ('/index',index), ('/login',login), ('/xxx',xxx), ('/get_time',get_time), ('/get_dict',get_dict), ('/get_user',get_user) ]urls.py
def index(env): return 'index' def login(env): return "login" def error(env): return '404 error' # 將 HTML檔案放在新建的templates檔案夾,訪問回傳HTML檔案 def xxx(env): with open(r'templates/02 myxxx.html','r',encoding='utf-8') as f: return f.read()views.py-基礎版
動靜態網頁
""" 靜態網頁 頁面上的資料是直接寫死的 萬年不變 動態網頁 資料是實時獲取的 eg: 1.后端獲取當前時間展示到html頁面上 2.資料是從資料庫中獲取的展示到html頁面上 """ # 動態網頁制作
后端獲取當前時間展示到html頁面上
import datetime def get_time(env): current_time = datetime.datetime.now().strftime('%Y-%m-%d %X') # 如何將后端獲取到的資料"傳遞"給html檔案? with open(r'templates/03 mytime.html','r',encoding='utf-8') as f: data = f.read() # data就是一堆字串 data = https://www.cnblogs.com/bigorangecc/p/data.replace('dwadasdsadsadasdas',current_time) # 在后端將html頁面處理好之后再回傳給前端 return data
Jinja2模塊的應用
cmd指令安裝模塊
pip3 install jinja2
(1)(views.py —— 代碼)
from jinja2 import Template
tmp = Template(data)
res = tmp.render(user=user_dic)
# 1- 將一個字典傳遞給html檔案 并且可以在檔案上方便快捷的操作 字典資料
(views.py —— 代碼)
from jinja2 import Template def get_dict(env): user_dic = {'username':'jason','age':18,'hobby':'read'} with open(r'templates/04 get_dict.html','r',encoding='utf-8') as f: data = f.read() tmp = Template(data) res = tmp.render(user=user_dic) # 給get_dict.html傳遞了一個值 頁面上通過變數名user就能夠拿到user_dict return res
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href=https://www.cnblogs.com/bigorangecc/p/"https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src=https://www.cnblogs.com/bigorangecc/p/"https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script src=https://www.cnblogs.com/bigorangecc/p/"https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <h1>我是一個頁面</h1> {{ user }} {{ user.get('username')}} {{ user.age }} {{ user['hobby'] }} </body> </html>04 get_dict.html
# 2- 后端獲取資料庫中資料展示到前端頁面 (需要先 建好一個資料庫)
(views.py —— 代碼)
import pymysql def get_user(env): # 去資料庫中獲取資料 傳遞給html頁面 借助于模版語法 發送給瀏覽器 conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = 'admin123', db='day59', # utf8 千萬不要加 - charset = 'utf8', autocommit = True ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = 'select * from userinfo' affect_rows = cursor.execute(sql) data_list = cursor.fetchall() # [{},{},{}] # 將獲取到的資料傳遞給html檔案 with open(r'templates/05 get_data.html','r',encoding='utf-8') as f: data = f.read() tmp = Template(data) res = tmp.render(user_list=data_list) # 給get_dict.html傳遞了一個值 頁面上通過變數名user就能夠拿到user_dict return res if __name__ == '__main__': get_user(111)
(05 get_data.html)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href=https://www.cnblogs.com/bigorangecc/p/"https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src=https://www.cnblogs.com/bigorangecc/p/"https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script src=https://www.cnblogs.com/bigorangecc/p/"https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h1 class="text-center">用戶資料</h1> <table class="table table-hover table-striped"> <thead> <tr> <th>ID</th> <th>username</th> <th>password</th> <th>hobby</th> </tr> </thead> <tbody> <!-- [{},{},{},{},{}]--> {% for user_dict in user_list %} <tr> <td>{{ user_dict.id}}</td> <td>{{ user_dict.username}}</td> <td>{{ user_dict.password}}</td> <td>{{ user_dict.hobby}}</td> </tr> {% endfor%} </tbody> </table> </div> </div> </div> </body> </html>05 get_data.html
Jinja2模塊的 【模版語法】
(2)views.py 鏈接的HTML檔案里的代碼
"""模版語法是在后端起作用的""" # 模版語法(非常貼近python語法)——用于 后端給前端傳資料,前端頁面HTML操作這些資料,最后將處理的資料傳給前端頁面顯示出來 --
1---(04 get_dict.html)
{{ user }} # 獲取全部資訊 {{ user.get('username')}} # 獲取指定的資訊(下面三種取值方法,回傳結果一樣) {{ user.age }} {{ user['hobby'] }}
2--- # 模板語法也支持 for 回圈 (見 jinja2 應用2的 get_data.html )
{% for …%}
{% endfor %}
{% for user_dict in user_list %} <tr> <td>{{ user_dict.id}}</td> <td>{{ user_dict.username}}</td> <td>{{ user_dict.password}}</td> <td>{{ user_dict.hobby}}</td> </tr> {% endfor%}
自定義簡易版本web框架請求流程圖
""" wsgiref模塊 1.請求來的時候決議http格式的資料 封裝成大字典 2.回應走的時候給資料打包成符合http格式 再回傳給瀏覽器 """
靈魂畫師-作品

二、 Django框架基礎
python三大主流web框架
"""
django
特點:大而全 自帶的功能特別特別特別的多 類似于航空母艦
不足之處:
有時候過于笨重
flask
特點:小而精 自帶的功能特別特別特別的少 類似于游騎兵
第三方的模塊特別特別特別的多,如果將flask第三方的模塊加起來完全可以蓋過django
并且也越來越像django
不足之處:
比較依賴于第三方的開發者
tornado
特點:異步非阻塞 支持高并發
牛逼到甚至可以開發游戲服務器
不足之處:
暫時你不會
"""
A:socket部分
B:路由與視圖函式對應關系(路由匹配)
C:模版語法
django
A用的是別人的 wsgiref模塊
B用的是自己的
C用的是自己的(沒有jinja2好用 但是也很方便)
flask
A用的是別人的 werkzeug(內部還是wsgiref模塊)
B自己寫的
C用的別人的(jinja2)
tornado
A,B,C都是自己寫的
注意事項
# 如何讓你的計算機能夠正常的啟動django專案 1.計算機的名稱不能有中文 2.一個pycharm視窗只開一個專案 3.專案里面所有的檔案也盡量不要出現中文 4.python解釋器盡量使用3.4~3.6之間的版本 (如果你的專案報錯 你點擊最后一個報錯資訊 去原始碼中把逗號刪掉) # django版本問題 1.X 2.X 3.X(直接忽略) 1.X和2.X本身差距也不大 我們講解主要以1.X為例 會講解2.X區別 公司之前用的1.8 滿滿過渡到了1.11版本 有一些專案用的2.0 # django安裝 pip3 install django==1.11.11 如果已經安裝了其他版本 無需自己卸載 直接重新裝 會自動卸載安裝新的 如果報錯 看看是不是timeout 如果是 那么只是網速波動 重新安裝即可 驗證是否安裝成功的方式1 終端輸入django-admin看看有沒有反應
django基本操作
# 命令列操作——直接在計算機cmd終端輸入命令
# 1.創建django專案 """ 你可以先切換到對應的D盤 然后再創建 """ django-admin startproject 專案名 例如:創建名為 mysite 的專案 mysite檔案夾 manage.py mysite檔案夾 __init__.py settings.py urls.py wsgi.py # 2.啟動django專案 """ 一定要先切換到專案目錄下 cd /mysite """ python36 manage.py runserver
# http://127.0.0.1:8000/
如果在Windows系統的cmd 輸入 python36 manage.py runserver 沒有反應(是計算機環境變數的問題——首先添加了環境變數 D:\Python36\Scripts
以及 D:\Python36,還要去對應的目錄里 D:\Python36 復制檔案 python.exe,重命名為 python36.exe,操作完這兩步,即可),
也可不寫 python 的版本號,直接寫 python manage.py runserver
# 3.創建應用 """ Next, start your first app by running python manage.py startapp [app_label]. """ python manage.py startapp app01
應用名應該做到見名知意 user order web ... 但是我們教學統一就用app01/02/03/04 有很多檔案 # pycharm操作 # 1 創建專案【檔案】-- new project 選擇左側第二個django即可 # 2 啟動專案 方法1.還是用命令列啟動——終端(terminal)直接輸入完整命令,python36 manage.py runserver
或者 【pycharm】—— 【tools】——【run manage.py task】打開一個指令操作界面
輸入指令: startproject 專案名稱
方法2.點擊綠色三角小箭頭即可 # 3 創建應用 方法1.pycharm提供的終端(terminal)直接輸入完整命令( python36 manage.py startapp app01)
方法2.【pycharm】—— 【tools】——【run manage.py task】打開一個指令操作界面
輸入指令: startapp app名稱
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
終端(terminal)——輸入完整指令
【run manage.py task】打開一個指令操作界面 ——可省略 python36 manage.py

# 4 修改埠號以及創建server
修改埠號:
點擊 【運行綠色小箭頭】旁邊的選擇框——【編輯配置】
如下圖,可修改【埠號】,點擊【確定】-【運行】,再次運行django專案,即可發現埠號已經換了

PS:若綠色小按鈕滅了(即 沒有辦法使用 小按鈕啟動專案),仍可以按照以上兩步操作方法,
點擊 【運行綠色小箭頭】旁邊的選擇框——【編輯配置】
點擊“+”,手動添加專案服務,可自定義專案服務的名稱

應用(【創建應用】見上一部分)
""" django是一款專門用來開發app的web框架 django框架就類似于是一所大學(空殼子) app就類似于大學里面各個學院(具體功能的app) 比如開發淘寶 訂單相關 用戶相關 投訴相關 創建不同的app對應不同的功能 選課系統 學生功能 老師功能 一個app就是一個獨立的功能模塊 """ ***********************創建的應用一定要去組態檔中的 INSTALLED_APPS 注冊********************** INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', # 全寫 'app01', # 簡寫 ]
# 創建出來的的應用第一步先去組態檔中注冊 其他的先不要給我干 ps:你在用pycharm創建專案的時候 pycharm可以幫你創建一個app,并且自動注冊(只會幫忙創建一個,后面的應用 還是需要自己手動創建并注冊)
***********************************************************************
主要檔案介紹——
-mysite專案檔案夾 --mysite檔案夾 (與專案名同名的檔案夾) ---settings.py 組態檔 ---urls.py 路由與視圖函式對應關系(路由層) ---wsgi.py wsgiref模塊(不考慮) --manage.py django的入口檔案 --db.sqlite3 django自帶的sqlite3資料庫(小型資料庫 功能不是很多還有bug) --app01檔案夾 ---admin.py django后臺管理 ---apps.py 注冊使用 ---migrations檔案夾 資料庫遷移記錄 ---models.py 資料庫相關的 模型類(orm) ---tests.py 測驗檔案 ---views.py 視圖函式(視圖層)
-- templates檔案夾 自帶檔案夾,用于存放html檔案
例如 創建了 名為 mysite 的 Django專案

命令列與pycharm創建的區別
# 1、 命令列創建不會自動有templates檔案夾 需要你自己手動創建,以及手動配置路徑 'DIRS': [os.path.join(BASE_DIR, 'templates')]
而 pycharm會自動幫你創建并且還會自動在組態檔(settings.py)中配置對應的路徑
# pycharm創建 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] ] # 命令列創建 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], ] """ 也就意味著你在用 cmd命令創建django專案的時候不單單需要創建templates檔案夾還需要去組態檔中配置路徑 'DIRS': [os.path.join(BASE_DIR, 'templates')] """
2、創建應用的區別
在用pycharm創建專案的時候 pycharm可以幫你創建一個app,并且自動注冊(只會幫忙創建一個,后面的應用 還是需要自己手動創建并注冊)
settings檔案簡介




django小白必會三板斧
from django.shortcuts import HttpResponse,render,redirect"""
HttpResponse
回傳字串型別的資料(內部傳入一個字串引數,回傳給瀏覽器,)return HttpResponse('字串')
render
除request引數外還接受一個待渲染的模板檔案和一個保存具體資料的字典引數,
將資料填充進模板檔案,最后把結果回傳給瀏覽器,(類似于 jinja2 )
return render(request, "目標頁面的html檔案名", 存有資料的字典引數)
def index(request): # 業務邏輯代碼 return render(request, "index.html", {"name": "mili", "hobby": ["讀書", "運動"]})redirect
重定向——接受一個URL引數,表示跳轉到指定的URL,return redirect(url)
return redirect('https://www.mzitu.com/') # 跳轉到別人的網址(需要寫完整的網址)
return redirect('/home/') # 跳轉到自己的網址 (只需要寫后綴)(網址后面的 / 不加的話,瀏覽器會自動加上)
參考閱讀:
https://www.cnblogs.com/Dominic-Ji/articles/10982272.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/143480.html
標籤:Python





