3 纯手撸web框架


纯手撸简易版本web框架

"""
1.代码过于冗余
2.处理http数据繁杂
"""
import socket


server = socket.socket()
server.bind(('127.0.0.1',8080))  # 端口号尽量使用8000之后的
server.listen(5)


while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    data = data.decode('utf8')
    print(data)
    target_url = data.split(' ')[1]
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    if target_url == '/index':
        conn.send(b'from index')
    elif target_url == '/login':
        conn.send(b'from login')
    elif target_url == '/func':
        with open(r'myhtml.html','rb') as f:
            for line in f:
                conn.send(line)
    else:
        conn.send(b'404 error')

字符转换的另一种方式:

s="hello jango!!!今天是个好日子"

res=bytes(s,"utf8")

print(res)
res1=str(res,"utf8")

print(res1)

 

复习

__call__ #当对象加括号的时候自动触发函数的执行
__str__  #当打印对象的时候自动触发执行  #返回值必须是字符串类型

wsgiref模块

from wsgiref.simple_server import make_server


def run(request, response):
    """
    :param request:跟请求相关的数据
    :param response: 跟响应相关的数据
    :return: 返回值就是要给前端浏览器的数据
    """
    response('200 OK',[])
    # print(request)  # 自动帮我们处理了所有http协议相关的数据并组织成了一个大字典
    target_url = request.get('PATH_INFO')
    if target_url == '/index':
        return [b'from index']
    elif target_url == '/login':
        return [b'from login']
    return [b'hello world']


if __name__ == '__main__':
    # 监听127.0.0.1:8080 一旦有请求 立刻将第三个参数加括号调用
    server = make_server('127.0.0.1', 8080, run)
    # 启动服务端
    server.serve_forever()

变形优化

针对后缀较多的情况 如何更加优化匹配
from wsgiref.simple_server import make_server

def index():
    return "index页面"
def login():
    return "login 页面"
def error():
    return "404 error"
urls=[("/index",index),("/login",login)]



def run(request,response):
    response("200 ok",[])
    target_url=request.get("PATH_INFO")

    func=None
    for url_tuple in urls:
        if target_url==url_tuple[0]:
            func=url_tuple[1]
            break
    if func:
        res=func()
    else:
        res=error()
    return [res.encode('utf8')]


if __name__ == '__main__':
    server=make_server("127.0.0.1",8080,run)
    server.serve_forever()
'''以后新增功能只需要先写一个函数 然后加一组对应关系即可'''

针对同一个py文件内部代码功能繁杂的情况 拆分多个py文件
    views.py        专门用于存放核心业务逻辑
    urls.py            专门用于存放路径对应关系
    templates        专门用于存放html文件
'''以后新增功能只需要views.py写函数 然后urls.py写对应关系即可'''

面条拌拆分

基于wsgiref模块撸web框架

from wsgiref.simple_server import make_server
from urls import urls
from views import error


def run(request,response):
    response("200 ok",[])
    target_url=request.get("PATH_INFO")

    func=None
    for url_tuple in urls:
        if target_url==url_tuple[0]:
            func=url_tuple[1]
            break
    if func:
        res=func()
    else:
        res=error()
    return [res.encode('utf8')]


if __name__ == '__main__':
    server=make_server("127.0.0.1",8080,run)
    server.serve_forever()

urls.py

from views import *
urls=[("/index",index),
      ("/login",login)]

views.py

def index():
    return "index页面"
def login():
    return "login 页面"
def error():
    return "404 error"

实现连接展示html页面内容

def index():
    # return "index页面"
    with open(r'templates/index.html','r',encoding='utf8') as f:
        return f.read()
        
   
  

index页面

动静态网页

动静态网页   
 动态网页        数据不是直接写死在html页面上的 而是动态获取(后端)    
静态网页        数据是直接写死在页面上的 

使用我们自己写的web框架 完成一个动态页面的返回

get_time

def get_time(request):
    ctime=datetime.now().strftime("%Y-%m-%d %X")
    with open(r"templates/get_time.html","r",encoding='utf8') as f:
        data=f.read()
    data=data.replace("dsfbgfn",ctime)    #替换
    return data
    
    
    
     

dsfbgfn

jinja2模块

该模块提供了"模板语法"
    支持后端给html页面传递数据并且支持后端语法
pip3 install jinja2

{{user_dict}}

{{user_dict['username']}}

{{user_dict.get('pwd')}}

{{user_dict.hobby}}

{% for key in user_dict%}

{{ key }}

{% endfor %}