django异步怎么返回前端(2023年最新解答)

如题所述

第1个回答  2024-09-04

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

Django接受前端数据的几种方法

字符型

字符型的数据相对好获取,前端传递的方法如下:

sendData={"exporttype":exporttype,

"bugids":bugids,

"test":JSON.stringify({"test":"test"})

};

在Django的后端只要使用exporttype=request.GET.get("exporttype")

就能正常的获取到这个数据了。

注意:在Python2.7中数据是unicode编码的,如果要使用,有时候需要进行转str

结果示例:

Excletype'unicode'

数组型

获取数组型的数据如果使用获取字符串的数据的方法,打出的结果是None。我们要使用这个方法:

bugids=request.GET.getlist("bugids[]")

这样获取的数据就是数组类型。

注意:获取的数组中的元素是unicode编码的,在某些时候使用需要转编码

结果示例:

?传递的url

[14/Jul/201611:00:41]"GET/testtools/exportbug/?exporttype=Exclebugids%5B%5D=102bugids%5B%5D=101bugids%5B%5D

?获取的数据

[u'102',u'101',u'100',u'99',u'98',u'97',u'96',u'95',u'94',u'93',u'92',u'91',u'90',u'89',u'88',u'87'

字典型

字典型数据其实可以当成字符串数据来处理,获取到对应字符串后使用JSON模块做一下格式化就行了。

对于前端来说,传递字典型的数据就是传递JSON数据,所以使用的方法是:

"test":JSON.stringify({"test":"test"})

结果示例:

{"test":"test"}type'unicode'

相关源码

?Get方法

Get方法是wsgi里面的一个方法。

defGET(self):

#TheWSGIspecsays'QUERY_STRING'maybeabsent.

raw_query_string=get_bytes_from_wsgi(self.environ,'QUERY_STRING','')

returnhttp.QueryDict(raw_query_string,encoding=self._encoding)

最终返回的是一个http.QueryDict(raw_query_string,encoding=self._encoding)http的原始数据,而QueryDict继承于MultiValueDict,所以我们直接看MultiValueDict就好了。

?MultiValueDict

其实源码看起来并不难。

defget(self,key,default=None):

"""

Returnsthelastdatavalueforthepassedkey.Ifkeydoesn'texist

orvalueisanemptylist,thendefaultisreturned.

"""

try:

val=self[key]

exceptKeyError:

returndefault

ifval==[]:

returndefault

returnval

defgetlist(self,key,default=None):

"""

Returnsthelistofvaluesforthepassedkey.Ifkeydoesn'texist,

thenadefaultvalueisreturned.

"""

try:

returnsuper(MultiValueDict,self).__getitem__(key)

exceptKeyError:

ifdefaultisNone:

return[]

returndefault

def__getitem__(self,key):

"""

Returnsthelastdatavalueforthiskey,or[]ifit'sanemptylist;

raisesKeyErrorifnotfound.

"""

try:

list_=super(MultiValueDict,self).__getitem__(key)

exceptKeyError:

raiseMultiValueDictKeyError(repr(key))

try:

returnlist_[-1]

exceptIndexError:

return[]

djangoviews怎么返回json

直接利用python提供的json包,在djangomodel的定义中增加一个方法toJSON,利用djangomodel能访问_meta.fields得到相关属性而得到,例子如下:

classCategory(models.Model):

autoid=models.AutoField(primary_key=True)

email=models.CharField(max_length=150,blank=False)

comtype=models.CharField(max_length=20,blank=False)

catname=models.CharField(max_length=150,blank=False)

def__unicode__(self):

return'%s'%(self.catname)

deftoJSON(self):

importjson

returnjson.dumps(dict([(attr,getattr(self,attr))forattrin[f.nameforfinself._meta.fields]]))

然后用django查出数据,并转换成json,代码如下:

row=models.Category.objects.get(autoid=23)

printrow.toJSON()

django怎样返回一个页面

定义一个页面模版hello.html

定义好url

定义一个view,最后render(request,'hello.html',locals())

访问上面定义的url

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

#Scheduleatasktoprocessthedatalater

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"Taskfailedduetoraisinganexception"

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.schedulers.DatabaseScheduler'

Django前台与后台交互问题

你这个问题描述,着实有点让人费解。感觉你对这方面了解不深,所以一般像你这样的问题很少会有人回答,因为回答之后,你会有更多的疑问,甚至是一直问下去。

在学习的过程中,你要学会自己去搜索解决....

Django。如果你看过官方文档的话,查询数据并把列表传到前台。肯定没问题,很简单的几行代码。如果你不会,那就去查看相应版本的django文档。

jqueryajax请求。看下面的示例代码

//这是一个ajax异步请求,使用post方法

$.ajax({type:?"POST",

????????url:?"/message/",

????????data:?{

????????telnum:?$("#telnum").val(),

????????ordernum:?$("#ordernum").val(),

????????mesgchannel:?$("#mesgchannel").val(),

????????mesglevel:?$("#mesglevel").val(),

????????starttime:?$("#datepicker1").val(),

????????endtime:?$("#datepicker2").val()

????????},

????????success:?function(response){

????????$('#result').html(response);

????????}

});

//下面这个是异步请求成功之后,用于接收数据的html标签

div

??div?id="result"?class="alert"/div

/div

结语:以上就是首席CTO笔记为大家整理的关于django异步怎么返回前端的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

logo设计

创造品牌价值

¥500元起

APP开发

量身定制,源码交付

¥2000元起

商标注册

一个好品牌从商标开始

¥1480元起

公司注册

注册公司全程代办

¥0元起

    官方电话官方服务
      官方网站八戒财税知识产权八戒服务商企业需求数字市场
相似回答
大家正在搜