day 61 Django part-1 django的安裝,以及初學者三件套
老師的筆記:
day61 1.前情回顧 1. pymysql 使用: 安裝 pip install pymysql 導入 import pymysql 具體使用: 1. 創建連接 conn = pymysql.connect(host="lcoalhost", port=3306, user="", password="", database="", charset="utf8")View Code2. cursor = conn.cursor() 3. cursor.execute(sql, (arg1, arg2 ...)) --> SQL註入問題 4. 增刪改查 增: cursor.execute("insert into ...", (arg1, arg2...)) conn.commit() --> 向數據庫提交 cursor.lastrowid--> 獲取剛插入的那條數據的ID 刪: cursor.execute(“delete ...”, (arg1, arg2...)) conn.commit() --> 向數據庫提交 改: cursor.execute("update ...”, (arg1, arg2...))conn.commit() --> 向數據庫提交 查: cursor.execute(“select ...”, (arg1, arg2...)) cursor.fetchone() --> 查單條數據,元組類型 cursor.fetchmany(n) --> 查多條數據 cursor.fetchall() --> 查所有數據 cursor.scroll(n, mode="relative") --> 相對移動 cursor.scroll(n, mode="absolute") --> 絕對移動 批量執行: cursor.executemany("update ...”, ((arg1, arg2),(arg1, arg2),(arg1, arg2))) conn.commit() 回滾: try: cursor.execute("update ...”, (arg1, arg2...)) conn.commit() --> 向數據庫提交 except Exception as e: logging.error(str(e)) conn.rollback() cursor.close() conn.close() 2. 今日內容 Web框架(絕大部分內容) 瀏覽器 socket客戶端 4. 客戶端連接服務端 5. send() 客戶端發數據 8. recv() 接收服務端回復的數據 9. close() 關閉鏈接 博客園服務器 socket服務端 1. bind IP和端口 2. listen() 監聽 3. accept() 等待連接 6. recv() 接收數據 7. send() 回復數據 FTP上傳文件的: msg = "upload|filename|1024" 服務端解析: msg.split() -> 瀏覽器和你的web服務端通信需要遵循一個規則,這個規則就是HTTP協議。 HTTP協議: 簡單的理解成 規定了消息的格式 瀏覽器發送 ---> 請求 (request) 服務端回復 ---> 響應 (response) 請求和響應的格式: Header (頭)\r\n\r\n Body (體) 請求: GET請求的格式: 只有請求頭沒有請求體 "GET / HTTP/1.1\r\n k1:v1\r\n k2:v2\r\n .... " POST請求的格式: "POST / HTTP/1.1\r\n k1:v1\r\n k2:v2\r\n .... " Body 響應: Header Body 渲染 (render) 本質上: 用數據去替換HTML頁面中的特殊字符 jinja2 Flask 總結: 自己定義的web框架 a. 自己寫socket處理請求相關的數據(web服務端) wsgiref uWSGI gunicorn WSGI協議: Python Web服務端和Python 應用程序之間通訊的一個標準 b. URL -> 函數 --> 函數裏面寫業務邏輯(取到數據) c. 把數據填充到HTML頁面(字符串替換) 分類: 1. a、b、c都是用自己的 --> Tornado 2. a用別人的,b和c用自己的 --> Django 3. a和c都用別人的,b用自己的 --> Flask 另外一個維度的分類: 1. Django (大而全) 2. 其他 (小而精) Django: 安裝: pip install django==1.11.9 新建Django項目: 命令行方式: > 先進入到你新建的項目要存放的目錄 > django-admin startproject s8 > cd s8 > python manage.py runserver PyCharm方式: File -> new project -> 選Django -> 起名字 -> 點右下角create 啟動Django項目: 命令行方式: python manage.py runserver 127.0.0.1:8888 python manage.py runserver 8888 PyCharm方式啟動:(PyCharm單獨打開你的Django項目) 1. 點頁面上方中部位置的綠色小三角 直接運行 Ctrl + C 停止 Django項目目錄結構: s8 -s8 -settings.py -urls.py URL --> 函數的對應關系 -wsgi.py -manage.py 新手必備三件套: from django.shortcuts import HttpResponse, render, redirect 跟request相關的方法: request.method request.POST request.POST.get("key") --> 獲取對應的值 新建Django項目三件事: 1.註釋csrf那一行 2. 配置靜態文件 3. 檢查templates配置項 3. 今日作業 把你之前用Bootstrap寫的那個登錄頁面,用Django跑起來 1. 靜態文件的擺放位置 ****** 2. 登陸用POST提交數據,使用pymysql去數據庫裏取用戶數據校驗 3. 登陸成功跳轉到 http://www.luffycity.com 4. 登錄失敗就返回當前頁面
http://www.cnblogs.com/liwenzhou/p/8258992.html
我們可以這樣理解:所有的Web應用本質上就是一個socket服務端,而用戶的瀏覽器就是一個socket客戶端。 這樣我們就可以自己實現Web框架了。
import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen(5) while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"OK") conn.close()View Code
web的框架是上面的客戶端和服務端,這就是本質的東西
所以,必須有一個統一的規則,讓大家發送消息、接收消息的時候有個格式依據,不能隨便寫。
這個規則就是HTTP協議,以後瀏覽器發送請求信息也好,服務器回復響應信息也罷,都要按照這個規則來。
HTTP協議主要規定了客戶端和服務器之間的通信格式,那HTTP協議是怎麽規定消息格式的呢?
讓我們首先看下我們在服務端接收到的消息是什麽。
然後再看下我們瀏覽器收到的響應信息是什麽。
響應頭在瀏覽器的network窗口可以看到,我們看到的HTML頁面內容就是響應體。本質上還是字符串,因為瀏覽器認識HTML,所以才會渲染出頁面。
HTTP協議介紹
每個HTTP請求和響應都遵循相同的格式,一個HTTP包含Header和Body兩部分,其中Body是可選的。 HTTP響應的Header中有一個 Content-Type
表明響應的內容格式。如 text/html
表示HTML網頁。
HTTP GET請求的格式:
GET /path HTTP/1.1 header1:v1\r\n header2:v2\r\n
使用 \r\n
分隔多個header
HTTP POST請求格式:
POST /path HTTP/1.1 header1:v1\r\n header2:v2\r\n \r\n\r\n 請求體...
當遇到連續兩個 \r\n\r\n
時,表示Header部分結束了,後面的數據是Body。
HTTP響應的格式:
200 OK Header1:v1\r\n Header2:v2\r\n \r\n\r\n 響應體...
讓我們的Web框架在給客戶端回復響應的時候按照HTTP協議的規則加上響應頭,這樣我們就實現了一個正經的Web框架了。
這樣,服務器程序就需要為不同的框架提供不同的支持。這樣混亂的局面無論對於服務器還是框架,都是不好的。對服務器來說,需要支持各種不同框架,對框架來說,只有支持它的服務器才能被開發出的應用使用。
這時候,標準化就變得尤為重要。我們可以設立一個標準,只要服務器程序支持這個標準,框架也支持這個標準,那麽他們就可以配合使用。一旦標準確定,雙方各自實現。這樣,服務器可以支持更多支持標準的框架,框架也可以使用更多支持標準的服務器。
WSGI(Web Server Gateway Interface)就是一種規範,它定義了使用Python編寫的web應用程序與web服務器程序之間的接口格式,實現web應用程序與web服務器程序間的解耦。
常用的WSGI服務器有uwsgi、Gunicorn。而Python標準庫提供的獨立WSGI服務器叫wsgiref,Django開發環境用的就是這個模塊來做服務器。
不管是什麽內容,最後都是轉換成字節數據發送出去的。 我可以打開HTML文件,讀取出它內部的二進制數據,然後發送給瀏覽器。
我們通過了socket連接就打開了一個HTML文件,
from wsgiref.simple_server import make_server def index(): with open("index.html", "rb") as f: data = f.read() return [data, ] def home(): with open("home.html", "rb") as f: data = f.read() return [data, ] # 定義一個url和函數的對應關系 URL_LIST = [ ("/index/", index), ("/home/", home), ] def run_server(environ, start_response): start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html;charset=utf8‘), ]) # 設置HTTP響應的狀態碼和頭信息 url = environ[‘PATH_INFO‘] # 取到用戶輸入的url func = None # 將要執行的函數 for i in URL_LIST: if i[0] == url: func = i[1] # 去之前定義好的url列表裏找url應該執行的函數 break if func: # 如果能找到要執行的函數 return func() # 返回函數的執行結果 else: return [bytes("404沒有該頁面", encoding="utf8"), ] if __name__ == ‘__main__‘: httpd = make_server(‘‘, 8000, run_server) print("Serving HTTP on port 8000...") httpd.serve_forever()View Code
這是一個簡單的動態,我完全可以從數據庫中查詢數據,然後去替換我html中的對應內容,然後再發送給瀏覽器完成渲染。 這個過程就相當於HTML模板渲染數據。 本質上就是HTML內容中利用一些特殊的符號來替換要展示的數據。 我這裏用的特殊符號是我定義的,其實模板渲染有個現成的工具: jinja2
from wsgiref.simple_server import make_server from jinja2 import Template def index(): with open("index2.html", "r") as f: data = f.read() template = Template(data) # 生成模板文件 ret = template.render({"name": "Alex", "hobby_list": ["燙頭", "泡吧"]}) # 把數據填充到模板裏面 return [bytes(ret, encoding="utf8"), ] def home(): with open("home.html", "rb") as f: data = f.read() return [data, ] # 定義一個url和函數的對應關系 URL_LIST = [ ("/index/", index), ("/home/", home), ] def run_server(environ, start_response): start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html;charset=utf8‘), ]) # 設置HTTP響應的狀態碼和頭信息 url = environ[‘PATH_INFO‘] # 取到用戶輸入的url func = None # 將要執行的函數 for i in URL_LIST: if i[0] == url: func = i[1] # 去之前定義好的url列表裏找url應該執行的函數 break if func: # 如果能找到要執行的函數 return func() # 返回函數的執行結果 else: return [bytes("404沒有該頁面", encoding="utf8"), ] if __name__ == ‘__main__‘: httpd = make_server(‘‘, 8000, run_server) print("Serving HTTP on port 8000...") httpd.serve_forever()View Code
我們先安裝上django
然後了解它的工作原理,
然後掌握它的一些用法,
最後使用它實現一些簡單的小功能
安裝(安裝最新LTS版):
pip3 install django==1.11.9
我們安裝的時候可以就在pycharm裏面進行就可以,
創建一個django項目:
下面的命令創建了一個名為"mysite"的Django 項目:
django-admin startproject mysite
我們的靜態文件,就是static文件裏面的,那些css,js,以及jQuery文件,還有圖片之類的
而我們的HTML文件是放在
TEMPLATES這個文件裏面的
from django.shortcuts import HttpResponse, render, redirect
這三個,是核心內容django裏面的核心
HttpResponse
內部傳入一個字符串參數,返回給瀏覽器。
例如:
def index(request): # 業務邏輯代碼 return HttpResponse("OK")
render
除request參數外還接受一個待渲染的模板文件和一個保存具體數據的字典參數。
將數據填充進模板文件,最後把結果返回給瀏覽器。(類似於我們上面用到的jinja2)
例如:
def index(request): # 業務邏輯代碼 return render(request, "index.html", {"name": "alex", "hobby": ["燙頭", "泡吧"]})
redirect
接受一個URL參數,表示跳轉到指定的URL。
例如:
def index(request): # 業務邏輯代碼 return redirect("/home/")
目錄介紹:
mysite/ ├── manage.py # 管理文件 └── mysite # 項目目錄 ├── __init__.py ├── settings.py # 配置 ├── urls.py # 路由 --> URL和函數的對應關系 └── wsgi.py # runserver命令就使用wsgiref模塊做簡單的web server
day 61 Django part-1 django的安裝,以及初學者三件套