简介:许多朋友询问有关Django自己的Web服务器名称的问题。首席执行官在本文中注明将为您提供详细的答案,以供所有人参考。我希望这对每个人都会有所帮助!让我们一起看看!
许多Django应用程序需要执行异步任务,以免延迟HTTP请求的执行。我们还可以选择许多方法来完成异步任务。使用克莱里是一个更好的选择,因为克莱里
有了大量的社区支持,它可以完美扩展,与Django结合使用也很好。芹菜不仅可以在Django中使用,而且可以在其他地方使用。因此,一旦您学会使用克莱利,我
我们可以在其他项目中非常方便地使用它。
1.克莱里版本
这篇博客文章主要针对芹菜3.0.x。克莱里的早期版本可能有轻微的差异。
2. Cerry介绍
Clery的主要用途是执行异步任务。您可以选择扩展或定期执行功能。为什么需要执行异步任务?
首先,假设用户正在启动请求并等待返回请求。在此请求背后的视图函数中,我们可能需要执行长期的过程任务。目前,我们可能
它可能远大于用户公差的范围。当不需要立即执行此任务时,我们可以使用Clery在后台执行,而不会影响用户浏览Web。
当涉及到,我们通常无法确定它花费的时间。
第二个是定期执行常规任务。例如,您需要每小时检查天气预报,然后将数据存储到数据库中。我们可以编写此任务,然后让芹菜执行
Web应用程序可以获取最新的天气预报信息。
我们在这里谈论的任务是python函数(函数)。定期执行任务可以延迟执行此功能。我们可以使用Clery将功能延迟5分钟5分钟。
任务1并传递参数(1、2、3)。或者我们也可以每天午夜运行该功能。
我们偏向项目中的项目,这对于访问统一数据库和Django设置的任务很方便。
准备好任务后,芹菜会将其放在队列队列中。队列存储任务列表。我们可以使用多个队列,但是为简单起见,我们在这里只使用一个。
将任务任务放在队列中就像加入TODO列表一样。为了使任务运行,我们还需要在其他线程中运行艰苦的工作。工人观察实时行动的任务,然后一一运行。
一些任务。您可以在不同的服务器上使用多个工人。同样,为简单起见,我们只使用一个工人。
我们将在以后讨论队列,工人和另一个非常重要的过程。接下来,让我们这样做:
3.安装克莱里
我们可以使用PIP在vietualenv中安装:
PIP安装django-clery
4. Django设置
我们暂时使用Django Runserver来启动Clery。和芹菜代理,我们使用Django数据库代理实现。现在我们只需要知道克莱里芹菜
需要经纪人,您可以使用Django本身作为经纪人。(但是,当部署时,我们最好使用更稳定和高效的布拉克(例如Redis)。)
在steratings.py中:
导入djcelery
djcelery.setup_loader()
broker_url ='django://'
Em
instasted_apps =((
Em
'djcelery',
'kombu.transport.django',
Em
治愈
第一个和第二个项目是必要的,第三个项目告诉芹菜将Django项目用作经纪人。
添加到installed_apps中的djcelery是必要的。kombu.transport.django是基于Django的经纪人
最后创建芹菜所需的数据表。如果您将South用作数据迁移工具,请运行:
python manage.py迁移
否则,运行:( Django 1.6或Django 1.7可以)
python manage.py syncdb
5.创建一个任务
如前所述,任务是Pyhton功能。但是芹菜需要知道此功能是任务,因此我们可以使用装饰器:@task。
在django应用程序目录中创建taske.py:
从芹菜导入任务
@任务 ()
def add(x,y):
返回x + y
当settings.py运行中的djcelery.setup_loader()时,Clery将在APPS Directory中的App Directory中的所有task.py文件中查看Appled_apps中的App Directory中的所有task Files,查找标记为任务的函数,并且预防。
将它们注册为Clery任务。
标记函数作为任务不会阻碍其正常执行。您仍然可以像往常一样称呼它:z = add(1,2)。
6.执行任务
让我们从一个简单的示例开始。例如,我们希望在用户发送请求并立即返回响应后执行任务异步,以免阻止请求,用户可以平稳访问
过程。然后,我们可以在Views.py的视图中使用.delay:
从myapp.tasks导入添加
Em
add.delay(2,2)
Em
克莱里将添加任务以排队并立即返回。在看到工人一侧的任务后,它将根据设置执行并将其从队列中删除。工人将执行以下一代。
代码:
导入myapp.tasks.add
myapp.tasks.add(2,2)
7.关于导入
应该注意的是,当IMPPRT任务时,它需要保持一致。因为执行djcelery.setup_loader()时,任务基于installed_apps中的应用程序名称。
添加.tasks.function_name进行注册。如果由于不同的Python路径而使用不同的参考方法(例如,使用MyProject.myapp.tasks在tasks.py中导入的the。
添加表单),Cerly不会知道这是同一任务,因此可能会导致奇怪的错误。
8.测试
A。开始工人
如前所述,我们需要一个工人来执行任务。以下是如何在开发环境中启动工人的方法:
首先启动终端,例如开发Django项目,激活Virtualenv,切换到Django Project目录。然后启动django构建的Web服务器:Python Manage.py Runserver。
然后开始工人:
python manage.py芹菜工人-loglevel =信息
目前,工人将在终端运行并显示输出结果。
b。开始任务
打开新终端,激活Virtualenv,然后切换到Django项目目录:
$ python manage.py shell
从myapp.tasks导入添加
add.delay(2,2)
目前,您可以看到工人在工作窗口中执行任务:
[2014-10-07 08:47:08,076:info/mainprocess]从经纪人获得任务:myapp.tasks.add [e080e047-b2a2a7-af74-af74-d7d98b02fc]
[2014-10-07 08:47:08,299:info/mainprocess]任务myapp.tasks.add [e080e047-b2a2-43a2-43a7-af74-af74-d7d98b02fc]
9.另一个例子
让我们看一个更真实的示例,即views.py和tasks.py:
#views.py
来自myApp.tasks导入do_something_with_form_data
def视图(请求):
form = someform(request.post)
如果form.is_valid():
data = form.clenet_data
#安排任务以稍后进行数据
do_something_with_form_data.delay(data)(数据)
返回render_to_response(...)
#tasks.py
@任务
def do_something_with_form_data(数据):
call_slow_web_service(data ['user'],data ['text'],...)
10.调试
由于克莱里的操作需要启动多个组件,因此我们可能会错过一两个组件。因此,我们建议:
使用最简单的设置
使用Python调试和记录功能显示当前过程
11.渴望模式
如果在设置中的设置。py:
Celery_always_eager = true
然后芹菜以急切的模式运行,然后任务不需要添加延迟即可运行:
#如果启用了急切的模式,则以下两行代码是相同的
add.delay(2,2)
添加(2,2)
12.查看队列
因为我们将Django用作经纪人,所以排在Django数据库中的队列。这意味着我们可以通过Django管理员查看队列:
#admin.py
来自django.contrib导入管理
从kombu.transport.django导入模型为kombu_models
Admin.Site.Register(Kombu_models.message)
13.检查结果
运行异步任务后,芹菜将异步对象返回结果。您可以保存它,然后检查任务是否成功运行并返回结果:
#views.py
结果= add.delay(2,2)
Em
如果结果。dready():
打印“任务已运行”
如果结果。Successful():
打印“结果为:%s”%结果。
别的:
如果是isInstance(结果,例外):
打印“任务失败,原因是提出例外”
提高结果
别的:
打印“任务失败而没有提高例外”
别的:
打印“任务尚未运行”
14.常规任务
还有一种普通的牧师来执行常规任务。执行常规任务时,芹菜将通过芹菜过程完成。将维护芹菜。一段时间后,需要执行一定时间。
走路时,芹菜症将其添加到队列中。与工作过程不同,芹菜只需要一个。
启动CleryBeat:
python manage.py Clery Beat
有很多方法可以使芹菜执行常规任务。让我们先查看第一个,然后将常规任务存储在Django数据库中。即使在Django和Clery中运行的状态
方便地修改常规任务。我们只需要在设置中设置一个即可打开此方法:
#settings.py
Celerybeat_scheduler ='djcelery.schedulers.databasescheduler'
那些了解PHP的人知道,PHP的正式环境部署非常简单。可以更改一些文件。使用fastcgi.in对比也是一分钟的问题,Python在Web应用程序中的部署非常复杂,这主要是因为有很多工具和主流服务器支持不足。在了解Python的生产环境部署方法之前,您可以首先澄清一些概念!非常重要!
CGI:
CGI是常见的网关接口。它是外部应用程序(CGI程序)和Web服务器之间的接口标准。这是用于在CGI程序和Web服务器之间传输信息的过程。CGI规范允许Web服务器执行外部程序并将其输出发送到Web浏览器。CGI将一组简单的静态媒体文档转变为一个完整的新交互式媒体。流行的CGI就像一座桥梁。在网页和Web服务器中连接执行程序。它将HTML接收到的指令传输到服务器执行程序,然后将服务器执行程序的结果返回到HTML页面。CGI的Cross -Platform性能非常好,并且几乎可以在任何操作系统上实现。
当CGI方法遇到连接请求(用户请求)时,首先创建CGI的子过程,激活CGI进程,然后处理请求,然后在处理后完成此子过程。这是fork-and任务模式因此,在CGI模式的连接请求中将有多少个CGI子处理,并且子过程重复加载是CGI性能较低的主要原因。大量占用内存,CPU时间等系统的系统,导致效率低。
CGI脚本工作流程:
浏览器通过HTML表单或超链接请求指向CGI应用程序的URL。
服务器执行服务设备和请求。指定CGI应用程序。
CGI应用程序所需的操作通常基于查看器输入的内容。
CGI应用程序已将结果格式化为可以通过网络服务器和浏览器(通常是HTML网页)理解的文档。
网络服务器将结果返回到浏览器。
Python有一个CGI模块来支持本机CGI程序
fastcgi:
FastCGI是一个可以在HTTP服务器和动态脚本语言之间进行通信的接口。大多数流行的HTTP服务器支持FastCGI,包括Apache,Nginx和LightTPD。同时,FastCGI也得到了许多脚本语言的支持,包括Python.fastcgi从CGI中得到改善。传统CGI接口方法的主要缺点是性能很差,因为每次HTTP服务器都会遇到一个动态程序,即动态程序,您需要重新启动脚本解析器才能执行解析,然后将结果返回到HTTP服务器。处理高的并发访问时几乎不可用。FastCGI就像长期的CGI一样,可以一直执行它。只要被激活,它就不会花时间每次叉去叉(这是CGI最受批评的叉子和执行模式。因为FastCGI程序不需要不断生成新的流程,因此它可以大大降低服务器的压力并产生高应用效率。它的速度效率至少比CGI技术高5倍。IS,FASTCGI程序可以在主机上执行其他网站服务器以外的其他网站服务器的请求。
FastCGI是CGI的开放扩展,与语言无关,扩展体系结构及其主要行为是将CGI解释器过程保持在内存并获得更高的性能。我们都知道,CGI解释器的重复加载是CGI性能低的主要原因。如果CGI解释器保存在内存中并接受了FastCGI流程管理器计划,则可以提供良好的性能,望远镜,失败功能等。FastCGI接口使用C/S结构,可以将HTTP服务器分开脚本解析服务器,同时启动在脚本解析服务器上的一个或多个脚本分析后卫。east Time HTTP服务器遇到动态程序,它可以直接传递到FastCGI进程以执行,然后返回所获得的所获得的程序结果到浏览器。此方法允许HTTP服务器处理静态请求或将动态脚本服务器的结果返回到客户端,从而在很大程度上改善了整个应用程序系统的性能。
Fastcgi的工作流程:
启动时,Web服务器加载FastCGI Process Manager(PHP-CGI或PHP-FPM或SPAWN-CGI)
FastCGI Process Manager本身将其初始化,启动多个CGI解释器进程(可见多个PHP-CGI),并等待Web服务器的连接。
当客户端请求到达Web服务器时,FastCGI流程管理器会选择并连接到CGI Inverter.Web Server将CGI环境变量和标准输入发送到FastCGI子过程PHP-CGI。
在处理FastCGI子过程之后,标准输出和错误消息从同一连接返回Web服务器。FastCGISub -Process关闭后,请求将进行处理。Fastcgisub -process等待并处理下一个连接从FastCGI Process Manager(在Web服务器中运行)。在CGI模式下,PHP-CGI在此处退出。
Fastcgi的功能:
打破传统的页面处理技术。传统的页面处理技术必须与Web服务器或应用程序服务器同一服务器中。该历史记录已被FastCGI Technology最早在n年前被打破。可以在服务器组中的任何服务器中安装FastCGI技术的应用。通过TCP/IP协议与Web服务器进行通信,这是适合的Web组也适用于有效的数据库控制。
清晰的请求模式。CGI技术没有明确的作用。在FASTCGI程序中,该程序具有明确的作用(响应设备的作用,身份验证的作用,滤波器角色)。
WSGI:
Python Web服务器网关接口(Python Web服务器网关接口(缩写为WSGI)是Web服务器与为Python语言定义的Web应用程序或框架之间的简单通用接口其他语言。wsgi是Web服务器与Web应用程序或应用程序框架之间的低级别接口,以增强可移植Web应用程序开发的开发。WSGI是基于现有的CGI标准设计的。
WSGI分为两个部分:一个是“服务器”或“网关”,另一个是“应用程序”或“应用程序框架”。处理WSGI请求时,服务器为应用程序提供了环境上下文和回调函数。该应用程序完成处理请求,结果通过上一个回调函数传递回服务器。SO所谓的WSGI中间件同时实现了API的两方,因此它可以在WSGI服务和WSGI服务之间起一个调解角色WSGI应用程序:从WSGI服务器的角度来看,中间件播放一个应用程序,从应用程序的角度来看,从角度来看,播放服务器。“中间件”组件可以执行以下功能:
重写环境变量后,根据目标URL,请求消息路由到不同的应用程序对象。
在一个过程中允许多个应用程序或应用程序框架。
负载平衡和远程处理,重新发布请求和网络上的响应消息。
执行内容后,应用XSLT样式表。
过去,如何选择适当的Web应用程序框架已成为困扰Python初学者的问题。这是因为通常,Web应用程序框架的选择将限制可用的Web服务器的选项,反之亦然。在那个时候,Python应用程序是为CGI,FastCGI,FastCGI,FastCGI,MOD_PYTHON设计的,甚至设计了对于特定Web服务器的自定义API接口。WSGI没有官方实现,因为WSGI更像是协议。只要这些协议,应用程序(应用程序)可以在任何服务器上运行,反之亦然。WSGI是CGI包装与FastCGI相比,Python是PHP的CGI包装。
WSGI将Web组件分为三个类别:Web服务器,Web中间件,Web应用程序,WSGI基本处理模式:WSGI Server-(WSGI MIDDERWARE)* -WSGI应用程序。
UWSGI:
UWSGI协议是UWSGI服务器自己的协议。它用于定义传输信息的类型(信息类型)。每个UWSGI数据包4 Byte都被描述为传输信息类型,这是与WSGI相比的两件事。据说其效率是FCGI的10倍。有关特定协议,请参阅:UWSGI协议
以上四个可以将其理解为协议!协议!协议,通过这样的协议,Web服务可以与Web服务器和Web应用程序联系起来!
UWSGI:
UWSGI项目旨在为分布式群集的网络应用开发完整的解决方案。UWSGI主要用于Web及其标准服务,并成功地应用于各种不同的语言。为了通过无限扩展支持更多平台和语言。目前,您可以使用C,C ++和Objective-C编写插件。项目名称中的“ WSGI”是感谢同名的Python Web标准,因为WSGI已为Project.UWSGI开发了第一个插件-IN.UWSGI是一个实现WSGI协议,UWSGI,HTTP和其他协议的Web服务器。
UWSGI的主要特征如下:
超快的性能。
低内存职业(大约是Apache2的MOD_WSGI的一半)。
更多应用程序管理。
详细的日志功能(可用于分析性能和瓶颈)。
可以自定义高度(内存尺寸限制,在一定数量的服务等之后重新启动)。
枪支:
类似于UWSGI的工具是从Rails的部署工具(Unicorn)移植的。但是,它使用的协议是上一篇文章中提到的WSGI。这是python2.5(PEP 333)时定义的官方标准。根红幼苗是正的,部署相对简单。请单击此处以获取详细的教程。Gunicorn采用首选项模式。Gunicorn服务器与各种Web框架兼容。它只需要非常简单,轻巧的资源消耗,并且非常快速。它的特征是与django紧密结合,这对于部署特别方便。也有许多缺点。不支持HTTP 1.1,并且访问性能不高。它与UWSGI和GEVENT有一定的性能差距。
1.枪支设计
Gunicorn是一个主过程,Spawn有几个用于工作流程的Web服务器。总体过程控制工作过程的出现和灭亡,而工作过程只需要接受请求并处理该请求。此分离方法使重新加载代码非常非常方便,很容易增加或减少工作过程。工作过程的作者为扩展提供了很大的空间。它可以支持不同的IO方法,例如GEVENT,同步同步过程,异步异步过程,Eventlet等等。主过程和工作过程完全分开,因此Gunicorn实质上是控制该过程的服务。
2.枪支源代码结构
从application.run()开始,首先初始化配置,从文件读取,终端读取等完成配置。然后从仲裁器开始。仲裁者是实体总体过程的核心。它首先从配置类读取并设置它,然后初始化信号处理功能以创建插座。然后开始生成工作过程并根据工作过程数量执行产卵。然后他进入旋转状态,接收信号,处理信号,然后继续。唤醒此处的过程的方法是建立管道,通过信号处理函数写入管道,然后大师从select.select()醒来。
工作过程从产卵开始后,它开始初始化,然后处理信号,然后开始查询,处理HTTP请求,调用WSGI的应用程序末端,然后将Resopnse返回。然后继续。
同步同步过程的优点是每个请求分开,每个请求故障不会影响其他请求,但这会导致性能瓶颈。
龙卷风:
龙卷风是一个Python开发框架,它也是异步的非烧烤HTTP服务器。它的数据输出不符合上述一些一般协议。因为它是Web服务器本身,所以动态请求直接通过内部内部。将机制输出到用户请求的动态内容中。如果您将其用作单独的服务器并希望使用它来匹配其他框架,例如烧瓶,您需要使用WSGI协议。龙卷风构建了协议,龙卷风。wsgi.wsgicontainer。
WSGIREF:
Python配备了WSGI协议的WSGI服务器。WSGI服务器可以理解为符合WSGI规格,接收请求请求的Web服务器,封装了一系列的环境变量,根据WSGI规格称为已注册的WSGI应用程序,并最终返回对响应响应,client.django的构建 - 在服务器中。
以上可以理解为实施!完成!实现协议!
注意:mod_wsgi(Apache模块)实际上是WSGI协议的模块。现在几乎没有被放弃,所以我不会说太多。如果您有兴趣,请自己检查。
因此,如果您使用Django框架来开发应用程序,如果要部署到生产环境中,则必须无法使用Django。您可以使用UWSGI协议使用UWSGI服务器,也可以使用WSGI协议的Gunicorn或Tornado。您还可以使用fastcgi。,CGI模式NGINX,LIGHTTPD,APACHE SERVER。其他框架也是如此!可以理解,部署时可以实现这些概念,并且各种工具的组合是“知道它并知道它并知道为什么”的原因”。。
我们的小组Django和Tornado有两个框架,生产环境也使用了两种部署方法。Uwsgi和Gunicorn:
Django项目由NGINX+UWSGI部署,龙卷风项目由NGINX+Gunicorn部署:
nginx被重新存储为负载平衡和静态内容。龙卷风项目使用Substisord使用Gunicorn和Gunicorn一起管理枪支和管理龙卷风。我们都知道,因为Python的Gil存在,所以Python的同意采用了多个程序模式,因此我们的部署方式就是我们的方式,这就是我们的部署方式核心两个过程。
Django是一个可用于开发Web项目的Web开发框架,Web需要运行服务器以运行,例如常用的Nginx,Apache,UWSGI等。这些服务器仅负责运行程序(项目编写的项目(由项目编写)django)。用户请求将发送它们。在服务器上,服务器请求Django,Django将相应的结果返回到Web服务器,然后返回给用户。Web服务器是用户和程序之间的桥梁。用户无法直接联系代码。所有Web项目都需要使用Web服务器运行,以便用户可以使用浏览器访问它。
结论:以上是有关Django自己的Web服务器名称的主要CTO注释的所有内容。感谢您花时间阅读此网站。我希望这对您有帮助。有关Django的名称是什么,Web服务器附带了什么名称。不要忘记在此站点上找到它。