21.12 Python 实现网站服务器

news2024/11/27 4:18:13

Web服务器本质上是一个提供Web服务的应用程序,运行在服务器上,用于处理HTTP请求和响应。它接收来自客户端(通常是浏览器)的HTTP请求,根据请求的URL、参数等信息生成HTTP响应,并将响应返回给客户端,完成客户端的请求。Web服务器可以使用多种编程语言和技术实现,通过对套接字的处理并遵循HTML等浏览器兼容格式即可实现。

如果需要自行实现一个Web服务器则本质上就是需要完成套接字的处理,并在处理时增加遵循HTTP格式的头部数据即可,如下是一个简单的支持Web服务器的套接字程序,该程序运行后会在本机的80端口侦听,当用于通过浏览器访问时则会自动传输一段话。

import socket

def handle_request(client):
    buf = client.recv(1024)
    client.send(bytes("HTTP/1.1 200 OK\r\n\r\n","UTF-8"))
    client.send(bytes("<b>Hello lyshark</b>","UTF-8"))

if __name__ == "__main__":
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(("localhost",80))
    sock.listen(5)

    while True:
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()

运行上述代码片段,读者可自行打开浏览器并访问http://localhost:80端口,则此时会弹出一段问候语,说明我们的服务器已经可以被浏览器解析了。

当然上述代码还有很大的优化空间,首先要解决的问题是让页面具有动态渲染的功能,此处我们可以采用jinja2模板,该模板允许在Web应用程序中渲染HTML,其主要特点是可配置性高、快速、安全且易于使用,使用时读者需要自行执行pip install jinja2来安装此模板,至此我们就可以在Web服务器带啊吗中使用模板引擎进行输出。

如下代码片段则是一个使用了make_server类的服务器实现,在代码中我们定义了一个url_func列表用于存储路由规则,路由规则代表的是当有浏览器访问服务器时则自动使用特定规则内的特定函数处理这个规则,在代码中我们分别定义了两个路由函数,其中index()用于展示首页信息,而jinja()则用于展示模板渲染功能实现,至此读者需要在主目录下分别创建两个文件index.html代表网站主页,而jinja.html则代表模板渲染页面,我们以jinja.html为例创建如下代码;

<body>
<h1>{{name}}</h1>
<ul>
    {% for item in user_list %}
    <li>{{item}}</li>
    {% endfor %}
</ul>
</body> 

接着编写服务器程序,在jinja()路由函数内通过读取jinja.html文件并使用template.render()函数给特定的变量传入不同的参数,当页面渲染好以后,则通过return将该请求返回给RunServer函数,再由该函数return [response,]返回给被调用客户。

from wsgiref.simple_server import make_server
from jinja2 import Template

# /index/的路由函数
def index():
    with open("./index.html","r",encoding="utf-8")as fp:
        recv = fp.read()
    return recv.encode("utf-8")

# /jinja/的路由函数
def jinja():
    with open("./jinja.html","r",encoding="utf-8")as fp:
        data = fp.read()
        template = Template(data)
        recv = template.render(name='John Doe', user_list=['lyshark', 'wang'])
        return recv.encode("utf-8")

# 定义路由规则
url_func = [
    ('/index/',index),('/jinja/',jinja)]

def RunServer(environ,star_response):
    star_response("200 OK",[('Content-Type','text/html;charset=urf-8')])
    url = environ["PATH_INFO"]
    rAddr = environ["REMOTE_ADDR"]
    rHost = environ["HTTP_HOST"]
    print("[+] 根域名: {} 路径: {} 目标IP: {}".format(rHost,url,rAddr))
    func = None
    for i in url_func:
        if i[0] == url:
            func = i[1]
            break
    if func:
        response = func()
    else:
        response = b"** 404 not found **"
    return [response,]

if __name__ == "__main__":
    httpd = make_server("0.0.0.0",80,RunServer)
    print("[*] 服务已启动 0.0.0.0:80")
    httpd.serve_forever()

运行上述代码,读者可以打开浏览器并访问localhost/jinja/路径,此时即可看到经过选然后的HTML页面,如下图所示;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1146613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海康工业相机的使用(草稿)

下载&#xff1a; 海康机器人-机器视觉-下载中心 (hikrobotics.com) Windows版本测试&#xff1a; 机器视觉工业相机客户端MVS V4.2.1&#xff08;Windows&#xff09; Ubuntu版本开发&#xff1a; 机器视觉工业相机客户端MVS V2.1.2 (Linux) 机器视觉工业相机SDK V4.1.2版…

一个脚本快速查看网站用到的技术

shigen坚持日更的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考&#xff0c;不断沉淀和成长。 今天给大家带来的技巧是&#xff1a;一个脚本快速的查看网站运用的技术和域名备案信息。 …

NVIDIA cuda安装时全部失败

查看了很多博客&#xff0c;有写的非常详细清楚的博客&#xff0c;csdn上真的是一个很好的学习平台&#xff0c;我在学习过程中遇到的好多bug&#xff0c;都能在这上面找到解决方法&#xff0c;就是一个老师的存在。 我安装NVIDIA cuda安装时失败了N次&#xff0c;数不清了&am…

san.js源码解读之模版解析(parseTemplate)篇——readAccessor函数

相关文章&#xff1a;san.js源码解读之模版解析(parseTemplate)篇——readIdent函数 一、源码分析 /*** 读取访问表达式** param {Walker} walker 源码读取对象* return {Object}*/ function readAccessor(walker) {var firstSeg readIdent(walker);switch (firstSeg) { // …

【论文复现:Active Learning via Local Structure Recontruction】

论文复现&#xff1a;Active Learning via Local Structure Reconstruction 目标函数优化过程公式(16)推到python代码链接如下&#xff1a; 目标函数 优化过程 公式(16)推到 原文中省略了上述推导过程 在这里我们自己推导一下&#xff0c;只要有一点数学基础就很简单&#xff…

【计算机网络】数据链路层——以太网

文章目录 前言什么是以太网以太网帧格式6位目的地址和源地址2位类型数据长度CRC 校验和 数据在数据链路层是如何转发的 前言 前面我们学习了关于应用层——自定义协议、传输层——UDP、TCP协议、网络层——IP协议&#xff0c;今天我将为大家分享关于数据链路层——以太网方面的…

基于蝙蝠算法的无人机航迹规划-附代码

基于蝙蝠算法的无人机航迹规划 文章目录 基于蝙蝠算法的无人机航迹规划1.蝙蝠搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用蝙蝠算法来优化无人机航迹规划。 1.蝙蝠搜索算法 …

MAYA教程之灯光与渲染

灯光介绍 MAYA中有六种光源环境光&#xff1a;模拟环境中的光源&#xff0c;光线是四面八方的平行光&#xff1a;模拟太阳光点光源&#xff1a;模拟蜡烛等光源聚光灯&#xff1a;模拟夜场那种光源区域光&#xff1a;模拟窗户照进室内的光源体积光&#xff1a;模拟激光在MAYA的…

基于Java的流浪动物救助管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

Generalised Zero-shot Learning with Multi-modal Embedding Spaces

分类器被 τ \tau τ校准 辅助信息 作者未提供代码

震惊!什么是测试用例?为什么要有测试用例?测试用例举例!测试用例竟然...被如此解释!

1、什么是测试用例 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素。 生活举例&#xff1a; 大家有没有在牛客上刷题 牛客给大家提供了一套可以编…

【数据结构】排序算法总结

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 总结 1. 归并排序2. 排序算法复杂度…

C/C++跨平台构建工具CMake-----灵活添加库并实现开发和生产环境的分离

目录 1.概述2.创建项目3 配置运行项目3.1 编写开平方根示例代码3.2 编写CMake构建脚本 4.使用子模块实现求平方根的功能4.1 在子模块中实现两种求平方根的方法4.2 构建Mathfunctions子模块4.3 在根目录引用子模块的功能4.3.1 编写构建脚本4.3.2 编写C代码使用MathFunctions库中…

CNCC2023

中国工程院院士&#xff0c;之江实验室主任、阿里云创始人王坚&#xff1a;计算驱动的科学发现和科技创新。 国际计算机学会主席雅尼斯约阿尼迪斯(ACM President Yannis Ioannidis)。 电气和电子工程师协会计算机协会主席妮塔帕特尔(IEEE CS President Nita Patel)。 2022 I…

Python武器库开发-高级特性篇(九)

高级特性篇(九) 切片 在Python中&#xff0c;切片(slice)是对序列型对象(如list, string, tuple)的一种高级索引方法。普通索引只取出序列中一个下标对应的元素&#xff0c;而切片取出序列中一个范围对应的元素&#xff0c;这里的范围不是狭义上的连续片段。 要创建切片&…

SpringMVC系列-6 异常处理器

背景 本文作为 SpringMVC系列 的第六篇&#xff0c;介绍SpringMVC的异常处理器。内容包括异常处理器的使用方式、实现原理和内置异常处理器的装配过程。 1.使用方式 自定义异常类&#xff0c;用于异常处理器&#xff1a; public class ClientException extends RuntimeExce…

宝塔安装MySQL数据库,并内网穿透实现公网远程访问

宝塔安装MySQL数据库&#xff0c;并内网穿透实现公网远程访问 文章目录 宝塔安装MySQL数据库&#xff0c;并内网穿透实现公网远程访问前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网…

操作系统——页表、快表 + 地址转化过程(王道视频p47、p48、p49)

1.页表的基本概念&#xff1a; &#xff08;1&#xff09;part1: &#xff08;2&#xff09;part2: (备注&#xff1a;默认——逻辑页 和 物理页 的页大小是相同的&#xff01;&#xff01;&#xff01;) 2.在没有 快表的case下&#xff0c;进行逻辑地址 、 物理地址转换的流…

如何使用Codesys编程

在实际项目中&#xff0c;使用了两套TLC6伺服系统&#xff0c;不仅是因为TLC6具有电子凸轮功能&#xff0c;而且TLC6伺服驱动器内置PLC&#xff0c;使实现系统功能的编程更简单方便&#xff0c;且由于是内部编程&#xff0c;使系统响应更迅速。 TLC6内置PLC的编程环境为符合IEC…

C语言--输出格式控制(printf函数)

格式输出函数printf printf(格式控制&#xff0c;输出表列) 基本用法 格式字符功能例子d输出一个有符号的十进制整数printf("%d %d",12,-56);c输出一个字符 char ch a; printf("%c",ch); s输出一个字符串printf("%s","oh my god&…