首页 > 其他分享 >手动搭建web框架

手动搭建web框架

时间:2024-03-24 17:24:54浏览次数:15  
标签:web register return 手动 request server urls login 搭建

Web框架本质

  • web框架本质上就是一个socket服务端,但是它的功能非常强大
  • 用户的浏览器可以看作一个拥有可视化界面的socket客户端
  • 两者通过网络请求完成数据交互

手撸Web框架

【1】原始版本

  • web框架可以是自己写的一个简陋的socket服务端
import socket

server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n') # 这里要符合http响应体
    res = data.decode('utf-8').split(' ')[1]
    if res == '/index':
        conn.send(b'index oao')
    elif res == '/login':
        conn.send(b'login oao')
    else:
        conn.send(b'hello web')
    conn.close()
  • 缺陷
1.socket代码过于重复
2.针对http请求数据没有完善的处理方式,自己处理起来很麻烦

【2】基于wsgiref模块搭建web框架

模块封装功能

from wsgiref import simple_server


def run(request, response):
    """
    :param request: 请求相关的数据
    :param response: 响应相关的数据
    :return: 返回给客户端的展示数据
    """
    response('200 OK', [])  # 固定编写 无需掌握
    

    return [b'hello jason']


if __name__ == '__main__':
    server = simple_server.make_server('127.0.0.1', 8080, run)
    '''监听本机8080端口 一旦有请求访问 自动触发run方法的执行'''
    server.serve_forever()
# 模块封装了socket代码并将请求数据处理成诸多k:v键值对

路由对应响应

# run函数体中添加下列代码
current_path = request.get("PATH_INFO")
if current_path == '/login':
   return [b'hello login html']
elif current_path == '/register':
   return [b'hello register html']
return [b'404 error']

路由拆分流程

# 当有很多路由和响应的情况下不可能无限制编写if判断语句,应该设置对应关系并动态调用

def register(request):
    return 'register'


def login(request):
    return 'login'

def error(request):
    with open(r'templates/error.html', 'r', encoding='utf8') as f:
        return f.read()

urls = (
    ('/login',login),
    ('/register',register)
)

def run(request, response):
    func_name = None
    for url_tuple in urls:  
        if current_path == url_tuple[0]:
            # 先获取对应的函数名
            func_name = url_tuple[1]
            # 一旦匹配上了 后续的对应关系就无需在循环比对了
            break
    # for循环运行完毕之后 func_name也有可能是None
    if func_name:
        res = func_name(request)
    else:
        res = error(request)  # 顺手将request也传给函数 便于后续数据的获取
    return [res.encode('utf8')]

【3】根据功能的不同拆分成不同的文件

  • views.py
    • 存储路由和函数的对应关系
# 功能函数
def register(request):
    return 'register'


def login(request):
    return 'login'


def index(request):
    return 'index'


def error(request):
    with open(r'templates/error.html', 'r', encoding='utf8') as f:
        return f.read()
  • urls.py
    • 存储函数,路由列表
# 后缀匹配
urls = (
    ('/register', register),
    ('/login', login),
    ('/index', index),
)
  • server.py
    • 存储启动代码,以及函数功能分配代码
from wsgiref import simple_server
from urls import urls
from views import error


def run(request, response):
    response('200 OK', []) 
    current_path = request.get("PATH_INFO")
    func_name = None
    for url_tuple in urls:  # ('/register', register)
        if current_path == url_tuple[0]:
            func_name = url_tuple[1]
            break
    if func_name:
        res = func_name(request)
    else:
        res = error(request) 
    return [res.encode('utf8')]


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

总结

  • 拆分后好处在于要想新增一个功能,只需要在views.py中编写函数,urls.py添加对应关系即可

JinJa2模板语法

【1】模块安装

  • JinJa2是第三方模块,需要pip install JinJa2
  • 它支持将数据传输到html页面,并且提供类似于后端语言的语法,可以简单快速的处理数据

【2】动态展示当前时间

  • views.py
from jinja2 import Template
def get_time(env):
    with open('templates/show_time.html', 'r', encoding='utf8') as fp:
        data = fp.read()
    now_time = time.strftime('%Y-%m-%d %H:%M:%S')
    tmp = Template(data)
    res = tmp.render(now_time=now_time)
    return res
  • urls.py
from views import *

urls = [
    ('/time',get_time)
]
  • show_time.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{now_time}}</h1>
</body>
</html>

主要关键字

urls.py
    后缀与函数名对应关系
  ('/index',register)
      后缀专业名词称之为'路由'
        函数名专业名词称之为'视图函数'
        urls.py专业名词称之为'路由层'

views.py
    专门编写业务逻辑代码
      可以是函数 也可以是类
        函数专业名词称之为'视图函数'
        类专业名词称之为'视图类'
        views.py专业名词称之为'视图层'

templates文件夹
    专门存储html文件
      html文件专业名词称之为'模板文件'
        templates文件夹专业名词称之为'模板层'
 
static文件夹
    专门存储静态文件资源
      页面所需css文件、js文件、图片文件、第三方文件可统称为'静态资源'

标签:web,register,return,手动,request,server,urls,login,搭建
From: https://www.cnblogs.com/Hqqqq/p/18092681

相关文章

  • 简单几步为APP搭建移动直播功能——智密腾讯云直播组件简介
    随着5G移动网络技术的成熟,视频直播已经不再局限于WIFI 环境下。即使在户外,当前的4G和5G信号覆盖也足够支持用户观看直播,并在直播间进行留言、连线、点赞和赠送礼物。因此添加直播功能就是现在很多已上线的APP中比较广泛的需求。在目前的支持直播的技术提供商中,腾讯云已经有了比......
  • macbook(M1芯片)搭建php+nginx运行环境
    macbook(M1芯片)搭建php+nginx运行环境php安装phpbrewinstallphp//低版本php需要这样安装brewinstallshivammathur/php/[email protected]配置环境变量(低版本的php才需要)echo'exportPATH="/usr/local/opt/[email protected]/bin:$PATH"'>>~/.zshrcecho'exportPATH=&quo......
  • SQL Server高可用性——AlwaysOn搭建
    端口13513713944550221433要开(不管他防火墙开没开)!!!!!ip规划好!!!!hostname记得提前改好!!!一.搭建域(win2008只要选dns就行,win2012还要选AD域服务)安装服务如果不行,拷贝iso上去解压,选定C:\iso\sources\sxs路径即可1.开始菜单-->管理工具-->服务器管理器,添加角色2.下一步3.......
  • 牛逼!本地直接部署开源、离线、免费商用的大模型知识库!快速搭建个人和企业私有智能知识
    快速上手1.环境配置首先,确保你的机器安装了Python3.8-3.11(我们强烈推荐使用Python3.11)。$python--versionPython3.11.7接着,创建一个虚拟环境,并在虚拟环境内安装项目的依赖#拉取仓库$gitclonehttps://github.com/chatchat-space/Langchain-Chatchat.g......
  • JavaWeb学习笔记——第三天
    Ajax概述Ajax全称AsynchronousJavaScriptAndXML,异步的JavaScript和XML。作用数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用的校验等等。同......
  • 【webserver】 C++ 项目webserver面试八股总结(二)
    32.一次网页的访问从URL开始,说一下整个访问的过程客户端获取URL->DNS解析->TCP连接->发送HTTP请求->服务器处理请求->返回报文->浏览器解析渲染页面->TCP断开连接客户端:(应用层开始)获取URL,通过负责域名解析的域名服务获取网址的IP地址,根据HTTP协......
  • new ReactRefreshWebpackPlugin({ overlay: false, }), 作用是什么
    ReactRefreshWebpackPlugin是一个专门为React应用程序提供快速热更新(FastRefresh/HotReloading)的Webpack插件。当你的React组件代码发生变化时,它能够自动重新渲染受影响的组件,而不是刷新整个页面,从而显著提升开发效率。配置项中的overlay:false表示禁用错误提示覆......
  • MyTlias-员工信息管理系统(一)-整体框架的搭建
    文章目录1.工作准备1.1.新建项目1.2.准备数据库表1.3.准备数据实体2完成部门信息展示2.1properties2.2DAO层2.3Service层2.4Controller层本小节主要完成项目文件准备,以及第一个功能实现:部门信息展示.并使用PostMan/Apifox测试接口数据是否正常返......
  • Java Web项目—餐饮管理系统【last day】-Niginx前后端分离
    文章目录Nginx概述Nginx介绍Nginx下载和安装Nginx的目录结构启动和停止nginx.confNginx应用部署静态资源反向代理配置反向代理负载均衡配置负载均衡前后端分离开发Nginx概述Nginx介绍Nginx是一款轻量级的web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理......
  • Java Web项目—餐饮管理系统Day14-MySQL主从复制与读写分离
    文章目录读写分离的作用主从复制(Master-SlaveReplication)如何实现主从复制MySQL配置主库配置从库配置SpringBootsupport读写分离是指将数据库的读操作和写操作分离到不同的数据库服务器上,以提高数据库的性能和可用性。在高并发的场景下,读操作通常占据了大部分......