今日內容大綱:html
1.起飛版web框架python
2.自定製框架的流程web
3.jinja2模板渲染初識sql
4.MVC&&MTVshell
5.django版本介紹及django安裝數據庫
6.django初識(一些操做)django
今日詳細內容:flask
1.起飛版web框架小程序
2.自定製框架的流程瀏覽器
1.瀏覽器發送請求(http://127.0.0.1:8080/index) 2.=(請求)=>wsgiref的參數environ ==>environ拿到請求路徑(根據不一樣的路徑返回不一樣的頁面),返回頁面經過函數裏的文件讀取頁面內容,把文件進行返回 ==>主邏輯裏面寫了經過路徑找到對應函數的邏輯,urls.py裏面寫的那個列表,列表的元素是一個個元組,每一個元組的第一個元素就是路徑,第二個元素就是對應的函數名字,主邏輯代碼連經過路徑找到對應的函數去執行 3.==>views.py函數,讀取頁面html文件,返回給瀏覽器,返回給瀏覽器這個操做是主邏輯作的 ==>主邏輯經過wsgiref中的start_response,把響應頭的信息發送一下,return也就返回頁面數據 ==>主邏輯經過for..else等操做,進行返回不一樣頁面的數據,最後傳輸給了瀏覽器 4.==>瀏覽器拿到了login頁面,輸入用戶名和密碼, 5.==>一樣須要發送請求給服務端,也就是提交本身輸入的密碼和用戶名(提交請求) 6.==>服務器端wsgiref把不少信息封裝在environ對象中,environ中有用戶名和密碼 也就是經過environ這個變量找到用戶的數據, 7.==>主邏輯鏈接數據庫,查找是都存在對應的用戶信息數據(有則登陸成功,沒有,則登陸失敗) (在第7步以前作出來就好了,功能就是建立表,插入數據) ##數據庫部分 ==>models.py,經過sql建立了用戶表&&用戶信息 ==>數據庫裏邊有數據了
3.jinja2模板渲染初識
介紹:
django裏面並無用jinja2,爲何要講它呢,由於django的模板語言,也就是作字符串替換的功能和jinja2的語法很像,全部學完django以後,再學flask就很容易了。
上面的代碼實現了一個簡單的動態,我徹底能夠從數據庫中查詢數據,而後去替換我html中的對應內容,而後再發送給瀏覽器完成渲染。 這個過程就至關於HTML模板渲染數據。 本質上就是HTML內容中利用一些特殊的符號來替換要展現的數據。 我這裏用的特殊符號是我定義的,其實模板渲染有個現成的工具: jinja2
下載jinja2 (:flask框架通常使用這個模板語言。)
jinja2的下載安裝方式:
pip install jinja2
動態頁面的效果:
# Author: studybrother sun from threading import Thread import socket server=socket.socket() server.bind(('127.0.0.1',8080)) server.listen() #返回不一樣頁面寫的按個首頁homepage函數 # def homepage(conn): # with open('homepage.html','rb') as f: # data=f.read() # #注意,這裏讀取的是服務端的數據 # conn.send(data) # #這裏指的是,發現客戶端 import datetime def homepage(conn): with open('homepage.html','r',encoding='utf-8') as f: data=f.read() # 注意,這裏讀取的是服務端的數據 t1=datetime.datetime.now() new_data=data.replace('@xx@',str(t1)) #注意這裏的date,必須有數據接收才行 conn.send(new_data.encode('utf-8')) #這裏指的是,發現客戶端 #動態效果,也是在這裏操做服務端的頁面,進行字符串的替換實現的,在這個地方 # def index(conn): # with open('index.html','rb') as f: # data=f.read() # #注意,這裏讀取的是服務端的數據 # conn.send(data) # # def home(conn): # with open('home.html','rb') as f: # data=f.read() # #注意,這裏讀取的是服務端的數據 # conn.send(data) #下面是運用反射的寫法 urlpatterns=[ ('/',homepage), # ('/index',index), # ('/home',home), # 同理,只須要在這裏修改就能夠了,拿到頁面 ] # 咱們須要作的事情是:寫函數,配置對應關係 while 1: conn,addr=server.accept() # 拿到conn就開始併發,開進程,線程池和進程池!!!!!! from_b_msg=conn.recv(1024).decode('utf-8') # print(from_b_msg) path=from_b_msg.split('\r\n')[0].split(" ")[1] # print(path) # conn.send(b'HTTP/1.1 200 ok\r\n\r\n') conn.send(b'HTTP/1.1 200 ok\r\nk1:v1\r\n\r\n') # 在這裏能夠加上響應的頭部信息 # conn.send(b'<h1>hello</h1>') for url_func in urlpatterns: if url_func[0]==path: #多線程函數版 t=Thread(target=url_func[1],args=(conn,)) t.start() # 簡單函數版 # url_func[1](conn)
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="content-Type" charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width" ,initial-scale="1"> <!--上邊這個表示手機版的調整尺寸--> <!--上述2個meta標籤"必須"放在最前面,任何其餘內容都必須跟隨其後--> <title>Title</title> </head> <body> <h1 style="color: red">歡迎來到首頁</h1> <a href="http://127.0.0.1:8080/index">主頁連接到index頁面</a> <a href="http://127.0.0.1:8080/home">主頁連接到home頁面</a> <!--服務端不用斷,在瀏覽器端訪問直接就能夠拿到了html--> <h1 style="color: deeppink;">@xx@</h1> </body> </html>
jinja2練習:(注意原生socket和wsgiref的區別)
# Author: studybrother sun from threading import Thread import socket from jinja2 import Template # 導入jinja2模板庫 import datetime server=socket.socket() server.bind(('127.0.0.1',8080)) server.listen() #返回不一樣頁面寫的按個首頁homepage函數 # def homepage(conn): # with open('homepage.html','rb') as f: # data=f.read() # #注意,這裏讀取的是服務端的數據 # conn.send(data) # #這裏指的是,發現客戶端 def homepage(conn): with open('jinja2page.html','r',encoding='utf-8')as f: data=f.read() t=Template(data) #模板渲染語言 new_data=t.render({"name": "Alex", "hobby_list": ["燙頭", "泡吧"]}) #這個地方須要經過send發送的,由於沒有用wsgiref模塊,用的是原生的socket #socket用 send conn.send(new_data.encode('utf-8')) #wsgiref用return # return [bytes(new_data, encoding="utf8"), ] # return [new_data.encode('utf-8'),] # with open('homepage.html','r',encoding='utf-8') as f: # data=f.read() # # 注意,這裏讀取的是服務端的數據 # t1=datetime.datetime.now() # new_data=data.replace('@xx@',str(t1)) # #注意這裏的date,必須有數據接收才行 # conn.send(new_data.encode('utf-8')) #這裏指的是,發現客戶端 #動態效果,也是在這裏操做服務端的頁面,進行字符串的替換實現的,在這個地方 # def index(conn): # with open('index.html','rb') as f: # data=f.read() # #注意,這裏讀取的是服務端的數據 # conn.send(data) # # def home(conn): # with open('home.html','rb') as f: # data=f.read() # #注意,這裏讀取的是服務端的數據 # conn.send(data) #下面是運用反射的寫法 urlpatterns=[ ('/',homepage), # ('/index',index), # ('/home',home), # 同理,只須要在這裏修改就能夠了,拿到頁面 ] # 咱們須要作的事情是:寫函數,配置對應關係 while 1: conn,addr=server.accept() # 拿到conn就開始併發,開進程,線程池和進程池!!!!!! from_b_msg=conn.recv(1024).decode('utf-8') # print(from_b_msg) path=from_b_msg.split('\r\n')[0].split(" ")[1] # print(path) # conn.send(b'HTTP/1.1 200 ok\r\n\r\n') conn.send(b'HTTP/1.1 200 ok\r\nk1:v1\r\n\r\n') # 在這裏能夠加上響應的頭部信息 # conn.send(b'<h1>hello</h1>') for url_func in urlpatterns: if url_func[0]==path: #多線程函數版 t=Thread(target=url_func[1],args=(conn,)) t.start() # 簡單函數版 # url_func[1](conn)
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="content-Type" charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width" ,initial-scale="1"> <!--上邊這個表示手機版的調整尺寸--> <!--上述2個meta標籤"必須"放在最前面,任何其餘內容都必須跟隨其後--> <title>Title</title> </head> <body> <h1>姓名:{{ name }}</h1> <ul> {% for hobby in hobby_list%} <li>{{ hobby }}</li> {% endfor %} </ul> </body> </html>
練習:jinja2的變量&&for循環
4.MVC&&MTV
MVC&&MTV框架 MVC M:model.py 就是和數據庫打交道用的,建立表等操做 V:view 視圖(視圖函數,html文件) C:controller控制器(其實就是找百度雲diamante裏面那個urls文件裏面的內容), url(路徑)分發與視圖函數的邏輯處理 MTV:django中的處理框架 M:model.py 就是和數據庫打交道用的,建立表等操做(同上) T: templates存放html文件的 V:view 視圖函數(進行邏輯處理) 總結:對比上邊,咱們會發現MTV少一個url分發的部分 因此學習django,咱們還要學一個叫作url控制器(路徑分發)的東西,MTV+url控制器就是咱們django要學的內容 也就是:MTVU框架
5.django版本介紹及django安裝
(1)django版本支持的官網圖解&&菜鳥圖解
圖解1:
圖解2:
菜鳥教程django版本圖解3:
(2)django安裝
A:下載django:
pip install django==1.11.11
B:建立一個django project命令
django-admin startproject mysite 建立一個名字爲"mysite"的django項目
安裝安成以後是這個目錄,將這個目錄配置環境變量,經過django-admin就能建立django項目,而且django項目應用的就是你python36的python解釋器
django-admin命令獲取的一些操做命令(圖解):
(3)測試咱們的第一個django項目(切換目錄&&建立mysite2):
建立以後的目錄結構:
當前目錄會生成mysite的工程,目錄結構以下(下面的mysite改爲mysite2,)
注意:pip下載下來的django能夠理解成一個模塊,而不是django項目,這個模塊能夠幫助咱們建立django項目.
manage.py:django項目裏面的工具,經過他能夠調用django shell和數據庫,啓動關閉項目與項目交互等,無論你將框架分了幾個文件,必然有一個啓動文件,其實他們自己就是一個文件.
__init__.py:表示mysite是一個包,別人能夠引入你.
settings.py:包含了項目的默認設置,包括數據庫信息,調試標誌以及其餘一些工做變量.
urls.py:負責把URL模式映射到應用程序
wsgi.py:runserver命令就使用wsgiref模塊作簡單的web server,後面會看到runserver,全部與socket相關的內容都在這個文件裏面.
切換到建立好的項目,運行以下:
運行結果:
(注意在瀏覽器中輸入:127.0.0.1:8080),顯示以下結果
此時已經開始啓動django項目了,只不過什麼邏輯都沒有
(4)應用&&項目
你會發現,上面沒有什麼view視圖函數的文件,這裏咱們說一個應用與項目的關係,上面咱們只是建立了一個項目,並無建立應用.以微信來舉例,微信是否是一個大的項目,可是微信裏面是否是有不少個應用,支付應用、聊天應用、朋友圈、小程序等這些在必定程度上都是相互獨立的應用,也就是說一個大的項目裏面能夠有多個應用,也就是說項目是包含應用的,它沒有將view放到這個項目目錄裏面是由於它以爲,一個項目裏面能夠有多個應用,而每一個應用都有本身這個應用的邏輯內容,因此他以爲這個view應該放到應用裏面,好比說咱們的微信,剛纔說了幾個應用,這幾個應用的邏輯能放到一塊兒嗎,放到一塊兒是否是就亂套啦,也很差管理和維護,因此這些應用的邏輯都分開來放,它就幫咱們提煉出來了,提煉出來一個叫作應用的東西,因此咱們須要來建立這個應用。
A:建立應用的命令:
python manage.py startapp blog #經過執行manage.py文件來建立應用,執行這句話必定要注意,你應該在這個manage.py的文件所在目錄下執行這句話,由於其餘目錄裏面沒有這個文件
6.django初識(一些操做)
學習django,咱們就學上邊的這些文件,怎麼在MTV+url分發的功能下來使用.
之後咱們建立django項目,不多用命令行了,就用pycharm來建立.
(1)pycharm建立django項目
步驟1:(File==>New Project)
步驟2:
步驟3:點擊Create
目錄結果:
步驟4:
點擊,綠色的三角形,運行.
因爲電腦的配置關係,可能又要稍長一點的時間.
運行起來以後,輸出窗,輸出結果以下,證實運行起來了
步驟5:(在瀏覽器中輸入:127.0.0.1:8000),輸出結果以下
(2)一些配置介紹
A: django經過如下,進行路徑配置,查找路徑的.下面這個在settings.py界面
B: django的基礎路徑,如下界面也是在,settings中.
首先找到,settings的絕對路徑,在找父路徑,再找父路徑.
這樣把項目拷貝走,在哪裏都能運行.
C: urls文件中的信息.
(3)一個簡單的小項目,簡單配置
A:首先,找路徑頁面,進行路徑分發,urls.py頁面中進行以下操做:
from app01 import views
url(r'^login/', views.login),
鼠標左鍵+urls界面的views==>views頁面.
B:在界面views.py中寫以下內容,
在後邊加上HttpResponse,進行服務端的響應,添加的語句以下.
from django.shortcuts import render,HttpResponse
# Create your views here.
def login(request):
#request是請求的意思,調用url的時候傳輸的
return HttpResponse('這是登陸頁面')
C:運行,輸入網址(127.0.0.1:8000/login/),運行結果以下.
(4)django的一個登陸界面:
A:對(3)進行修改,login.html頁面方法到templates中,
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="content-Type" charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width" ,initial-scale="1"> <!--上邊這個表示手機版的調整尺寸--> <!--上述2個meta標籤"必須"放在最前面,任何其餘內容都必須跟隨其後--> <title>Title</title> </head> <body> <form action="http://127.0.0.1:8080/auth" method="get"> <!--在這裏的action的目的是,提交以後跳轉的路徑是auth界面--> <!--請求方式改寫成,也就是提交以後的方法用get方法--> <label for="username">用戶名</label><input id="username" type="text" name="username"> <label for="password">密碼</label><input id="password" type="password" name="password"> <!--type設置成password的目的是將密碼隱藏起來--> <!--這裏的name=username,這個鍵值對寫的緣由是,在瀏覽器上的搜索框顯示--> <input type="submit"> </form> </body> </html>
B:在view.py文件中修改以下:
C:訪問下列地址(127.0.0.1:8000/login/),運行結果以下:
<form action="http://127.0.0.1:8080/auth" method="get">
form表單表示,在當前訪問頁面&&提交數據
(5)在(4)的基礎上,思考form表單,向哪提交消息
(是否能夠寫兩個頁面,一個訪問頁面,一個提交數據)
A:在login.html中修改form表單,
<form action="" method="post">
B:在views.py頁面中進行判斷一下,進行處理,提交數據用post方法,訪問頁面用get方法.
C:運行項目,結果以下,
D.在服務端收到信息,以下截圖:在服務端收到get請求
E:在瀏覽器中隨便輸入用戶:donggua,密碼:123,點擊"提交".結果以下圖:
forbidden,這些東西是django對其進行的一些配置.
F:把settings.py的
'django.middleware.csrf.CsrfViewMiddleware',註銷掉
這個註銷掉的是中間件,後面會講到
G:再次在瀏覽器中輸入(http://127.0.0.1:8000/login/),輸入用戶:donggua,密碼:123,而後點擊提交.
緣由是:form表單的action,也就是提交地址爲空,也就是當前頁面路徑下提交數據.
<form action="" method="post">
結果:
H:而後走urls.py,找到對應的函數,
而後,找到對應的請求方法,也就是在views.py中找到
打印的請求結果就是post了,以下圖:
I.在下圖中,咱們能夠經過獲得的是GET仍是POST進行判斷,是請求頁面,仍是提交數據
if條件判斷,若是是GET,則返回頁面,若是是POST,提交數據,如何獲取數據???
目前request封裝的是個對象,wsgiref封裝的是個字典,request.method進行調用其內部的方法,字典經過中括號,索引進行取值.app請求的request對象
J.views對應的代碼.
K.運行,隨便提交,密碼和用戶
結果以下:
L.若是沒有返回值,views.py代碼以下:
運行以後,在瀏覽器中輸入(http://127.0.0.1:8000/login/),輸入密碼和用戶,獲得的結果以下:
所以,在寫的時候必須return一個東西.
地址:127.0.0.1:8000/login,提交以後,會在地址以後加上一個/
(6)
A:修改代碼以下,
B:輸入網址:127.0.0.1:8000/login/ ,輸入用戶名:alex,密碼123
獲得的結果是:
C:服務端獲得的結果:用戶名和密碼
(7)
A:修改代碼以下,
B:在瀏覽器中輸入地址,(127.0.0.1:8000/login/)
用戶名輸入錯誤,結果
輸入正確,結果:
(8)post和get獲取數據
獲取用戶的請求方法:
(9)一些備註和,上邊的總體代碼.
from django.shortcuts import render,HttpResponse # Create your views here. def login(request): #獲取用戶的請求方法 method=request.method if method=='GET': #返回頁面 return render(request,'login.html') else: #post方法獲取數據,都是字符串類型 uname=request.POST.get('username') # get方法獲取數據 # uname = request.GET.get('username') pwd=request.POST.get('password') print(uname,pwd) if uname=='sb'and pwd=='222': #返回消息,寫字符串就行 return HttpResponse('登陸成功') else: return HttpResponse('驗證失敗') # return render(request,'login.html') #request是請求的意思,調用url的時候傳輸的
(10)
A:修改爲get請求方式
html中修改爲這個get
<form action="" method="get">
views.py文件改爲下面的格式
B:運行,在瀏覽器中,輸入下面的網址:
服務端收到的結果:
(11)
A:在(10)的基礎上,進一步,修改以下截圖:
B.修改views.py文件.
在這裏,咱們走home,就返回login頁面.
C.此時運行(127.0.0.1:8000/home/),輸入用戶名和密碼,獲得以下內容.
服務端,沒有收到任何信息.
D:分析:login.html這個時候,須要改寫表單.
<form action="http://127.0.0.1:8000/login/" method="get">
E.刷新頁面,獲得的結果以下:
F:輸入:用戶名sb,密碼:222
提交以後,獲得的頁面以下:
服務端獲得以下信息:
(12)動態頁面
A.操做urls
B.在views.py頁面中添加
上邊最後一行是,模板渲染
C.在templates頁面中,添加index.html頁面.(進行時間替換)
運行結果以下:(每次實踐都會發生變化)
(13)端口修改
A:
B:
預習內容:
django認識,按照下面的步驟學習:
1.django的url控制器
2.django的視圖
3.django的模板(templates)
4.ORM(花的時間比較久)