当前位置:首页 > 技术 > 正文内容

Web框架基础与实现

访客 技术 2026年8月6日 1
  1. Web框架的核心概念 ========== Web框架本质上是一个功能强大的Socket服务端,浏览器作为具有图形界面的Socket客户端。通过网络请求进行数据交互,可以将Web框架视为前端和数据库的全面整合。

  2. 手动构建简易Web框架 ============= 2.1 回顾 - HTTP协议


以下代码展示了一个基本的TCP服务器,但无法响应HTTP请求:

import socket

server = socket.socket()
server.bind(('127.0.0.1', 9000))
server.listen(5)

while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    print(data.decode('utf-8'))
    conn.send(b'hi, here is server')

原因:未遵循HTTP协议。

2.2 简易Web框架实现

以下是遵循HTTP协议的简易Web服务器:

import socket

server = socket.socket()
server.bind(('127.0.0.1', 9009))
server.listen(5)

while True:
    conn, addr = server.accept()
    data = conn.recv(1024).decode('utf-8')
    print(data)
    conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n')
    path = data.split()[1]
    if path == '/login':
        conn.send(b'Login page exists.')
    elif path == '/register':
        conn.send(b'Register page exists.')
    else:
        conn.send(b'Page not found.')
  1. 基于WSGI模块构建Web框架 ===================== 3.1 基础版
from wsgiref.simple_server import make_server

def app(env, start_response):
    start_response("200 OK", [('Content-Type', 'text/html')])
    return [b"Hello from server."]

if __name__ == "__main__":
    httpd = make_server('127.0.0.1', 9002, app)
    httpd.serve_forever()

3.2 完整版

from wsgiref.simple_server import make_server

def app(env, start_response):
    start_response("200 OK", [])
    path = env.get("PATH_INFO")
    if path == "/":
        return [b"Empty path."]
    elif path == "/login":
        return [b"Login exists."]
    else:
        return [b"404 error."]

if __name__ == "__main__":
    httpd = make_server('127.0.0.1', 9000, app)
    httpd.serve_forever()
  1. WSGI优化 ============ 4.1 问题分析

当网站路径增多时,代码会变得冗长且难以维护。

4.2 函数优化

将路径映射和功能封装为元组和函数:

from wsgiref.simple_server import make_server

def login():
    return "Login page."

def register():
    return "Register page."

def error():
    return "Error page."

url_patterns = (("/login", login), ("/register", register))

def app(env, start_response):
    start_response("200 OK", [])
    path = env.get("PATH_INFO")
    func = None
    for url, handler in url_patterns:
        if path == url:
            func = handler
            break
    res = func() if func else error()
    return [res.encode("utf-8")]

if __name__ == "__main__":
    httpd = make_server('127.0.0.1', 9000, app)
    httpd.serve_forever()

4.3 模块优化

将功能拆分为多个文件:

  • urls.py 存储路径映射。
  • views.py 编写业务逻辑。

4.4 HTML文件优化

创建templates文件夹存储HTML文件,避免代码混乱。

4.5 静态资源优化

创建static文件夹存储CSS、JS等静态资源。

  1. 动静结合的网页 ======== 5.1 动静网页的区别

静态网页内容固定,动态网页根据用户请求生成内容。

5.2 示例:显示当前时间

views.py中定义获取时间的函数,并在HTML中替换占位符。

5.3 示例:传递字典到页面

使用Jinja2模板引擎渲染HTML,支持后端代码语法操作数据。

  1. Jinja2模板引擎 =========== 6.1 操作字典

安装Jinja2并修改代码以支持字典操作:

from jinja2 import Template

def get_dict():
    info = {"name": "avril", "age": 25}
    with open("templates/get_dict.html", "r", encoding="utf-8") as f:
        template_content = f.read()
    template = Template(template_content)
    return template.render(info=info)

6.2 数据库访问

连接数据库并渲染结果到HTML页面。

  1. 框架请求流程 ========= 7.1 流程图

省略图片描述。

7.2 关键术语解释

  • 路由:路径配置。
  • 视图函数:处理业务逻辑的函数。
  • 路由层:urls.py
  • 视图层:views.py
  • 模板层:templates文件夹。
  • 静态资源层:static文件夹。
  1. Python主流Web框架 ================
  • Django
  • Flask
  • FastAPI
  • Pyramid
  • Tornado
  • Sanic
  • Aiohttp
标签: wsgiWeb框架

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。