1. 程式人生 > >小白學Django------------------web應用,HTTP,URL

小白學Django------------------web應用,HTTP,URL

一.web應用

web應用程式

Web應用程式是一種可以通過Web訪問的應用程式,程式的最大好處是使用者很容易訪問應用程式,使用者只需要有瀏覽器即可,不需要再安裝其他軟體。應用程式有兩種模式C/S、B/S。C/S是客戶端/伺服器端程式,也就是說這類程式一般獨立執行。而B/S就是瀏覽器端/伺服器端應用程式,這類應用程式一般藉助IE等瀏覽器來執行。WEB應用程式一般是B/S模式。Web應用程式首先是“應用程式”,和用標準的程式語言,如C、C++等編寫出來的程式沒有什麼本質上的不同。然而Web應用程式又有自己獨特的地方,就是它是基於Web的,而不是採用傳統方法執行的。換句話說,它是典型的瀏覽器/伺服器架構的產物。

總結一下,本質上:瀏覽器是一個socket客戶端,伺服器是一個socket服務端

基於socket的簡單web應用


import socket

socket = socket.socket()
socket.bind(('127.0.0.1', 8001))
socket.listen(5)
print('正在監聽...')
while True:
    print('等待連線...')
    conn, addr = socket.accept()
    data = conn.recv(1024)
    # 轉換成str型別
    data = str(data,encoding='utf-8')
    resuest_list = data.split('\r\n'
) first_list = resuest_list[0].split(' ') print(first_list) # 響應部分:"HTTP/1.1 200 OK"為響應頭,\r\n\r\n後面為響應體 conn.send(b'HTTP/1.1 200 OK \r\n\r\n') if first_list[1] == '/index': # conn.send('<h1>index頁面</h1><img src="https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=25421f99a164034f1bc0ca54ceaa1254/37d3d539b6003af3543e0d243f2ac65c1138b6ea.jpg">'.encode('utf-8'))
with open('index.html','rb') as f: data = f.read() conn.send(data) # 簡單動態網頁 elif first_list[1] == '/two': with open('two.html','r',encoding='utf-8') as f: data = f.read() import datetime now = datetime.datetime.now().strftime('%Y-%m-%d %X') data = data.replace('@@[email protected]@',now) conn.send(data.encode('utf-8')) else: conn.send(b'404') conn.close()
index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <img src="https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=25421f99a164034f1bc0ca54ceaa1254/37d3d539b6003af3543e0d243f2ac65c1138b6ea.jpg">
</body>
</html>
two.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
@@[email protected]@
</body>
</html>

補充(如果不記得什麼時候用encode,什麼時候用decode)

  • bytes型別轉為字串型別

    data = str(data,encoding='utf-8')
    
  • str型別轉為bytes型別

簡單web框架

socket(a)

路由關係(b)

模板字串替換,模板語言©

django a用別人的 b自己寫的 c自己寫的

flask a用別人的 b自己寫的 c用別人的(jinja2)

tornado a自己寫的 b自己寫的 c自己寫的


import socket

import pymysql
def index(request):
    return '<img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg"></img>'


def login(request):
    with open('login.html','r',encoding='utf-8') as f :
        data=f.read()
    return data
def time(request):
    import datetime
    now=datetime.datetime.now().strftime('%Y-%m-%d %X')
    with open('time.html','r',encoding='utf-8') as f :
        data=f.read()
    data=data.replace('@@[email protected]@',now)
    return data
def user_list(request):
    # 建立連線
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='lqz')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("select id,name,password from user")
    user_list = cursor.fetchall()
    cursor.close()
    conn.close()
    tr_list=[]
    for row in user_list:
        tr='<tr><td>%s</td><td>%s</td><td>%s</td></tr>'%(row['id'],row['name'],row['password'])
        tr_list.append(tr)


    with open('user_list.html','r',encoding='utf-8') as f:
        data=f.read()
    data=data.replace('@@[email protected]@',''.join(tr_list))
    return data

def user_list_new(request):
    # 建立連線
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='lqz')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("select id,name,password from user")
    user_list = cursor.fetchall()
    cursor.close()
    conn.close()
    with open('user_list_new.html','r',encoding='utf-8') as f:
        data=f.read()
    from jinja2 import Template
    template=Template(data)
    response=template.render(user_list=user_list)
    # response=template.render({'user_list':user_list})
    return response


urls = [
    ('/index', index),
    ('/login', login),
    ('/time', time),
    ('/user_list', user_list),
    ('/user_list_new', user_list_new),
]


def run():
    soc = socket.socket()
    soc.bind(('127.0.0.1', 8006))
    soc.listen(5)
    while True:
        conn, port = soc.accept()
        data = conn.recv(1024)
        # data=data.decode('utf-8')
        print(data)
        data = str(data, encoding='utf-8')
        request_list = data.split('\r\n\r\n')
        head_list = request_list[0].split('\r\n')
        method, url, htt = head_list[0].split(' ')
        # conn.send(b'hello web')
        conn.send(b'HTTP/1.1 200 OK \r\n\r\n')
        print(url)
        func_name = None
        for u in urls:
            if url == u[0]:
                func_name = u[1]
                break
        if func_name:
            response = func_name(data)
        else:
            response = '404 not found'

        conn.send(response.encode('utf-8'))
        conn.close()


if __name__ == '__main__':
    run()

WebServer
login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="">
    <p>使用者名稱:<input type="text"></p>
    <p>密碼:<input type="password"></p>


</form>
</body>
</html>

login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


@@[email protected]@
</body>
</html>

time.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用者列表</title>
</head>
<body>

<table border="1">
    <thead>
        <tr>
            <th>id</th>
            <th>使用者名稱</th>
            <th>密碼</th>
        </tr>
    </thead>
    <tbody>
        @@[email protected]@
    </tbody>


</table>

</body>
</html>

user_list.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用者列表</title>
</head>
<body>
<table border="1">
    <thead>
    <tr>
        <th>id</th>
        <th>name</th>
        <th>password</th>
    </tr>
    </thead>
    <tbody>

    {% for user in user_list%}
    <tr>
        <td>{{user.id}}</td>
        <td>{{user.name}}</td>
        <td>{{user.password}}</td>
    </tr>
    {%endfor%}


    </tbody>


</table>

</body>
</html>

user_list_new

二.HTTP

2.1 HTTP協議特性

  • 基於TCP/ip協議之上的應用層協議

  • 基於請求—響應模式(先從客戶端開始建立通訊的,伺服器端在沒有 接收到請求之前不會發送響應)

  • 無狀態儲存

    HTTP是一種不儲存狀態,即無狀態(stateless)協議。HTTP協議 自身不對請求和響應之間的通訊狀態進行儲存。也就是說在HTTP這個 級別,協議對於傳送過的請求或響應都不做持久化處理。
    
  • 無連線

    無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。
    

2.2 http請求協議與響應協議

請求協議

請求方式: get與post請求

  • GET提交的資料會放在URL之後,以?分割URL和傳輸資料,引數之間以&相連,如EditBook?name=test1&id=123456. POST方法是把提交的資料放在HTTP包的請求體中.
  • GET提交的資料大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的資料沒有限制.
  • GET與POST請求在服務端獲取請求資料方式不同。

響應協議

響應狀態碼

1XX		資訊性狀態碼(Informational)	接受的請求正在處理
2XX		成功狀態碼(Success)			 請求正常處理完畢
3XX		重定向狀態碼(Redirection)		需要進行附加操作以完成請求
4XX		客戶端錯誤狀態碼(Client Error) 伺服器無法處理請求
5XX		服務端錯誤狀態碼(Server Error) 伺服器處理請求出錯

三.URL

3.1 url簡介

url:統一資源定位符是對可以從網際網路上得到的資源的位置和訪問方法的一種簡潔的表示,是網際網路上標準資源的地址。網際網路上的每個檔案都有一個唯一的URL,它包含的資訊指出檔案的位置以及瀏覽器應該怎麼處理它

格式:
  協議://IP:埠(80)/路徑?name=tom&age=18

?之前的是請求路徑,?之後的是請求資料部分