博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

django前戏

Posted on 2023-06-23 21:32  乱了啦  阅读(19)  评论(0)    收藏  举报

Web框架本质

web框架本质上可以看成是一个功能强大的socket服务端,用户的浏览器可以看成是拥有可视化界面的socket客户端。两者通过网络请求实现数据交互,学者们也可以从架构层面上先简单的将Web框架看做是对前端、数据库的全方位整合

纯手撸web框架

服务端

import socket


server = socket.socket()  # TCP  三次握手四次挥手  osi七层
server.bind(('127.0.0.1', 8080))  # IP协议 以太网协议 arp协议...
server.listen(5)  # 池 ...

while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    # print(data)  # 二进制数据
    data = data.decode('utf-8')  # 字符串
    # 获取字符串中特定的内容       正则  如果字符串有规律也可以考虑用切割
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    current_path = data.split(' ')[1]
    # print(current_path)
    if current_path == '/index':
        # conn.send(b'index heiheihei')
        with open(r'templates/01 myhtml.html', 'rb') as f:
            conn.send(f.read())
    elif current_path == '/login':
        conn.send(b'login')
    else:
        # 你直接忽略favicon.ico
        conn.send(b'hello web')
    conn.close()
# 服务端响应的数据需要符合HTTP响应格式
sock.send(b'HTTP1.1 200 OK\r\n\r\nhello jasonNB')

总结

"""
纯手撸框架缺陷:
    1.socket代码过于重复(每次搭建服务端都需要反复造轮子)
    2.针对HTTP请求数据没有完善的处理方式(目前只能定向切割)
"""

基于wsgiref模块搭建web框架

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


def run(env, response):
    """
    :param env:请求相关的所有数据
    :param response:响应相关的所有数据
    :return: 返回给浏览器的数据
    """
    # print(env)  # 大字典  wsgiref模块帮你处理好http格式的数据 封装成了字典让你更加方便的操作
    # 从env中取
    response('200 OK', [])  # 响应首行 响应头
    current_path = env.get('PATH_INFO')
    # if current_path == '/index':
    #     return [b'index']
    # elif current_path == '/login':
    #     return [b'login']
    # return [b'404 error']
    # 定义一个变量 存储匹配到的函数名
    func = None
    for url in urls:  # url (),()
        if current_path == url[0]:
            # 将url对应的函数名赋值给func
            func = url[1]
            break  # 匹配到一个之后 应该立刻结束for循环
    # 判断func是否有值
    if func:
        res = func(env)
    else:
        res = error(env)

    return [res.encode('utf-8')]


if __name__ == '__main__':
    server = make_server('127.0.0.1',8080,run)
    """
    会实时监听127.0.0.1:8080地址 只要有客户端来了
    都会交给run函数处理(加括号触发run函数的运行)
    
    flask启动源码
        make_server('127.0.0.1',8080,obj)
        __call__
    """
    server.serve_forever()  # 启动服务端

路由层

from views import *

# url与函数的对应关系
urls = [
    ('/index',index),
    ('/login',login),
    ('/xxx',xxx),
    ('/get_time',get_time),
    ('/get_dict',get_dict),
    ('/get_user',get_user)
]

视图层

路由层对应函数
def
index(env): return 'index' def login(env): return "login" def error(env): return '404 error' def xxx(env): with open(r'templates/02 myxxx.html','r',encoding='utf-8') as f: return f.read() import datetime def get_time(env): current_time = datetime.datetime.now().strftime('%Y-%m-%d %X') # 如何将后端获取到的数据"传递"给html文件? with open(r'templates/03 mytime.html','r',encoding='utf-8') as f: data = f.read() # data就是一堆字符串 data = data.replace('dwadasdsadsadasdas',current_time) # 在后端将html页面处理好之后再返回给前端 return data jinjia2模板语法 from jinja2 import Template def get_dict(env): user_dic = {'username':'jason','age':18,'hobby':'read'} with open(r'templates/04 get_dict.html','r',encoding='utf-8') as f: data = f.read() tmp = Template(data) res = tmp.render(user=user_dic) # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict return res 数据库 import pymysql def get_user(env): # 去数据库中获取数据 传递给html页面 借助于模版语法 发送给浏览器 conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '', db='练习', charset = 'utf8', autocommit = True ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = 'select * from employe' affect_rows = cursor.execute(sql) data_list = cursor.fetchall() # [{},{},{}] print(data_list) # 将获取到的数据传递给html文件 with open(r'templates/05 get_data.html','r',encoding='utf-8') as f: data = f.read() tmp = Template(data) print(tmp) res = tmp.render(user_list=data_list) print(res) # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict return res if __name__ == '__main__': get_user(111)

框架请求流程