一、2 基于wsgiref定义自己的web框架
admin
2023-07-15 19:42:37
0

目录结构:除了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('@@time@@', 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




    
    index


h2

h3

templates目录下的html文件

index.html




    
    index


h2

h3

test.html




    
    test


{{user.name}}
{{user.age}}

time.html




    
    time


@@time@@

user.html




    
    Title



    
    
        id
        name
        password
    
    
    
    {% for user in user_list%}
    
        {{user.id}}
        {{user.name}}
        {{user.password}}

    
    {% endfor %}
    





相关内容

热门资讯

特朗普:正致力于与伊朗达成协议... 特朗普在《纽约邮报》一档播客访谈节目中称,他正与伊朗磋商一项协议,伊朗已同意不再谋求拥有核武器。他表...
不接壤的日菲为何偷划海界? 日菲近日发表联合声明,宣称就“划定两国专属经济区和大陆架的海洋边界”启动正式谈判。两个隔海相望的国家...
凤凰晚报丨从钳工到老戏骨,魏宗... 今日人物【从钳工到老戏骨,魏宗万用一生诠释“戏比天大”】6月1日,表演艺术家魏宗万在上海逝世,享年8...
科威特称伊朗袭击致63人受伤 科威特卫生部门3日称,伊朗当天对科威特的袭击已造成63人受伤,相关部门已启动紧急应对预案,并在全国范...
日本标榜“和平国家”却行扩军备... 今年是东京审判开庭80周年,世界正回望历史、反思战争罪责、捍卫二战后来之不易的国际秩序之际,日本却迈...
浙江杨梅即将大规模上市,如何破... “我们现在的压力很大。”5月底,浙江余姚杨梅产区丈亭镇副镇长林宇站在一片杨梅林前对第一财经表示,当地...
致5死2伤!韩国就韩华航空航天... 【环球网报道 记者 姜蔼玲】据韩联社6月1日报道,针对位于韩国大田的韩华航空航天公司发生爆炸致7人伤...
黄河科技学院2026年招生简章 长按图片识别二维码或点击 “阅读原文” 查看电子招生简章。
医路起航,从“心” 开始!黄河... 6月1日上午,黄河科技学院附属医院2022级临床医学本科实习生入院岗前培训在大医讲堂顺利举办。院领导...
问题居然在实体卡槽上!美版iP... 6月2日消息,日前,又有博主提前把还没发布的iPhone 18 Pro电池参数给曝光了出来,根据爆料...