本文将告诉您Django将如何启动流程,并在Django启动时运行与函数函数相对应的函数。我希望这对您有帮助。不要忘记收集此网站。
本文目录清单:
1. Django请求与过程2. 2.如何使用Django中的Django-Clery完成异步任务3. DJANGO源读取(1)项目4的生成和启动,Django和主管管理过程UWSGI部署方法,A请求将输入一个程序,但同时进行“接收”过程。
许多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 ['用户'],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'
老实说,直到到目前为止,我都不欣赏django。这不是我的认知中的微妙设计。这只是功能所积累的“成熟解决方案”。但是,一切的兴起都是时代的选择。您不喜欢它,但需要它。希望有一天,Python可以拥有越来越丰富的成熟解决方案,并且不再因性能和维护而受到批评。(Fit End)
将其本质带到滴度上,Django的优势很方便。我们的源代码阅读的目的是探索其便利性的本质。阅读源代码的计划对每个地方都不好,而是解释功能的功能。
django-admin startproject helloworld可以生成django项目。命令行是EXE格式。
manage.py将参数交给了命令行。
execute_from_command_line()通过命令行参数创建管理类。然后运行他的execute()。
如果设置了重新加载,请在启动之前检查_errors。
check_errs()是一个关闭,因此在上一篇文章的末尾是(django.setup)()。
查看最后一个句子设置.installed_apps.grab从设置
请注意,此设置不是我们项目中的设置。
这是设置类的懒负载包装包装,直到__getAttr __。然后从设置类的实例中获取值,然后说将其分配给您自己的__ -dict__(我会直接找到它下次我自己,因为__getAttr __优先级)
为了促进调试,我们直接编写一个run.py。
在项目下创建一个run.py,以模拟运行服务器命令
调试抓取设置_MODULE
回到setup()中的最后一句话
开始观看apps.populate()
首先查看本段
这些应用最终被封装在appconfig中。
随后,调用了每个AppConfig的import_models()和ready()方法。
应用程序的加载部分通常是这样的
为了促进调试,我们重写了最后一句话
RES的类型是命令django.contrib.staticfiles.management.commands.runserver.com和object at 0x00000101ED5163A0
重点是第二个句子,让我们跳到run_from_argv()方法,这是几个处理参数。
用Pycharm指向手柄将进入基类,该基类无法获得正确的方向。实际上,子类已重写此方法。
这里有两种情况。如果加载重新加载,它将直接执行inner_run(),并且项目首先从其他逻辑开始。
当Django项目启动时,它实际上将启动两次。如果我们在项目入口(Manage.py)中设置一个贴心,您会发现它将打印两次。
在第一个启动开始时,django_autoreload_env却没有,无法输入启动逻辑。将输入crandt_with_reloader()。
在这里,您将将django_autoreload_env放置为true,然后重新启动。
第二次,您可以输入启动逻辑。
在此创建一个Django主线程以传递innit_run()。
随后,此线程创建了一个旋转式,通过reloader.run(django_main_thread)询问监护过程。
让我们看一下django innion_run()的主线程。
当我们看到WSGI时,Django的启动逻辑已经结束。下一个作业已移交给WSGI服务器
这相当于我们之前在Fastapi中所说的话,然后将Fastapi的应用程序交给ASGI服务器(ASGI也是Django提出的,这两个基本上是同源的)
那么WSGI来自哪里?让我们回头回去
此设置是一个对象,它已从以前的操作中从settings.py配置文件中获取了自己的属性。因此,我们只需要转到settings.py配置文件即可找到。
让我们找到此get_wsgi_application()。
它将再次调用setup(),返回WSGIHANDLER类的实例很重要。
这是WSGIAPP本身。
load_middleware()是WSGIAPP构建中间件堆栈的唯一方法。
如果您之前阅读了FastAPI源代码,则应该对中间件堆栈不陌生。
应用程序入口→中间件堆栈→路由→路由节点→端点
因此,WSGIAPP已完成此操作,并将服务器传递到应用程序入口的请求中,并且可以通过中间件与该路由分配。
在Django项目中,我们需要使用独立于Django框架的某些脚本。这样,某些脚本可能需要独立运行并具有强大的维护。目前,主管可用于使用该字段。
直接使用PIP
使用主管很容易。您只需要修改一些配置文件即可使用它。
跑步
您可以看到默认配置情况,但是通常,我们不应修改默认配置。相反,将默认配置重定向到其他文件。不同的过程使用不同的配置文件来复制默认文件。
默认配置描述
解释了配置文件,并且非常简单,因此我不描述它。有一些建议可以修改其目录。如果您进行了修改,则应首先创建这些文件。您需要注意权限。
现在,让我们开始主管服务。
检查主管是否运行:
上面我们运行了SuberSrod,现在我们可以添加要管理的配置文件。您可以在Substisord.Conf文件中编写所有配置项目,但是不建议这样做。相反,不同程序(组)被写入不同的配置文件。是的,这是默认配置在默认配置结束时的末尾。
假设我们将项目配置文件放在此目录中:/etc/supervisor/
然后,我们需要修改include in /etc/supervisord.conf为::
测试PY文件:
以下是Configuration File Directory /etc/supervisor/test.conf:
配置完成后,可以运行:
查看运行状态
打开浏览器,输入127.0.0.9001,然后输入用户名和密码(如果在set_http_server中的配置文件中设置),您可以看到以下接口:
开始服务后,运行:
或直接监管
如果成功,您将输入supercorctl的外壳接口。有以下方法:
执行相关操作后,您可以在网络端看到特定更改,例如停止程序
实际上,您也可以使用suspisorctl shell接口,但在Bash终端运行:
根据官方文档的定义,a [program:x]实际上是指一组相同的功能或相似过程,也就是说,[program:x]可以启动多个进程。该过程的成员由该过程确定numProcs和process_name的两个参数。这句话是什么意思?让我们看这个示例。
上面的示例将启动两个进程,proces_names是foo:foo_01和foo:foo_02.in。
详细配置,单击此处
主管还提供另一种流程组管理方法。通过这种方式,可以使用supcortisorctl命令来管理一组进程。从[program:x]的进程组不同,此处的过程是[program:x]。
添加上述配置后,Program1和Progname2的过程名称将成为GroupName:program:program1 and theGroupName:“管理过程”而不是以前的protname1。
在SupervisorCtl停止groupname之后:您可以同时结束程序元和progname2,并执行supcordisorctl stop top thegroupname:the groupname:togral to end protName1。
实际上,默认情况下,主管也是一个过程。最理想的情况应作为系统服务安装。可以在此处引用安装方法。安装脚本在这里引用。因为没有具体的实验,所以这里没有解释。
实际上,还有另一种简单的方法,因为Linux启动时会在 /etc/rc.local中执行脚本,因此只要您在此处添加执行命令
需要在退出命令之前添加上述内容,并且由于执行RC.Local脚本时未初始化路径环境变量,因此需要与绝对路径一起使用该命令。
在添加之前,请测试是否可以在终端中正常执行命令。如果找不到主管,可以找到以下命令
如何打开Django的过程,让我们谈论引入过程的引入。感谢您花时间阅读本网站的内容。有关在Django开始时运行功能的更多信息,如何打开Django的过程,也不要忘记在此站点上找到它。