wsgi uwsgi uWSGI,cgi,fastcgi 分别是什么?

发布时间 2023-08-08 16:20:56作者: 岳宗柯

1 wsgi uwsgi uWSGI,cgi,fastcgi 分别是什么?

# CGI:通用网关接口(Common Gateway Interface/CGI),CGI描述了服务器(nginx,apache)和请求处理程序(django,flask,springboot  web框架)之间传输数据的一种标准
    	# 所有bs架构软件都是遵循CGI协议的
    	# 一句话总结: 一个标准,定义了客户端服务器之间如何传数据
        
# FastCGI:快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本
	# FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求
    #常见的fastcgi服务器:Apache,Nginx,Microsoft IIS
    # CGI的升级版
    
# WSGI:Python Web Server Gateway Interface,缩写为WSGI,Python定义的Web服务器和Web应用程序或框架之间的一种通用的接口
	#一句话总结: 为Python定义的web服务器和web框架之间的接口标准
    
#uWSGI:符合wsgi协议的web服务器,用c写的,性能比较高,咱们通常用来部署django,flask
	#一句话总结:一个Web Server,即一个实现了WSGI协议的服务器,处理发来的请求及返回响应。


# uwsgi:uWSGI服务器实现的独有的协议,用于定义传输信息的类型,是用于前端服务器与 uwsgi 的通信规范
	# 1、一句话总结: uWSGI自有的一个协议
        uWSGI:web服务器,等同于wsgiref
        uwsgi:uWSGI自有的协议

1.2 符合WSGI协议的web服务器

# 符合WSGI协议的web服务器
    wsgiref,werkzeug(一个是符合wsgi协议的web服务器+工具包(封装了一些东西))
    uWSGI 用c语言写的,性能比较高
    gunicorn:python写的
    tornado:也可以部署django项目
  

1.3 web服务器到底是什么?服务器中间件

客户端(浏览器,app)  跟   服务端(web框架)之间的东西,服务器中间件
# nginx  apache  是一类东西,就是做请求转发
# uWSGI,gunicorn 只针对于python的web框架
# tomcat,jboss,weblogic 只针对java的web框架

2.如何自定制上下文管理器

# 一个对象如果实现了__enter__和___exit__方法,那么这个对象就支持上下文管理协议,即with语句
# 上下文管理协议适用于那些进入和退出之后自动执行一些代码的场景,比如文件、网络连接、数据库连接或使用锁,s使用事务的编码场景等

# 如何使用
class ComonSession:
    def __enter__(self):
        print('进入with语句块时执行此方法,此方法如果有返回值会赋值给as声明的变量')
        self.session=session
        return self.session

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.session.close()


with ComonSession() as session:
    session.filter()

print('上下文管理器结束了')

3 Python是值传递还是引用传递

严格意义上来说,python既不是值传递,也不是引用传递,python是自己的传递方式,规则是:

如果传递的是不可变类型:

在函数中修改,就不会影响原来的变量,这是因为不可变类型的对象在传递时实际上是传递了对象的值的副本,而不是对象本身。

不可变类型包括整数(int)、浮点数(float)、字符串(str)、元组(tuple)等。当你将不可变对象传递给函数时,函数会使用该对象的一个副本来进行操作,而原始对象本身不会受到影响。

如果传递的是可变数据类型:

在函数中修改,会影响原来的变量,修改,而不是重新赋值,这是因为可变类型的对象在传递时实际上是传递了对象的引用,而不是对象的副本。

可变类型包括列表(list)、字典(dict)、集合(set)等。当你将可变对象传递给函数时,函数使用的是对象的引用,因此在函数内部对对象进行的任何修改都会反映在原始变量上。
python一切皆对象---》(你不要说)内部函数是一切皆引用(对象本质就是地址,就是引用)

什么是值,什么是引用

-值就是一个变量=具体的值(一块内存空间放着这个变量的值)
-引用是一个变量=内存地址(内存地址指向了值)

什么是值传递 什么是引用传递

-如果是值传递,函数中修改了传递的值,不会影响原来的
-如果是引用传递,函数中修改了传递的引用,就会影响原来的

不可变对象类型:

下面是一个示例来说明这一点:

def modify_string(s):
    s = s + " World"  # 在函数内部修改字符串
    print("Inside function:", s)

my_string = "Hello"
modify_string(my_string)
print("Outside function:", my_string)

输出结果:

Inside function: Hello World
Outside function: Hello

在这个示例中,尽管在函数内部修改了字符串 s,但是在函数外部的原始字符串 my_string 并没有受到影响。

如果你想要在函数内部修改不可变类型的对象,并且让原始变量也受到影响,你可以考虑将对象封装在一个可变容器中(如列表),然后传递容器对象给函数。这样函数内部修改容器中的元素会影响原始容器。

例如:

def modify_list(lst):
    lst.append(4)  # 在函数内部修改列表
    print("Inside function:", lst)

my_list = [1, 2, 3]
modify_list(my_list)
print("Outside function:", my_list)

输出结果:

Inside function: [1, 2, 3, 4]
Outside function: [1, 2, 3, 4]

在这个示例中,列表 my_list 在函数内部被修改,函数外部的原始列表也受到了影响。这是因为列表是可变类型,函数内部对列表的修改会直接影响到原始列表。

可变对象类型:

以下是一个示例来说明这一点:

def modify_list(lst):
    lst.append(4)  # 在函数内部修改列表
    print("Inside function:", lst)

my_list = [1, 2, 3]
modify_list(my_list)
print("Outside function:", my_list)

输出结果:

Inside function: [1, 2, 3, 4]
Outside function: [1, 2, 3, 4]

在这个示例中,函数 modify_list 在函数内部修改了列表 lst,然后这个修改也反映在了原始列表 my_list 上。

总结起来,在 Python 中,对于不可变类型的对象,函数内部的修改不会影响原来的变量;而对于可变类型的对象,函数内部的修改会影响原来的变量。这是 Python 语言中传递对象的引用机制所导致的行为。