大家好,关于wsgi服务器很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于webservice和wsgi的区别的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
一、python***webservice和wsgi的区别
WSGI是Web Server Gateway Interface的缩写。以层的角度来看,WSGI所在层的位置低于CGI。但与CGI不同的是WSGI具有很强的伸缩*且能运行于多线程或多进程的环境下,这是因为WSGI只是一份标准并没有定义如何去实现。实际上WSGI并非CGI,因为其位于web应用程序与web服务器之间,而web服务器可以是CGI,mod_python(注:现通常使用mod_wsgi代替),FastCGI或者是一个定义了WSGI标准的web服务器就像python标准库提供的独立WSGI服务器称为wsgiref。
Web service是一个平*立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。[1]
Web Service技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互*数据或集成。依据Web Service规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互*数据。Web Service是自描述、自包含的可用网络模块,可以执行具体的业务功能。Web Service也很容易部署,因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
有些webservice是构建在wsgi上的,不过也可以不用的,两个不是同一个东西
二、django中wsgi怎么读
导读:很多朋友问到关于django中wsgi怎么读的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!
要调试一个用j*a写的后端,django写的前端的web应用应该怎么调试
在以前,你选择Pythonweb架构会受制于可用的web服务器,反之亦然。如果架构和服务器可以协同工作,那你就走运了:
但你有可能面对(或者曾有过)下面的问题,当要把一个服务器和一个架构结合起来是发现他们不是被设计成协同工作的:
基本上你只能用可以一起运行的而非你想要使用的。
那么,你怎么可以不修改服务器和架构代码而确保可以在多个架构下运行web服务器呢?答案就是PythonWebServerGatewayInterface(或简称WSGI,读作“wizgy”)。
WSGI允许开发者将选择web框架和web服务器分开。现在你可以混合匹配web服务器和web框架,选择一个适合你需要的配对。比如,你可以在Gunicorn或者Nginx/uWSGI或者Waitress上运行Django,Flask,或Pyramid。真正的混合匹配,得益于WSGI同时支持服务器和架构:
WSGI是第一篇和这篇开头又重复问道问题的答案。你的web服务器必须具备WSGI接口,所有的现代PythonWeb框架都已具备WSGI接口,它让你不对代码作修改就能使服务器和特点的web框架协同工作。
现在你知道WSGI由web服务器支持,而web框架允许你选择适合自己的配对,但它同样对于服务器和框架开发者提供便利使他们可以专注于自己偏爱的领域和专长而不至于相互牵制。其他语言也有类似接口:j*a有ServletAPI,Ruby有Rack。
说这么多了,你肯定在喊,给我看代码!好吧,看看这个极简的WSGI服务器实现:
#TestedwithPython2.7.9,LinuxMacOSX
importsocket
importStringIO
importsys
classWSGIServer(object):
address_family=socket.AF_INET
socket_type=socket.SOCK_STREAM
request_queue_size=1
def__init__(self,server_address):
#Createalisteningsocket
self.listen_socket=listen_socket=socket.socket(
self.address_family,
self.socket_type
)
#Allowtoreusethesameaddress
listen_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#Bind
listen_socket.bind(server_address)
#Activate
listen_socket.listen(self.request_queue_size)
#Getserverhostnameandport
host,port=self.listen_socket.getsockname()[:2]
self.server_name=socket.getfqdn(host)
self.server_port=port
#ReturnheaderssetbyWebframework/Weblication
self.headers_set=[]
defset_(self,lication):
self.lication=lication
defserve_forever(self):
listen_socket=self.listen_socket
whileTrue:
#Newclientconnection
self.client_connection,client_address=listen_socket.aept()
#Handleonerequestandclosetheclientconnection.Then
#loopovertowaitforanotherclientconnection
self.handle_one_request()
defhandle_one_request(self):
self.request_data=request_data=self.client_connection.recv(1024)
#Printformattedrequestdataala'curl-v'
print(''.join(
'{line}\n'.format(line=line)
forlineinrequest_data.splitlines()
))
self.parse_request(request_data)
#Constructenvironmentdictionaryusingrequestdata
env=self.get_environ()
#It'stimetocallourlicationcallableandget
#backaresultthatwillbeeHTTPresponsebody
result=self.lication(env,self.start_response)
#Constructaresponseandsenditbacktotheclient
self.finish_response(result)
defparse_request(self,text):
request_line=text.splitlines()[0]
request_line=request_line.rstrip('\r\n')
#Breakdowntherequestlineintoponents
(self.request_method,#GET
self.path,#/hello
self.request_version#HTTP/1.1
)=request_line.split()
defget_environ(self):
env={}
#ThefollowingcodesnippetdoesnotfollowPEP8conventions
#butit'sformattedthewayitisfordemonstrationpurposes
#toemphasizetherequiredvariablesandtheirvalues
#
#RequiredWSGIvariables
env['wsgi.version']=(1,0)
env['wsgi.url_scheme']=''
env['wsgi.input']=StringIO.StringIO(self.request_data)
env['wsgi.errors']=sys.stderr
env['wsgi.multithread']=False
env['wsgi.multiprocess']=False
env['wsgi.run_once']=False
#RequiredCGIvariables
env['REQUEST_METHOD']=self.request_method#GET
env['PATH_INFO']=self.path#/hello
env['SERVER_NAME']=self.server_name#localhost
env['SERVER_PORT']=str(self.server_port)#8888
returnenv
defstart_response(self,status,response_headers,exc_info=None):
#Addnecessaryserverheaders
server_headers=[
('Date','Tue,31Mar201512:54:48GMT'),
('Server','WSGIServer0.2'),
]
self.headers_set=[status,response_headers+server_headers]
#ToadheretoWSGIspecificationthestart_responsemustreturn
#a'write'callable.Wesimplicity'ssakewe'llignorethatdetail
#fornow.
#returnself.finish_response
deffinish_response(self,result):
try:
status,response_headers=self.headers_set
response='HTTP/1.1{status}\r\n'.format(status=status)
forheaderinresponse_headers:
response+='{0}:{1}\r\n'.format(*header)
response+='\r\n'
fordatainresult:
response+=data
#Printformattedresponsedataala'curl-v'
print(''.join(
'{line}\n'.format(line=line)
forlineinresponse.splitlines()
))
self.client_connection.sendall(response)
finally:
self.client_connection.close()
SERVER_ADDRESS=(HOST,PORT)='',8888
defmake_server(server_address,lication):
server=WSGIServer(server_address)
server.set_(lication)
returnserver
if__name__=='__main__':
iflen(sys.argv)2:
sys.exit('ProvideaWSGIlicationobjectasmodule:callable')
_path=sys.argv[1]
module,lication=_path.split(':')
module=__import__(module)
lication=getattr(module,lication)
d=make_server(SERVER_ADDRESS,lication)
print('WSGIServer:ServingHTTPonport{port}...\n'.format(port=PORT))
d.serve_forever()
这比第一篇的代码长的多,但也足够短(只有150行)来让你理解而避免在细节里越陷越深。上面的服务器可以做更多——可以运行你钟爱web框架所写基本的web应用,Pyramid,Flask,Django,或其他PythonWSGI框架.
不相信我?你自己试试看。保存上面的代码为webserver2.py或者在Github。如果你不传入任何参数它会提醒然后推出。
$pythonwebserver2.py
ProvideaWSGIlicationobjectasmodule:callable
Django源码阅读(一)项目的生成与启动
诚实的说,直到目前为止,我并不欣赏django。在我的认知它并不是多么精巧的设计。只是由功能堆积起来的"成熟方案"。但每一样东西的崛起都是时代的选择。无论你多么不喜欢,但它被需要。希望有一天,python能有更多更丰富的成熟方案,且不再被诟病*能和可维护*。(屁话结束)
取其精华去其糟粕,django的优点是方便,我们这次源码阅读的目的是探究其方便的本质。计划上本次源码阅读不会精细到每一处,而是大体以功能为单位进行解读。
django-adminstartprojectHelloWorld即可生成django项目,命令行是exe格式的。
manage.py把参数交给命令行解析。
execute_from_mand_line()通过命令行参数,创建一个管理类。然后运行他的execute()。
如果设置了reload,将会在启动前先check_errors。
check_errors()是个闭包,所以上文结尾是(django.setup)()。
看最后一句settings.INSTALLED_APPS。从settings中抓取
注意,这个settings还不是我们项目中的settings.py。而是一个对象,位于django\conf\__init__.py
这是个Settings类的懒加载封装类,直到__getattr__取值时才开始初始化。然后从Settings类的实例中取值。且会讲该值赋值到自己的__dict__上(下次会在自己身上找到,因为__getattr__优先级较低)
为了方便debug,我们写个run.py。不用命令行的方式。
项目下建个run.py,模拟runserver命令
debug抓一下setting_module
回到setup()中的最后一句s.populate(settings.INSTALLED_APPS)
开始看s.populate()
首先看这段
这些App最后都会封装成为AppConfig。且会装载到self._configs字典中
随后,分别调用每个Config的import_models()和ready()方法。
App的装载部分大体如此
为了方便debug我们改写下最后一句
res的类型是Commanddjango.contrib.staticfiles.management.mands.runserver.Commandobjectat0x00000101ED5163A0
重点是第二句,让我们跳到run_from_argv()方法,这里对参数进行了若干处理。
用pycharm点这里的handle会进入基类的方法,无法得到正确的走向。实际上子类Commond重写了这个方法。
这里分为两种情况,如果是reload重载时,会执行inner_run(),而项目启动需要先执行其他逻辑。
django项目启动时,实际上会启动两次,如果我们在项目入口(manage.py)中设置个print,会发现它会打印两次。
第一次启动时,DJANGO_AUTORELOAD_ENV为None,无法进入启动逻辑。会进入restart_with_reloader()。
在这里会将DJANGO_AUTORELOAD_ENV置为True,随后重启。
第二次时,可以进入启动逻辑了。
这里创建了一个django主线程,将inner_run()传入。
随后本线程通过reloader.run(django_main_thread),创建一个轮询守护进程。
我们接下来看django的主线程inner_run()。
当我们看到wsgi时,django负责的启动逻辑,就此结束了。接下来的工作交由wsgi服务器了
这相当于我们之前在fastapi中说到的,将fastapi的交由asgi服务器。(asgi也是django提出来的,两者本质同源)
那么这个wsgi是从哪来的?让我们来稍微回溯下
这个settings是一个对象,在之前的操作中已经从settings.py配置文件中获得了自身的属*。所以我们只需要去settings.py配置文件中寻找。
我们来寻找这个get_wsgi_lication()。
它会再次调用setup(),重要的是,返回一个WSGIHandler类的实例。
这就是wsgi本身。
load_middleware()为构建中间件堆栈,这也是wsgi获取setting信息的唯一途径。导入settings.py,生成中间件堆栈。
如果看过我之前那篇fastapi源码的,应该对中间件堆栈不陌生。
入口→中间件堆栈→路由→路由节点→endpoint
所以,wsgi就此构建完毕,服务器传入请求至入口,即可经过中间件到达路由进行分发。
django什么意思
[编辑本段]概述
Django(发音:/?d???go?/)是用python语言写的开源web开发框架(opensourcewebframework),它鼓励快速开发,并遵循MVC设计。Django遵守BSD版权,初次发布于2005年7月,并于2008年9月发布了第一个正式版本1.0。
Django根据比利时的爵士音乐家DjangoReinhardt命名,他是一个吉普赛人,主要以演奏吉它为主,还演奏过小提琴等。
[编辑本段]设计哲学
Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展*。它还强调快速开发和DRY(DoNotRepeatYourself)原则。
Django基于MVC的设计十分优美:
对象关系映射(ORM,object-relationalming)
以Python类形式定义你的数据模型,ORM将模型与关系数据库连接起来,你将得到一个非常容易使用的数据库API,同时你也可以在Django中使用原始的SQL语句。
URL分派
使用正则表达式匹配URL,你可以任意设计的URL,没有框架的特定限定。象你喜欢的一样灵活。
模版系统
使用Django强大而可扩展的模板语言,可以分隔设计、内容和Python代码。并且具有可继承*。
表单处理
你可以方便的生成各种表单模型,实现表单的有效*检验。可以方便的从你定义的模型实例生成相应的表单。
Cache系统
可以挂在内存缓冲或其它的框架实现超级缓冲--实现你所需要的粒度。
会话(session),用户登录与权限检查
快速开发用户会话功能。
国际化
内置国际化系统,方便开发出多种语言的网站。
自动化的管理界面
不需要你花大量的工作来创建人员管理和更新内容。Django自带一个ADMINsite,类似于内容管理系统。
[编辑本段]部署
Django可以运行在Apache上,也可以运行在支持WSGI,FastCGI的服务器上。支持多种数据库,已经支持Postgresql,MySql,Sqlite3。
目前,GoogleAppEngine也支持Django的某些部分。
[编辑本段]文档
Django1.0建立了强大完整的文档文档体系(),涵盖了Django的方方面面,并且适合各种水平的读者和开发者.其中还包含若干个简单的示例,你可以跟随他们一步步体验Django的优美。
如何使用WSGI部署Django
如何使用Apache和mod_wsgi部署Django?
用Apache和mod_wsgi部署Django项目是一个第三方的,测试的方法来得到Django生产环境。
mod_wsgi是一个Apache模块,可以托管任何PythonWSGI应用程序,包括Django。Django将与支持mod_wsgi的任何版本的Apache一起工作。
官方mod_wsgi文档是太棒了!它是所有关于如何使用mod_wsgi的细节的来源。您可能需要先从安装和配置文档开始。
Basionfiguration?
一旦您安装并激活了mod_wsgi,请编辑Apache服务器的d.conf文件并添加以下内容。如果你的Apache版本低于2.4,请将Requireallgranted替换成Allowfromall并在上一行添加Orderdeny,allow.
WSGIScriptAlias//path/to/mysite./mysite/wsgi.py
WSGIPythonPath/path/to/mysite.
Directory/path/to/mysite./mysite
Fileswsgi.py
Requireallgranted
/Files
/Directory
WSGIScriptAlias行中的第一个位是您要在其上(/指示根URL)的服务应用程序的基本URL路径,第二个位置是“WSGI文件“-见下面-在您的系统上,通常在您的项目包(在本例中mysite)。这告诉Apache使用该文件中定义的WSGI应用程序来提供给定URL下面的任何请求。
TheWSGIPythonPathlineensuresthatyourproje
三、一篇就弄懂WSGI、uwsgi和uWSGI的区别
最近基于Django Web框架在开发一个后端项目,在Web Server和Django应用程序交互的过程中总会碰到本文题目提及到的几个概念,笔者特意花了点时间研究了下,为方便以后温习特在此记录一下。
英文全称:Web Server Gateway Interface,Web服务网管接口,简单来说它是一种Web服务器和应用程序间的通信规范。
uwsgi是一种通信协议,不过跟WSGI分属两种东西,该协议下速度比较快。
uWSGI是一个Web Server,并且独占uwsgi协议,但是同时支持WSGI协议、HTTP协议等,它的功能是把HTTP协议转化成语言支持的网络协议供python使用。
在做Django项目时,一般测试开发我们用Django内嵌的Web Server即可,但是如果项目要上生产环境,考虑并发等*能时,我们可能需要uwsgi和nginx,下面只说明uwsgi的常用用法,至于nginx的配置笔者后续准备专门写一篇*文来讲。
uwsgi执行一般有两种方式:命令行和文件配置,但是命令行可能需要识记很多参数,因此采用文件配置是更通用的做法,文件格式支持很多种比如ini、xml、yaml等,笔者建议还是采用比较简单key-value形式ini模式,下面给出一个简单的uwsgi ini配置实例:
执行:uwsgi--ini/path/to/uwsgi.ini
参数解释:
更多uwsgi参数可参考官方文档:
四、nginx 和uwsgi的区别与作用
在介绍nginx和uwsgi的区别和作用之前我们先介绍一下几个概念
1.WSGI
WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),它不是服务器、python模块、框架、API或者任何软件,只是一种描述web服务器(如nginx,uWSGI等服务器)如何与web应用程序(如用Django、Flask框架写的程序)通信的规范、协议。
server和lication的规范在PEP3333中有具体描述,要实现WSGI协议,必须同时实现web server和web lication,当前运行在WSGI协议之上的web框架有,Flask, Django。
2.uWSGI
uWSGI是一个全功能的HTTP服务器,实现了WSGI协议、uwsgi协议、协议等。它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以使用。
3.uwsgi
与WSGI一样,是uWSGI服务器的独占通信协议,用于定义传输信息的类型。每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。
4.Nginx
Nginx是一个Web服务器其中的HTTP服务器功能和uWSGI功能很类似,但是Nginx还可以用作更多用途,比如最常用的反向代理功能。
1.使用的代理一共有两个,nginx和uwsgi,先说明一下,如果不用nginx一样可以访问web项目,使用nginx的目的是为了安全和负载均衡。配置了nginx做前端代理,uwsgi作后端代理的服务器(这里所说的前后端都是相对的位置,并无实际含义),在处理来自Inter的请求时,要先经过nginx的处理,nginx把请求再交给uwsgi,经过uwsgi才能访问到项目本身。
2.没有nginx而只有uwsgi的服务器,则是Inter请求由uwsgi处理,并反馈到web项目中。nginx可以实现安全过滤,防DDOS等保护安全的操作,并且如果配置了多台服务器,nginx可以保证服务器的负载相对均衡。
而uwsgi则是一个web服务器,实现了WSGI协议(Web Server Gateway Interface),协议等,它可以接收和处理请求,发出响应等。所以只用uwsgi也是可以的。
nginx的作用:
1.反向代理,可以拦截一些web攻击,保护后端的web服务器
2.负载均衡,根据轮询算法,分配请求到多节点web服务器
3.缓存静态资源,加快访问速度,释放web服务器的内存占用,专项专用
uWSGI的适用:
1.单节点服务器的简易部署
2.轻量级,好部署
参考: