1. 程式人生 > >一、2 基於wsgiref定義自己的web框架

一、2 基於wsgiref定義自己的web框架

目錄結構:除了templates目錄下的html檔案,其他檔案都是屬於平行關係

C:.

│   index.html

│   url.py

│   views.py

│   wsgirefServer.py

├───templates

│       index.html

│       test.html

│       time.html

│       user.html


wsgirefServer.py

# make_server : 類似下面的程式碼,把這些封裝好以後,成了 make_server
# import socket
# server=socket.socket()
# server.bind(('127.0.0.1',8001))
# server.listen(5)
# while True:
#     conn,client_address=server.accept()
#     data=conn.recv(1024)
from wsgiref.simple_server import make_server
# from url import urls
# from views import error
#  env :已經把下面這些封裝好以後,把類似my_diango.py 中的'/index' 路徑 從env中取出來即可,這個env 既是字典,也是對像。(把請求頭切分好以後,放進字典裡面)
# data = conn.recv(1024)
# conn.send(b'HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n')

from url import urls
from views import error


def run(env, response):
    print(env)
    response("200 ok", [('Content-type', 'text/html')])
    position = env['PATH_INFO']
    func = None
    for url in urls:
        if position == url[0]:
            func = url[1]
            break
    if func:
        response = func(env)
    else:
        response = error(env)

    return [response.encode('utf-8'), ]

if __name__ == '__main__':
    server = make_server('127.0.0.1', 8003, run) # run 相當於一個裝飾器,在run函式之前做了件事,執行run 後,又在run函式之前做了件事,固定用法
    server.serve_forever()

url.py

from views import *
urls = [
    ('/index', index),
    ('/time', time),
    ('/test', test),
    ('/user', user),
]

views.py

import datetime
from jinja2 import Template
import pymysql


def index(env):
    with open('templates/index.html', 'r') as f:
        data = f.read()
    return data


def time(env):
    ctime = datetime.datetime.now().strftime('%Y-%m-%d %X')
    with open('templates/time.html', 'r') as f:
        data = f.read()
        data = data.replace('@@
[email protected]
@', ctime)     return data def error(env):     return '404' def test(env):     with open('templates/test.html', 'r') as f:         data = f.read()     tem = Template(data)     response = tem.render(user={'name': 's_jun', 'age': 18})     return response def user(env):     conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', db='db2', password='mariadb.123')     # 獲得遊標,並且查詢結果資料是字典格式     cur = conn.cursor(pymysql.cursors.DictCursor)     # 執行sql     cur.execute('select * from user')     # 獲取全部查詢結果     dic = cur.fetchall()     print(dic)     with open('templates/user.html', 'r') as f:         data = f.read()     tem = Template(data)     response = tem.render(user_list=dic)     return response

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<h1>h1</h1>
<h2>h2</h2>
<img src="http://img4.imgtn.bdimg.com/it/u=1565006133,780611353&fm=26&gp=0.jpg">
</body>
</html>

templates目錄下的html檔案

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<h1>h1</h1>
<h2>h2</h2>
<img src="http://img4.imgtn.bdimg.com/it/u=1565006133,780611353&fm=26&gp=0.jpg">
</body>
</html>

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
{{user.name}}
{{user.age}}
</body>
</html>

time.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>time</title>
</head>
<body>
@@[email protected]@
</body>
</html>

user.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>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>