1. 程式人生 > >day 61 Django part-1 django的安裝,以及初學者三件套

day 61 Django part-1 django的安裝,以及初學者三件套

true utf8 new 再看 gpo 停止 常用 筆記 red

老師的筆記:

技術分享圖片
day61

1.前情回顧
    1. pymysql
    
        使用:
            安裝 pip install pymysql
            導入 import pymysql
            
            具體使用:
                1. 創建連接  conn = pymysql.connect(host="lcoalhost", port=3306, user="", password="", database="", charset="utf8")
                
2. 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. 登錄失敗就返回當前頁面
View Code

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的安裝,以及初學者三件套