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

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

【libnice】meson + vs2022,生成win32工程 libnice 阅读详情

相关推荐

Python广度优先搜索BFS - 蓝桥13届省赛污染海域

请问这片N * M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N * M以外的海域都为已被污染的海域)有一片海域划分为N * M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)这块4 * 5的海域,有3块海域(绿色)没被污染,因为每一块的上下左右都被污染的海域包围。输出一个整数,表示N * M的海域中有几块是没被污染的独立海域。

m0_69865359的博客 271

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

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

GIS摆渡人 1426

深度学习的卷积神经网络的煤矸石识别

在本博文中,我们提出了一种基于深度学习的煤矸石检测与识别系统,该系统采用YOLOv8算法对煤矸石进行检测和识别,实现对图片中的煤矸石进行准确识别。1.项目需求对煤矸石进行检测与识别,系统将识别出图片中的克服小块煤矸石漏检的缺陷。 2.项目实现 通过调研,本项目最终使用yolov8模型作为目标检测的模型, YOLOv8 旨在快速、准确且易使用,使其成为广泛的物体检测、图像分割和图像分类任务的极佳选择。 1.数据集:格式为jpg的3091张煤矸石图片2.YOLOv8环境配置yolo检测网络包括24个卷积层

2201_75355700的博客 792

HTTP和wsgi基本介绍

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

zeroist的专栏 1855

GEO数据挖掘实战:用R语言从GSE42872数据集中找到关键差异基因(附完整代码)

本文详细介绍了使用R语言从GSE42872数据集中挖掘关键差异基因的完整流程,包括数据下载、探针ID转换、差异表达分析和功能富集分析。通过实战代码演示,帮助生信研究者掌握GEO数据挖掘的核心技术,快速识别疾病相关基因并理解其生物学功能。

weixin_42625070的博客 365

使用这个算法我可以实现英雄联盟里英雄的走位|Java 开发实战

A算法,A(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 基本概念 首先在大学我们遇到最多的算法Dijkstra、Floyd、广度搜索、深度搜索。关于这些算法我们以后再慢慢的研究,今天的重点在A算法上。A算法是一种启发式算法。与上述几种算法不同的是A*算法在考虑起始节点的同时还会考虑到目标节点的代价。 在A*算法中我们给每个节点都定义一些属性。最基本的就是下文提到的三基数-这里的三基数是我自己定义.

Java进阶营 312

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

从圆形到椭圆:CenterNet中高斯热图半径的自适应优化策略

本文深入探讨了CenterNet目标检测模型中高斯热图生成策略的优化,针对传统圆形高斯核在处理长宽比差异大目标时的局限性,提出了自适应椭圆高斯核的解决方案。通过数学推导和代码实战,详细阐述了如何根据目标边界框尺寸动态计算椭圆长短轴半径,生成更贴合目标几何形状的热图监督信号,从而有效提升模型,尤其是对无人机、车辆等不规则目标的定位精度。

alice7model的博客 985

HTTP服务器搭建WSGI

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

过期的秋刀鱼 776

SAP Group Reporting入门指南(11)--配置

这里选择的是FS项目目标属性,FS项目有四个目标属性,比如上图配置的是抵消目标属性,所以就去找触发FS项目的抵消目标属性配置的是哪个FS项目,就以这个FS项目作为贷方。这里选择的是FS项目目标属性,FS项目有四个目标属性,比如上图配置的是抵消目标属性,所以就去找源FS项目的抵消目标属性配置的是哪个FS项目,就以这个FS项目作为借方。例如,添加一个包含用于存储百分比的 FS 项的选项。这里选择的是FS项目的角色属性值,如果这里定义了,那么就从FS项目中找到FS项目角色属性值与之匹配的FS项目作为贷方。

bflyfish的博客 568

计算机视觉与深度学习 | Matlab实现ORBSLAM2(附完整代码)

================================================ 博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.csdn.net/u011344545 ================================================ 代码阅览 效果图 代码 imdsLeft = imageDatastore('C:\MichaelSpace\matlabworks

尘世冰封的专栏 1522

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

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

qq_43695313的博客 801

自顶向下与自底向上编程思想的对比

一、核心定义与本质差异自顶向下编程思想如同绘制一幅完整的地图,从整体轮廓逐步细化到局部细节。其本质是从系统的整体目标出发,通过逐层分解将复杂问题简化为可实现的子问题,强调先定义 “做什么”,再考虑 “如何做”。自底向上编程思想则类似于搭建积木,从基础组件开始逐步构建复杂系统。其本质是从现有资源和基础功能出发,通过组合和扩展简单组件来实现复杂功能,强调先解决 “如何做” 的细节,再整合为 “做什么” 的整体。二、设计起点与逻辑流程对比设计起点:以系统的整体目标和业务需求为起点。例如设计一个电商平台,首先明确

二进制君 834

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

weixin_30581253的博客 480

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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的博客 5108

对框架与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、付费专栏及课程。

余额充值