web框架原理

web框架原理

web框架主要分爲三個部分html

  一、啓動socket服務端mysql

  二、路由系統,寫出uri與函數的對應關係web

  三、模板引擎渲染,將html頁面與mysql中的數據進行融合sql

啓動socket服務端

import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
# ①寫socket服務端
while True:
    conn, addr = server.accept()

    data = conn.recv(8192)
    data = str(data,encoding='utf-8')
    header = data.split('\r\n\r\n')[0].split('\r\n')[0]
    # 拿到須要的頭部信息 GET / HTTP/1.1
    router = header.split(' ')[1]
    # 獲取瀏覽器訪問的uri信息 /

    # 咱們要寫一個uri與對應函數的映射關係
    # 拿出uri對應的函數名,調用
    func_name = None
    for rout in router_list:
        if rout[0] == router:
            func_name = rout[1]
            break
    # 判斷訪問的uri是否存在映射關係
    if func_name:   # 有就存在
        res = bytes('訪問成功',encoding='utf-8')
    else:
        res = bytes('訪問不存在',encoding='utf-8')

    # 拿到要返回給瀏覽器的結果後開始返回數據

    # 咱們須要先返回一個響應頭
    conn.send(bytes('HTTP/1.1 200 OK \r\n\r\n'))    # 最簡單的響應頭
    # 再發送主體信息
    conn.send(res)
    # 關閉一次鏈接
    conn.close()

路由系統 - uri與函數的對應關係

# ②寫函數與uri的映射關係
def home():
    pass

def index():
   pass

router_list = [
    ('/',home),
    ('/index',index)
]
# ①寫socket服務端
while True:
    conn, addr = server.accept()

    data = conn.recv(8192)
    data = str(data,encoding='utf-8')
    header = data.split('\r\n\r\n')[0].split('\r\n')[0]
    # 拿到須要的頭部信息 GET / HTTP/1.1
    router = header.split(' ')[1]
    # 獲取瀏覽器訪問的uri信息 /

    # 咱們要寫一個uri與對應函數的映射關係
    # 拿出uri對應的函數名,調用
    func_name = None
    for rout in router_list:
        if rout[0] == router:
            func_name = rout[1]
            break
    # 判斷訪問的uri是否存在映射關係
    if func_name:   # 有就存在
        res = bytes('訪問成功',encoding='utf-8')
    else:
        res = bytes('訪問不存在',encoding='utf-8')

    # 拿到要返回給瀏覽器的結果後開始返回數據

    # 咱們須要先返回一個響應頭
    conn.send(bytes('HTTP/1.1 200 OK \r\n\r\n'))    # 最簡單的響應頭
    # 再發送主體信息
    conn.send(res)
    # 關閉一次鏈接
    conn.close()

模板引擎渲染

自定義規則數據庫

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>渲染模板</title>
</head>
<body>
<table>
    <!--佔位字符-->
    @@content@@
</table>
</body>
</html>
渲染的頁面
def home():
    # 返回靜態頁面
    # 先讀出靜態html文件
    f = open('靜態頁面.html','r')
    data = f.read()
    f.close()
    return bytes(data,encoding='utf-8')


def index():
    # 也要先讀出html頁面
    f = open('靜態頁面.html', 'r')
    data = f.read()
    f.close()

    # 模板引擎渲染,將html代碼與mysql數據庫進行融合(本身定製規制,或者使用第三方工具)
    # 第一種,自定義規則,先在須要放數據的地方用自定義的佔位符佔位
    # 連接數據庫,取出想要的數據
    import pymysql
    conn = pymysql.connect(host='127.0.0.1',user='root',password='123',
                           database='db1',charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = "select * from table1"
    res = cursor.fetchall()
    # 取出來的是一個列表裏面套字典的形式,咱們須要拿出咱們須要的值進行字符串拼接
    r_list = []
    for r in res:
        s = '<tr><td>%s</td><td>%s</td></tr>'%(r['name'],r['pwd'])
        r_list.append(s)
    # 所有添加完以後再作一個總體的拼接
    need = ''.join(r_list)
    # 拼接好以後進行替換出咱們以前html中的佔位字符
    res = data.replace('@@content@@',need)
    # 替換好以後能夠把信息返回給瀏覽器了
    return bytes(res,encoding='utf-8')
server服務端

使用第三方工具jinja2瀏覽器

def home():
    # 返回靜態頁面
    # 先讀出靜態html文件
    f = open('靜態頁面.html','r')
    data = f.read()
    f.close()
    return bytes(data,encoding='utf-8')


def index():
    # 也要先讀出html頁面
    f = open('靜態頁面.html', 'r')
    data = f.read()
    f.close()

    # 模板引擎渲染,將html代碼與mysql數據庫進行融合(本身定製規制,或者使用第三方工具)
    # 連接數據庫,取出想要的數據
    import pymysql
    conn = pymysql.connect(host='127.0.0.1',user='root',password='123',
                           database='db1',charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = "select * from table1"
    res = cursor.fetchall()


    # 第二種模板引擎渲染是經過第三方的工具,這裏用的是jinja2
    from jinja2 import Template
    template = Template(data)
    res = template.render(user= res) # 這裏須要把key和html裏的佔位符對應好
    return bytes(res,encoding='utf-8')
server服務端
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>渲染模板</title>
</head>
<body>
<table>
<!--    這裏的佔位符是{{name}} 外面傳值必須經過key,value傳值, key須要與佔位字符一致 -->
        {{name}}
<!--    若是外面傳進來列表,在這裏也能夠循環-->
    {% for k in name %}
<!--    若是循環出來的k是字典,能夠用點key進行取值-->
        <td>{{k.name}}</td>
    {% endfor %}
</table>

</body>
</html>
渲染的頁面
相關文章
相關標籤/搜索