python中遵循WSGI协议的HTTP服务器

Python网络编程 10.1 HTTP服务器:WSGI模式 前面我们已经学习了编写基于TCP的Web服务器时使用的一些基本套接字和并发模式。HTTP协议的广为流行使得许多现成的解决方案应运而生,这些解决方案实现了我们可能需要的所有主要的服务器模式。因此,在使用HTTP时,我们几乎不太可能会编写任何底层的代码。 本章将着眼于服务器架构和部署,介绍编写服务器代码时需要解决的问题。无论是向客户端返回文档还是返回面向程序员的APi,这些问题都不可避免。 1.W 阅读详情

一、WSGI协议

WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。
WSGI协议其实是定义了一种server与application解耦的规范,即可以有多个实现WSGI server的服务器,也可以有多个实现WSGI application的框架,那么就可以选择任意的server和application组合实现自己的web应用。

1、服务器代码 web_server.py

import sys
from socket import *
import re
import multiprocessing



class WSGI_Http(object):
    """遵循WSGI协议的http服务器"""


    def __init__(self, port, static_path, function_name):
        """服务器的初始化"""

        # 创建套接字
        self.tcp_server = socket(AF_INET, SOCK_STREAM)
        # 端口重复使用
        self.tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

        # 绑定(bind)
        self.tcp_server.bind(("", port))

        # 监听(listen)
        self.tcp_server.listen(128)

        # 用实例属性来存储 static的路径信息 和 模块中application函数的引用
        self.static = static_path
        self.application = function_name


    def client_request(self, new):
        """浏览器的请求"""

        # 将浏览器的请求转换成列表
        request_data = new.recv(1024).decode("utf-8").splitlines()
        print(request_data)
        print("------------------------请求信息------------------------------")

        # 根据浏览器请求的路径响应对应的页面
        rul = re.match(r"[^/]+(/[^ ]*)", request_data[0])  # [^/]:从左往右取,不是/都不取。  +:必须有/。  (/[^ ]*):从/开始取到空格
        if rul:
            file_name = rul.group(1)
            if file_name == "/":    # 如果请求没有指定要访问的页面,默认是/(/默认访问的就是主页)
                file_name = "/index.html"

            return file_name


    def static_page(self,new , file_name):
        """静态页面处理"""

        try:
            f = open(self.static + file_name, "rb")
        except:
            response_header = "HTTP/1.1 404 NOT FOUND \r\n"
            response_header += "\r\n"
            response_header += "file not found"
            new.send(response_header.encode("utf-8"))
        else:
            response_body = f.read()
            f.close()

            # header:响应的是一个头部信息
            response_header = "HTTP/1.1 200 OK \r\n"
            response_header += "\r\n"

            # 将header和body响应给浏览器
            response = response_header.encode("utf-8") + response_body
            new.send(response)


    def dynamic_page(self,new ,file_name):
        """动态页面处理"""

        # 定义一个空字典来存放用户请求
        environ = dict()
        environ["PATH_NAME"] = file_name

        # (引用)调用框架中的application()函数,把 请求 和set_header()这个方法作为实参传递给application()函数
        response_body = self.application(environ, self.set_header)

        # 此时set_header()中的第一个形参(status_number)接收的是框架中传递过来的状态码
        response_header = "HTTP/1.1 %s\r\n"%self.status_number

        # 通过for  in  遍历set_header()中第二个形参(descirbe)拿到框架中传递过来的描述信息
        for demo in self.descirbe:

            response_header += "%s:%s\r\n"%(demo[0],demo[1])

        response_header += "\r\n"

        # 拼接响应头和响应体
        response = response_header + response_body

        # 响应给浏览器
        new.send(response.encode("utf-8"))


    def set_header(self, status_number, describe):  # status_number:接收状态码   decirbe:接收描述信息
        """存储框架传递过来的实参"""

        self.status_number = status_number
        self.descirbe = describe
        self.descirbe += [("server_version","ChuangXin 3.0")]


    def server_response(self, new, file_name):
        """服务器的响应:给浏览器的http格式的数据(header和body)"""

        # 如果请求的页面不是以.py结尾的(用字符串的endswith()方法获得后缀)
        if not file_name.endswith(".py"):

            # 不是以.py结尾的页面也就是执行静态页面,调用static_page()这个方法
            self.static_page(new, file_name)

        else:

            # 是以.py结尾的页面也就是执行动态页面
            self.dynamic_page(new, file_name)


    def request_response(self, new):
        """浏览器的请求和服务器的响应"""

        # 调用请求的函数
        file_name = self.client_request(new)

        # 调用响应的函数
        self.server_response(new, file_name)

        # 关闭客户端套接字
        new.close()


    def run(self):
        """"""

        while True:

            # 等待客户端的连接(accept)
            new, other = self.tcp_server.accept()

            # 创建进程
            p1 = multiprocessing.Process(target=self.request_response, args=(new,))

            # 开启进程
            p1.start()

            # 关闭主进程套接字,因为子进程执行前会复制一份主进程的代码,用fd:文件的描述符
            new.close()

        # 关闭服务器套接字
        tcp_server.close()


def control():
    """让服务器与框架之间降低耦合程度"""

    # sys.argv:输入的是一个列表  如['python3','web_server.py','7896','mini_frame','application']
    # 长度判断
    if len(sys.argv) == 3:

        # 端口判断
        try:
            port = int(sys.argv[1]) # 拿到输入的端口,如果端口占用,抛出异常
            frame_name = (sys.argv[2]) # 拿到的是框架名与框架中的函数名
        except Exception as e:
            print("端口输入有误!")
            return "0"    

    else:
        print("请按以下格式书写")
        print("python3 服务器名称.py 端口号 框架名称:application")
        return "0"

    # 用正则表达式拿到sys.argv返回的框架名与函数名
    rel = re.match(r"([^:]+):(.*)",frame_name)
    if rel:

        frame_name = rel.group(1)
        function_name = rel.group(2)

    else:

        print("请按以下格式书写")
        print("python3 服务器名称.py 端口号 框架名称:application")
        return "0"

    # 打开服务器的配置文件,用eval函数按照键值对格式读取路径信息
    with open("./web_server.conf") as f:
        conf_info = eval(f.read())

    # 添加配置文件里面的键,也就是路径    
    sys.path.append(conf_info["dynamic_path"])

    # 用内置方法__import__()导入框架这个模块,它返回的是一个对象,标记导入了这个模块
    in_frame_name = __import__(frame_name)

    #用point_function指向了/dynamic/mini_frame/application这个函数 
    point_function = getattr(in_frame_name,function_name)

    # 将多个值返回给函数的调用者
    return port,conf_info["static_path"],point_function


def main():


    # 调用control函数
    if control() in ["0"]:
        return

    port,static_path,point_function = control()

    # 实例化对象
    wsgi_http = WSGI_Http(port, static_path, point_function)

    #对象调用方法开启服务器
    wsgi_http.run()



if __name__ == '__main__':

    main()

2、框架代码 mini_frame.py


import re
from pymysql import *


URL_RESPONSE = dict()


def connect_join(sql):
    """初始化connect连接对象"""

    conn = connect(host="localhost",port=3306,user="root",password="root",database="jing_dong",charset="utf8")
    cursor = conn.cursor()
    cursor.execute(sql)
    cursor_content = cursor.fetchall()
    cursor.close()
    conn.close()
    return cursor_content


# 定义一个装饰器,把请求(flie_name)当做key,把需要装饰的函数当做value,二者进行判断
def set_url(url):   # url:请求的地址

    def set_func(func):   # func:被装饰函数的引用

        URL_RESPONSE[url] = func       # 把请求的地址(url)当做key,把需要装饰的函数当做value,然后存入字典

        def call_func(*args,**kwargs):

            return func(*args,**kwargs)

        return call_func

    return set_func


@set_url("/index.html")
def index():

    with open("./templates/index.html") as f:

        content = f.read()

    sql1 = "select * from goods_cates"
    goods_cates = connect_join(sql1)

    sql2 = "select * from goods_brands"
    goods_brands = connect_join(sql2)

    sql3 = "select id,name,price from goods"
    goods = connect_join(sql3)

    html1 = ""
    for line_info in goods_cates:

        html1 += "<tr><td>%s</td><td>%s</td></tr>" %(line_info[0],line_info[1])
    
    content = re.sub(r"\{%content1%\}",html1,content)

    html2 = ""
    for line_info in goods_brands:

        html2 += "<tr><td>%s</td><td>%s</td></tr>" %(line_info[0],line_info[1])
    
    content = re.sub(r"\{%content2%\}",html2,content)

    a = """
        <tr><td>%s</td><td>%s</td><td>%s</td><td><input type="button" value="添加" /></td></tr>
    """
    html3 = ""
    for line_info in goods:

        html3 += a%(line_info[0],line_info[1],line_info[2])
    
    content = re.sub(r"\{%content3%\}",html3,content)

    return content


@set_url("/shopping.html")
def shopping():

    with open("./templates/shopping.html") as f:

        content= f.read()

    conn = connect(host="localhost",port=3306,user="root",password="root",database="jing_dong",charset="utf8")
    cursor = conn.cursor()
    sql = "select g.id,c.name,g.name,d.name,g.price from goods as g inner join goods_cates as c on g.cate_id=c.id inner join goods_brands as d on g.brand_id=d.id order by g.id"
    cursor.execute(sql)
    shop = cursor.fetchall()
    cursor.close()
    conn.close()

    tr_temp = """
        <tr>
        <td>%s</td>
        <td>%s</td>
        <td>%s</td>
        <td>%s</td>
        <td>%s</td>
        <td>
        <input type="submit" value="修改" id="change">
        </td>
        <td>
        <input type="submit" value="删除" id="delete">
        </td>
        </tr>
    """

    html = ""

    for line_info in shop:

        html += tr_temp %(line_info[0],line_info[1],line_info[2],line_info[3],line_info[4])    

    content = re.sub(r"\{%content%\}",html,content)

    return content

@set_url("/zcjm.html")
def zcjm():

    with open("./templates/zcjm.html") as f:

        return f.read()

@set_url("/dljm.html")
def dljm():

    with open("./templates/dljm.html") as f:

        return f.read()

def application(environ,set_header):

    # 此时的save_header()就是调用了服务器里面的set_header(status_number, describe)方法,把'200 OK'作为第一个参数传递过去,
    # 把[('Content-Type','text/html;charset=utf-8')]作为第二个参数传递过去,传递过去之后通过for  in 遍历拿到请求头信息,

    set_header('200 OK',[('Content-Type','text/html;charset=utf-8')])

    file_name = environ['PATH_NAME']    # 服务器中以"PATH_NAME"为key,把请求内容当做value存放到字典中,此时,通过字典的key("PATH_NAME)来获取value(file_name)

    try:
        key = URL_RESPONSE[file_name]   # 把请求当做key在字典中寻找对应的key
        return key()
    except Exception as rel:

        return "发生了异常具体如下:%s"%str(rel)





3、服务器配置文件 web_server.conf

{
"static_path":"./static",
"dynamic_path":"./dynamic"
}

4、shell脚本 run.sh

python3 web_server.py 7896 mini_frame:application

整体结构图
在这里插入图片描述

Realtek RTD1319D芯片解析:H.266与AV1双解码的机顶盒SoC 视频编解码技术是数字媒体传输的核心,H.266/VVC作为新一代标准,相比H.265提升50%压缩效率,显著降低带宽需求。其实现原理依赖于专用硬件解码器和并行处理架构,在超高清视频传输领域具有重要价值。Realtek RTD1319D作为首款商用H.266处理器,采用异构计算设计,集成四核ARM CPU和独立视频处理单元,同时支持AV1解码,兼顾市场兼容性。该SoC特别适合4K机顶盒、数字标牌等应用场景,其HDMI 2.1a接口和DVB解调器为超高清内容传输提供完整解决方案。开发时需注意散热设计和内存配置优 阅读详情

相关推荐

YOLOv8实例分割实战:从LabelMe标注到模型训练全流程(附完整代码)

本文详细介绍了YOLOv8实例分割的完整实战流程,涵盖从使用LabelMe进行数据标注、格式转换,到构建数据集、配置参数并完成模型训练的全过程。文章提供了详尽的代码示例和常见问题解决方案,旨在帮助开发者高效掌握YOLOv8实例分割技术,快速应用于实际项目。

java5的博客 816

协议:WSGI,uWSGI,Nginx,CGI协议简介

当咱们部署完一个应用程序,浏览网页时具体的过程是怎样的呢?首先咱们得有一个 Web 服务器来处理 HTTP 协议的内容,Web 服务器得到客户端的请求,交给应用程序,应用程序处理完,返回给 Web 服务器,这时 Web 服务器再返回给客户端。Web 服务器与应用程序之间显然要进行交互,这时就出现了不少 Web 服务器与应用程序之间交互的规范,最先出现的是 CGI,后来又出现了改进 CGI 性能的FasgCGI,Java 专用的 Servlet 规范,Python 专用的 WSGI 规范等等。

GIS摆渡人 1426

告别偏色!手把手教你用i1Profiler 3.5为喷墨打印机制作专属ICC曲线(附D50/D65光源选择指南)

本文详细介绍了如何使用i1Profiler 3.5为喷墨打印机制作专属ICC曲线,解决设备偏色问题。从色彩管理基础、软件配置到色块打印与测量实战技巧,逐步指导用户完成曲线制作,并提供了D50/D65光源选择指南,确保色彩还原精准。适合摄影师和设计师提升打印质量。

weixin_30613343的博客 1万+

HTTP和wsgi基本介绍

一.HTTP 1.结构图 如图,HTTP的基本结构解释这样的-----客户端发送一个Request请求到服务端,服务端在返回一个Response回应给客户端。 客户端就是我们平常所用的浏览器了,如baidu,google,firefox等等都是客户端,而服务端一般是一些比较大的服务器了。 2.Request和Response

zeroist的专栏 1855

命令行驱动视频剪辑:cutcli与AI自动化工作流实战

在视频内容创作领域,自动化与批量化处理是提升生产效率的关键。传统图形界面工具在应对重复性任务时往往效率低下,而通过命令行接口(CLI)驱动视频生成,则能实现流程的程序化控制。其技术原理在于将视频结构抽象为可编程的指令序列,通过解析命令生成标准化的工程文件。这种模式的核心价值在于将视频制作从手动操作转变为代码驱动,特别适合与AI编程助手集成,实现自然语言到视频草稿的自动转换。应用场景广泛覆盖社交媒体内容批量生产、教育视频自动化生成、数据可视化视频组装等领域。本文以cutcli工具为例,深入解析如何通过命令行与

weixin_42520239的博客 578

深入Android构建系统:一次修改ro.vendor.build.fingerprint失败的排查与解决记录

本文深入探讨了Android构建系统中修改ro.vendor.build.fingerprint的完整解决方案。通过分析vendor分区的特殊地位和构建指纹的生成路径,提供了三种实战修改方法,并揭示了指纹修改可能遇到的陷阱与对策,帮助开发者彻底解决这一常见问题。

weixin_30621711的博客 144

Python WSGI HTTP Server - Gunicorn

也称为“Green Unicorn”,是一个Python WSGI HTTP Server,用于运行Python Web应用程序。WSGI(Web Server Gateway Interface)是Python应用程序和Web服务器之间的一个接口,允许应用程序和服务器进行交互。Gunicorn常常与Django、Flask等Web框架一起使用,但它可以与任何WSGI兼容的应用程序一起工作。

青衫客36的博客 992

基于MATLAB的PDT DMR物理层仿真

PDT DMR物理层仿真的目标是评估系统的误码率(Bit Error Rate,BER),以及验证和优化各种调制方案、编码方案和信道模型。下面将介绍如何进行PDT DMR物理层的仿真,并提供相应的MATLAB源代码。通过上述步骤,我们可以进行基于MATLAB的PDT DMR物理层仿真,并评估系统的性能。根据实际需求,我们可以修改仿真参数和添加更复杂的信道模型,以更全面地评估系统性能。最后,我们可以将仿真结果进行可视化和分析。首先,我们需要设置仿真的参数,包括调制方案、编码方案、信道模型和信噪比等。

TechPulseZ的博客 459

HTTP服务器搭建WSGI

在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP,所以: HTML是一种用来定义网页的文本,会HTML,就可以编写网页; HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。

过期的秋刀鱼 776

抖音小程序:解决获取手机号报错 getPhoneNumber:fail auth deny,登录注册时需要获取用户手机号,getPhoneNumber一直提示错误(Uniapp抖音小程序报错也能解决)

抖音字节小程序获取手机号报错getPhoneNumber:fail auth deny,抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth ,抖音小程序获取手机号始终返回拒绝,抖音小程序获取手机号,已经过了试运营期但依旧报错如何解决,调用 tt.getPhoneNumber 接口报错,登录注册时需要获取用户手机号,getPhoneNumber一直提示getPhoneNumber:fail auth deny,此能力仅支持小程序通过试运营期后可用,默认获取权限,无需申请;unia

✅ 精选推荐文章 4305

打破RK3588 GPIO中断响应延迟的枷锁,开启高效编程

本文针对RK3588芯片在智能安防和工业自动化应用中出现的GPIO中断响应延迟问题展开深入分析。通过硬件原理剖析,发现延迟主要源于中断控制器优先级设置、线路干扰等硬件因素,以及中断处理函数复杂、内核调度延迟等软件问题。提出硬件优化方案包括合理布局布线、电源稳定设计,软件层面则通过精准配置设备树、精简中断处理函数、利用工作队列等内核机制进行优化。测试结果显示,优化后中断响应延迟从50-80ms降至10-20ms,高负载下也能稳定在50ms以内。文章最后展望了AI技术在中断调度中的潜在应用价值。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 364

用Python写一个简易的http服务器,初步支持WSGI协议

Python这匹黑马在最近几年可谓异军突起,借着人工智能的东风,不仅霸占人工智能,就连web和大数据都不放过。作web开发,http协议是必须遵守的,想要做动态页面,就需要用到模板或者框架,所以又得遵守WSGI协议(小声bb,我一个都不想遵守,但谁让咱不如别人呢),下面咱就来写个http服务器,去瞅瞅那啥啥啥协议长啥样,等有朝一日,咱说不定也能制定个协议(/斜眼笑) 首先咱来说说啥是http服务器...

qq_43695313的博客 801

手把手教你RK3568 MIPI屏驱动适配,纯干货!

RK3568 作为一款高性能的多媒体处理器,在嵌入式领域中备受瞩目。它采用了先进的 22nm 制程工艺,搭载四核 Cortex-A55 处理器,这种架构为芯片提供了高效的功耗比,使其在运行各种复杂任务时,既能保证性能,又能有效控制功耗。在实际应用中,无论是多任务处理还是运行大型应用程序,RK3568 都能凭借其四核 Cortex-A55 处理器,实现流畅的操作体验,满足智能设备对高性能和低功耗的需求。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4071

python web开发 网络编程 HTTP协议、Web服务器、WSGI接口

文章目录1. HTTP协议2. Web服务器3. 静态服务器创建 web_server.py4. WSGI 接口4.1 CGI 通用网关接口4.2 WSGI4.3 定义 WSGI 接口4.4 运行 WSGI 服务 learning from 《python web开发从入门到精通》 1. HTTP协议 应用层最主要的协议:HTTP协议(HyperText Transfer Protocol 超文本传输协议) 用户访问网站时,用户浏览器是客户端(向服务器发请求),网站被称为服务器(收到请求,处理后的响应传给

Michael是个半路程序员 1003

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

服务器采购框架合同协议书范本,手写一个满足WSGI协议的Server

在做Web开发时,一个很重要的概念就是服务端和应用程序之间的沟通协议,比如java中的servlet,由于servlet的存在,使得用java开发的web程序既可以跑在tomcat上,也可以是jetty。反之亦然。而在python中,对应的协议也就是WSGI协议,本文的目标就是实现一个可以支持python主流框架的web服务器,也帮助自己加强对WSGI协议的理解。实验环境:python3.5一个简...

weixin_30581253的博客 480

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WSGI,uWSGI和uwsgi区别详解

一、WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。 WSGI 的官方定义是,the Python Web Server Gateway Interface。从名字就可以看出...

钟灵毓秀的博客 7066

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WSGI & uwsgi & wWSGI 深入介绍 及区别

介绍WSGI WSGI是一种WEB服务器网关接口。 是一个Web服务器(如nginx)与应用服务器(如uWSGI)通信的一种规范(协议)。 在生产环境中使用WSGI作为python web的服务器。Python Web服务器网关接口,是Python应用程序或框架和Web服务器之间的一种接口,被广泛接受。WSGI没有官方的实现, 因为WSGI更像一个协议,只要遵照这些协议,WSGI应用(Ap...

H_sen's Blog 2496

WSGI与ASGI的区别与联系

WSGI与ASGI 文章目录WSGI与ASGI什么是WSGI什么是ASGI目的总览区别 什么是WSGI CGI(Common Gateway Interface,通用网关接口),定义客户端与Web服务器的交流方式的一个程序,例如正常情况下客户端发送过来一个请求,根据HTTP协议Web服务器将请求的内容解析出来,经过处理会后,再将返回的内容封装好。例如服务器返回一个HTML页面,并且根据HTTP协议构建返回内容的响应格式,涉及到TCP连接、HTTP原始请求和相应格式都是由一个软件来完成,这个程序就是CGI。

绝尘 5749

wsgi协议

今天来探讨下wsgi协议的用法。def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return 'Hello World!'这是一段wsgi协议,application 是这个函数的函数名,这个是不可变的,environ是服务器给框架...

weixin_40036888的博客 406

32、wsgi协议

wsgi(扩展) 1、为什么要定义wsgi协议 让python逻辑代码(框架)与服务器兼容 2、协议内容是什么 服务器中会执行application(environ,start_response),框架代码必须提供可以调用application函数/对象。 方法的名字是application 参数environ是请求信息字典 参数start_response响应函数,可以发送响应行和响应头 方法的...

panjunxiao的博客 123

Python Web开发之WSGI

Python Web开发之WSGI WSGI(全称Web Server Gate Interface,Web服务器网关接口)是Python为了规范和简化Web服务开发过程,定义了一种Web服务器和应用框架之间的简单而通用的接口标准规范,即规定了请求的URL到后台处理函数之间改如何实现。WSGI在Python Web开发中地位显著,但是仅通过它开发Web还是过于底层,应用较广的那些Django、Falsk等开发框架,都是在WSGI基础上抽象了一层,使得更加专注于业务应用设计,避免过多精力耗费在网...

Keivn_666 8822

wsgi,WSGI,uwsgi,nginx,web框架 概念

WSGI WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),它不是服务器、python模块、框架、API或者任何软件,只是一种描述web服务器(如nginx,uWSGI等服务器)如何与web应用程序(如用Django、Flask框架写的程序)通信的规范。 server和application的规范在PEP3333中有具体描述,要实现WSGI协议,...

weixin_30877227的博客 128

关于对uwsgi,UWSGI,wsgi的理解

uWSGI uWSGI是一个快速的、自维护、对开发者和系统管理者友好的应用程序容器,是纯c语言开发的服务器。uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。 uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。 对于管理人员来说,uWSGI服

qq_45632139的博客 424

wsgi、uwsgi、asgi协议的关系

WSGI, UWSGI和ASGI 首先是介绍什么是WSGI, 接着是什么是UWSGI, 接着是ASGI 首先需要介绍的是CGI, CGI全称(Common Gateway Interface, 通用网关接口),定义的是客户端与Web服务器交流方式的一个程序.例如正常情况下客户端发送来一个请求,CGI根据HTTP协议的将请求内容进行解析, 经过计算以后会将计算出来的内容封装好,比...

bruce_van的博客 1681

Django部署服务器

介绍Django部署到服务器的基本原理,使用nginx,uwsgi来部署,以及为什么使用这些框架。在了解原理的基础上一步一步将Django应用部署到web服务器上

qq_45706819的博客 5107

对框架与HTTP协议的认识

目录   一、框架 1、什么是框架 2、为什么要用框架 3、为什么要进行框架开发  4、采用框架进行软件开发的特点 5、框架本质 二、HTTP协议 1、HTTP概述 2、HTTP请求协议 3、GET请求 4、 POST请求 5、响应协议 6、HTTP请求状态码 三、web服务器 1、简介 2、HTTP协议 四、WSGI 1、简介 2、应用 五、WEB服务器...

qq_43158393的博客 853
上一篇: python操作mysql数据库实现增删改查(curd)
下一篇: 软件框架理解
Terminator_HWW
博客等级 码龄9年 17粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值