问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

django如何实现异步post

发布网友 发布时间:2024-10-06 01:04

我来回答

1个回答

热心网友 时间:2024-12-13 01:10

导读:今天首席CTO笔记来给各位分享关于django如何实现异步post的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

Django中怎么使用django-celery完成异步任务

许多Django应用需要执行异步任务,以便不耽误httprequest的执行.我们也可以选择许多方法来完成异步任务,使用Celery是一个比较好的选择,因为Celery

有着大量的社区支持,能够完美的扩展,和Django结合的也很好.Celery不仅能在Django中使用,还能在其他地方被大量的使用.因此一旦学会使用Celery,我

们可以很方便的在其他项目中使用它.

1.Celery版本

本篇博文主要针对Celery3.0.x.早期版本的Celery可能有细微的差别.

2.Celery介绍

Celery的主要用处是执行异步任务,可以选择延期或定时执行功能.为什么需要执行异步任务呢?

第一,假设用户正发起一个request,并等待request完成后返回.在这一request后面的view功能中,我们可能需要执行一段花费很长时间的程序任务,这一时间

可能远远大于用户能忍受的范围.当这一任务并不需要立刻执行时,我们便可以使用Celery在后台执行,而不影响用户浏览网页.当有任务需要访问远程服务器完

成时,我们往往都无法确定需要花费的时间.

第二则是定期执行某些任务.比如每小时需要检查一下天气预报,然后将数据储存到数据库中.我们可以编写这一任务,然后让Celery每小时执行一次.这样我们

的web应用便能获取最新的天气预报信息.

我们这里所讲的任务task,就是一个Python功能(function).定期执行一个任务可以被认为是延时执行该功能.我们可以使用Celery延迟5分钟调用function

task1,并传入参数(1,2,3).或者我们也可以每天午夜运行该function.

我们偏向于将Celery放入项目中,便于task访问统一数据库和Django设置.

当task准备运行时,Celery会将其放入列队queue中.queue中储存着可以运行的task的list.我们可以使用多个queue,但为了简单,这里我们只使用一个.

将任务task放入queue就像加入todolist一样.为了使task运行,我们还需要在其他线程中运行的苦工worker.worker实时观察着代运行的task,并逐一运行这

些task.你可以使用多个worker,通常他们位于不同服务器上.同样为了简单起见,我们这只是用一个worker.

我们稍后会讨论queue,worker和另外一个十分重要的进程,接下来我们来动动手:

3.安装Celery

我们可以使用pip在vietualenv中安装:

pipinstalldjango-celery

4.Django设置

我们暂时使用djangorunserver来启动celery.而Celery代理人(broker),我们使用Djangodatabasebrokerimplementation.现在我们只需要知道Celery

需要broker,使用django自身便可以充当broker.(但在部署时,我们最好使用更稳定和高效的broker,例如Redis.)

在settings.py中:

importdjcelery

djcelery.setup_loader()

BROKER_URL='django://'

...

INSTALLED_APPS=(

...

'djcelery',

'kombu.transport.django',

...

)

第一二项是必须的,第三项则告诉Celery使用Django项目作为broker.

在INSTALLED_APPS中添加的djcelery是必须的.kombu.transport.django则是基于Django的broker

最后创建Celery所需的数据表,如果使用South作为数据迁移工具,则运行:

pythonmanage.pymigrate

否则运行:(Django1.6或Django1.7都可以)

pythonmanage.pysyncdb

5.创建一个task

正如前面所说的,一个task就是一个Pyhtonfunction.但Celery需要知道这一function是task,因此我们可以使用celery自带的装饰器decorator:@task.在

djangoapp目录中创建taske.py:

fromceleryimporttask

@task()

defadd(x,y):

returnx+y

当settings.py中的djcelery.setup_loader()运行时,Celery便会查看所有INSTALLED_APPS中app目录中的tasks.py文件,找到标记为task的function,并

将它们注册为celerytask.

将function标注为task并不会妨碍他们的正常执行.你还是可以像平时那样调用它:z=add(1,2).

6.执行task

让我们以一个简单的例子作为开始.例如我们希望在用户发出request后异步执行该task,马上返回response,从而不阻塞该request,使用户有一个流畅的访问

过程.那么,我们可以使用.delay,例如在在views.py的一个view中:

frommyapp.tasksimportadd

...

add.delay(2,2)

...

Celery会将task加入到queue中,并马上返回.而在一旁待命的worker看到该task后,便会按照设定执行它,并将他从queue中移除.而worker则会执行以下代

码:

importmyapp.tasks.add

myapp.tasks.add(2,2)

7.关于import

这里需要注意的是,在impprttask时,需要保持一致.因为在执行djcelery.setup_loader()时,task是以INSTALLED_APPS中的app名,

加.tasks.function_name注册的,如果我们由于pythonpath不同而使用不同的引用方式时(例如在tasks.py中使用frommyproject.myapp.tasksimport

add形式),Celery将无法得知这是同一task,因此可能会引起奇怪的bug.

8.测试

a.启动worker

正如之前说到的,我们需要worker来执行task.以下是在开发环境中的如何启动worker:

首先启动terminal,如同开发django项目一样,激活virtualenv,切换到django项目目录.然后启动django自带web服务器:pythonmanage.pyrunserver.

然后启动worker:

pythonmanage.pyceleryworker--loglevel=info

此时,worker将会在该terminal中运行,并显示输出结果.

b.启动task

打开新的terminal,激活virtualenv,并切换到django项目目录:

$pythonmanage.pyshell

frommyapp.tasksimportadd

add.delay(2,2)

此时,你可以在worker窗口中看到worker执行该task:

[2014-10-0708:47:08,076:INFO/MainProcess]Gottaskfrombroker:myapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc]

[2014-10-0708:47:08,299:INFO/MainProcess]Taskmyapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc]succeededin0.183349132538s:4

9.另一个例子

下面我们来看一个更为真实的例子,在views.py和tasks.py中:

#views.py

frommyapp.tasksimportdo_something_with_form_data

defview(request):

form=SomeForm(request.POST)

ifform.is_valid():

data=form.cleaned_data

#Scheleatasktoprocessthedatalater

do_something_with_form_data.delay(data)

returnrender_to_response(...)

#tasks.py

@task

defdo_something_with_form_data(data):

call_slow_web_service(data['user'],data['text'],...)

10.调试

由于Celery的运行需要启动多个部件,我们可能会漏掉一两个.所以我们建议:

使用最简单的设置

使用pythondebug和logging功能显示当前的进程

11.Eager模式

如果在settings.py设置:

CELERY_ALWAYS_EAGER=True

那么Celery便以eager模式运行,则task便不需要加delay运行:

#若启用eager模式,则以下两行代码相同

add.delay(2,2)

add(2,2)

12.查看queue

因为我们使用了django作为broker,queue储存在django的数据库中.这就意味着我们可以通过djangoadmin查看该queue:

#admin.py

fromdjango.contribimportadmin

fromkombu.transport.djangoimportmodelsaskombu_models

admin.site.register(kombu_models.Message)

13.检查结果

每次运行异步task后,Celery都会返回AsyncResult对象作为结果.你可以将其保存,然后在将来查看该task是否运行成功和返回结果:

#views.py

result=add.delay(2,2)

...

ifresult.ready():

print"Taskhasrun"

ifresult.successful():

print"Resultwas:%s"%result.result

else:

ifisinstance(result.result,Exception):

print"Taskfailedetoraisinganexception"

raiseresult.result

else:

print"Taskfailedwithoutraisingexception"

else:

print"Taskhasnotyetrun"

14.定期任务

还有一种Celery的常用模式便是执行定期任务.执行定期任务时,Celery会通过celerybeat进程来完成.Celerybeat会保持运行,一旦到了某一定期任务需要执

行时,Celerybeat便将其加入到queue中.不像worker进程,Celerybeat只有需要一个即可.

启动Celerybeat:

pythonmanage.pycelerybeat

使Celery运行定期任务的方式有很多种,我们先看第一种,将定期任务储存在django数据库中.即使是在django和celery都运行的状态,这一方式也可以让我们

方便的修改定期任务.我们只需要设置settings.py中的一项便能开启这一方式:

#settings.py

CELERYBEAT_SCHEDULER='djcelery.schelers.DatabaseScheler'

Django配置Celery执行异步和同步任务(tasks))

celery是一个基于python开发的简单、灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线程上执行任务调度。采用典型的生产者-消费者模型,主要由三部分组成:

比如系统上线前后台批量导入历史数据,发送短信、发送邮件等耗时的任务

1.安装RabbitMQ,这里我们使用RabbitMQ作为broker,安装完成后默认启动了,也不需要其他任何配置

Ubuntulinux安装

CentOSLinux安装

苹果mac安装需要配置

配置环境变量(苹果用户)

启动rabbitmq-server

2.安装celery

3.celery用在django项目中,django项目目录结构(简化)如下

4.创建oa/celery.py主文件

5.在oa/__init__.py文件中增加如下内容,确保django启动的时候这个app能够被加载到

6.各应用创建tasks.py文件,这里为users/tasks.py

7.views.py中引用使用这个tasks异步处理

8.启动celery

9.这样在调用post这个方法时,里边的add就可以异步处理了

定时任务的使用场景就很普遍了,比如我需要定时发送报告给老板~

1.oa/celery.py文件添加如下配置以支持定时任务crontab

3.启动celerybeat,celery启动了一个beat进程一直在不断的判断是否有任务需要执行

使用django开发一个比较简单的post接口

先把前置条件说一下

1.首先搭建好django环境win+r打开命令提示符pipinstalldjango

3.然后创建一个自己的app

同样在命令提示符进入刚创建的工程所在路径输入pythonmanage.pystartappxxx(这个指你要创建的app名字),创新编辑器可以看到

4.正式开始开发一个post请求

首先设置好参数在seetings.py文件里如图修改

views.py

最后在templates文件夹下创建一个html文件简单地写一下前端

我这里直接贴自己写的login.html

code部分算是完成看一下效果

还可以进入fiddler查看验证,为了比较好查到我们先打开fiddler后输入用户名密码后fiddler上removeallsession

可以得到这么一条数据包

username,password的值也和我们输入的一致

到此完成一个简单的post请求开发

怎么在Django中向另外的ip发送Post请求

一、需要用到的场景在jQuery中使用$.post()就可以方便的发起一个post请求,在android程序中有时也要从服务器获取一些数据,就也必须得使用post请求了。

二、需要用到的主要类在android中使用post请求主要要用到的类是HttpPost、HttpResponse、

如何在Django使用ajax的POST

Django本身和ajax无关。

但是由于Django包含一套模板系统,你可以简单地将它理解为前端页面,在这些模板中,就像你作为一个前端工程师在html编写页面中,一样地使用ajax的POST方法。

Django可以在视图中,通过request.POST.get("xxx")的方法,接收ajax传过来的数据。

额外提醒,ajax的POST需要注意CSRF的安全问题,Django官方有现成的解决方案,到官方文档找到代码,贴到你的js中。

更多内容可以关注我的博客。

结语:以上就是首席CTO笔记为大家介绍的关于django如何实现异步post的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
这种情况需要准备什么样的证据才能保证维权成功,关于个人知识产权方面... 侵犯著作权罪成立的条件是什么 网站被抄袭,怎么办?官网网页内容抄袭引发的法律问题 版权申请哪家性价比高? 著作权侵权损害如何赔偿 瓷砖划痕怎么处理方法 地板砖划痕怎么去除十种方法 关于梦幻西游转区的一些问题。懂的进。 茶叶泡水发苦的原因茶叶泡水发苦是什么原因 ...那又怎么样?从化学角度讲不也是那种分子起的作 全国天气预报信息 API 接口 DELL E4300 蓝牙打不开,什么情况? 红米充不进电是怎么回事? 红米2充不进电是什么原因啊? ...戴尔E4300笔记本电脑,如何开启数字小键盘啊?没有numlock按钮_百度知... 俄国为什么否定了米格1.44成为五代机的方案?J20的成功试飞不就是等于... 可以告诉我索爱的j20怎么样吗?o(∩_∩)o 索爱j20和诺基亚6700s,选哪个好。帮忙抉择下。。 今天我用苹果在91助手上更新了个UC浏览器,但是更新UC后就卡屏了出现了... uc浏览器新标签页的圆圆东西能换成以前的方块吗,感觉好好华而不实_百 ... 如何关掉uc浏览器上的绿圆 空调机组的种类有哪些 ...主要功能是看看电影、电视剧、浏览网页与跟我开视频。 打开了很多网页后。电脑总是重新启动,求救拉.好心的朋友快帮帮我_百度... ...桌面多了购物淘宝 和 internet explorer internet Exploerr 我应该... 我小汽车从道路上公路辅道,右转弯开的很慢,约15-20公里时速,有个摩... IE劫持图标删不掉怎么办? 成都限行是怎样的呢,郊区的小车进城应该怎样规划行程呢 ...出现一个名为Internet Explorer6的文件夹,删不了。提示对于目标文件... 小轿车在右转弯辅道正常右转,与逆向穿白实线变道的电动车相撞,责任该... win10电脑没有蓝牙怎么添加蓝牙 MyBatis-Plus实现逻辑删除[MyBatis-Plus系列] - 492篇 土豆和这些菜炖在一起就是绝配,你最喜欢吃土豆和哪 秋天土豆跟此是绝配,焖一焖鲜香又营养,贴秋膘吃正合适,超下饭 土豆的神仙吃法有哪些? 你解锁过哪些关于土豆的神仙吃法? 什么是猫传染性腹膜炎啊? 如何当好新时期乡镇党委书记乡镇长 周国平先生的经典语录 爱情语录 晚年人生哲理语录 小区如何防盗 小区一楼如何防盗 楼房如何防盗 高层小区如何防盗 小区房如何防盗 小区底层如何防盗 小区防盗知识宣传 打造社区安全生活环境 霜雪亭地址在哪里? 小区居民如何预防入室抢劫 人民公园-季子亭地址在哪里? 中山公园-枕茵亭地址在哪里?