首页 > 其他分享 >手写web框架

手写web框架

时间:2024-01-25 10:35:42浏览次数:30  
标签:web return 框架 res 视图 dict user env 手写

自定义web框架

框架功能

"""
功能视图

用户访问指定url 获取数据库数据,并返回到页面


"""




image-20231109171956354

wsgiref模块

#01 文件结构
"""
urls.py						路由与视图函数对应关系
views.py					视图函数(后端业务逻辑)
templates文件夹		专门用来存储html文件
"""
# 按照功能的不同拆分之后 后续添加功能只需要在urls.py书写对应关系然后取views.py书写业务逻辑即可


服务端

from wsgiref.simple_server import make_server

from urls import urls
from views import *
def run(env, response):
    """
    :param env: 请求数据
    :param response: 响应数据
    :return:
    """
    response('200 OK', [])
    # 获取地址 path
    curr_path = env.get('PATH_INFO')
    func = None
    # 从视图里查找对应关系 返回
    for uri in urls:
        if curr_path == uri[0]:
            print(curr_path,uri)
            func = uri[1]
            break
    # 判断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)
    # 启动函数
    server.serve_forever()

    

路由 urls.py


"""
路由于视图关系

"""

from views import *

urls = [
    ('/index',index),
    ('/login',login),
    ('/error',error),
    ('/xxx',file_tmp),
    ('/get_user',get_user)

]

视图函数 后端处理views.py


"""
视图函数
"""


def index(env):
    return "index hi"


def login(env):
    return "login"


def error(env):
    return "404 error"

# 读取文件
def file_tmp(env):
    with open(r'templates/xxx.html', 'r', encoding='utf-8') as f:
        return f.read()

# 模版语法 通过字典给前端传值
from jinja2 import Template
def get_user(env):
    # 定义字典
    user_dic = {'username': 'futongxue', 'age': 18}
    with open(r'templates/02-get_user.html', 'r', encoding='utf-8') as f:
        data = f.read()
    # 生产模版数据
    tmp = Template(data)
    res = tmp.render(user=user_dic)
    return res

import pymysql
# 数据库交互
def getsql(env):
    # 数据库里获取数据
    conn = pymysql.connect(
        user='root',
        host='192.168.5.9',
        password='0x00NF2001',
        port=3306,
        database='note',
        charset='utf8',
        autocommit=True
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = 'SELECT * FROM `user`;'
    affect_rows = cursor.execute(sql)
    data_dic = cursor.fetchall()
    # 拿取数据 传给前端页面
    with open(r'templates/02-usersql.html', 'r', encoding='utf-8') as f:
        data = f.read()
    # 生产模版数据
    tmp = Template(data)
    res = tmp.render(user_list=data_dic)
    return res


模版语法之Jinja2模块

pip3 install jinja2
"""模版语法是在后端起作用的"""

# 模版语法(非常贴近python语法)
{{ user }}
{{ user.get('username')}}
{{ user.age }}
{{ user['hobby'] }}


{% for user_dict in user_list %}
                        <tr>
                            <td>{{ user_dict.id}}</td>
                            <td>{{ user_dict.username}}</td>
                            <td>{{ user_dict.password}}</td>
                            <td>{{ user_dict.hobby}}</td>
                        </tr>
{% endfor%}

templates 页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h1 class="text-center">用户数据</h1>
            <table class="table table-hover table-striped">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>username</th>
                        <th>password</th>
                        <th>hobby</th>
                    </tr>
                </thead>
                <tbody>
<!--                    [{},{},{},{},{}]-->
                    {% for user_dict in user_list %}
                        <tr>
                            <td>{{ user_dict.id}}</td>
                            <td>{{ user_dict.username}}</td>
                            <td>{{ user_dict.password}}</td>
                            <td>{{ user_dict.hobby}}</td>
                        </tr>
                    {% endfor%}
                </tbody>
            </table>
        </div>
    </div>
</div>

</body>
</html>

image-20231109170606862

标签:web,return,框架,res,视图,dict,user,env,手写
From: https://www.cnblogs.com/saas-open/p/17986479

相关文章

  • gin框架路由讲解
     点击关注......
  • Django学习第一天-Flask_Web前端HTML部分
    目录1.day11.快速开发网站2.浏览器能识别的标签2.1编码2.2title2.3标题2.4div和span2.5超链接2.6图片小结2.7列表2.8表格2.9input系列(7个)2.10下拉框2.11多行文本案例:用户注册2.12网络请求目的:开发一个平台(网站)-前端开发:HTML、CSS、JavaScript-Web框架:接收并处理请求......
  • WebGL之缩放(基础)
    一,index.html<body> <scriptid="vertex-shader-2d"type="notjs"> attributevec2a_position; attributevec2a_texCoord; uniformvec2u_resolution; uniformvec2u_translation; uniformvec2u_rotation;//旋转全局变量 unif......
  • webstorm报错:ESLint: TypeError: this.libOptions.parse is not a function
     解决办法:把 {**/*,*}.{js,ts,jsx,tsx,html,vue}换成{**/*,*}.(js,ts,jsx,tsx,html,vue) 原文:https://stackoverflow.com/questions/73509984/eslint-typeerror-this-liboptions-parse-is-not-a-functionMyfriends,ifyouareusing Webstorm orany Jetbrains p......
  • web建站(v4+v6测试80端口)
     1、放通80端口新建一个入站规则  一直下一步直到完成  2、打开web服务  3、iis建站 右键网站 点添加网站   例如下图 启动就行  4、测试用浏览器先本地验证 v4地址验证  使用v6地址验证 ......
  • 【小记】MSMF 框架开发 UVC 摄像头如何正确设置 MF_MT_SUBTYPE
    简单说一下:IMFSourceReader有两个可以获取 IMFMediaType对象的接口,分别是 GetNativeMediaType与 GetCurrentMediaType。初始化时调用 GetCurrentMediaType获得的IMFMediaType对象(此时为硬件默认情况下自动选择的对象)再进行修改是不能用于SetCurrentMediaType的,即......
  • jax框架为例:求hession矩阵时前后向模式的自动求导的性能差别
    注意:本文相关基础知识不介绍。给出代码:fromjaximportjacfwd,jacrevimportjax.numpyasjnpdefhessian_1(f):returnjacfwd(jacrev(f))defhessian_2(f):returnjacfwd(jacfwd(f))defhessian_3(f):returnjacrev(jacfwd(f))defhessian_4(f):......
  • 如何让你的.NET WebAPI程序支持HTTP3?
    下面我将总结构建Http3的经验,以TokenGateway的项目为例,请注意使用Http3之前你需要知道它的限制,WindowsWindows11版本22000或更高版本/WindowsServer2022。TLS1.3或更高版本的连接。Linux已安装libmsquic包。实现讲解首先我们需要拉取我们的代码gitcloneh......
  • idea中启动web、jsp项目
    1.idea打开项目选择要打开的项目的根目录2.项目配置配置jdkmodules配置添加web添加依赖删除爆红的依赖添加依赖目录或者jar配置web.xml配置lib如果没有生成则添加项目所需依赖facets配置和web配置一样配置artifacts3.配置tomcat......
  • 用Python实现高效数据记录!Web自动化技术助你告别重复劳动!
    测试管理班是专门面向测试与质量管理人员的一门课程,通过提升从业人员的团队管理、项目管理、绩效管理、沟通管理等方面的能力,使测试管理人员可以更好的带领团队、项目以及公司获得更快的成长。提供1v1私教指导,BAT级别的测试管理大咖量身打造职业规划。简介关键数据记录是We......