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

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

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

字符型

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

sendData = {
 \"exporttype\": exporttype,

\"bugids\": bugids,

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

};

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

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

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

结果示例:

Excle type \'unicode\'

数组型

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

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

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

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

结果示例:

•传递的url

[14/Jul/2016 11: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里面的一个方法。

def GET(self):

# The WSGI spec says \'QUERY_STRING\' may be absent.

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

return http.QueryDict(raw_query_string, encoding=self._encoding)

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

•MultiValueDict

其实源码看起来并不难。

def get(self, key, default=None):

\"\"\"

Returns the last data value for the passed key. If key doesn\'t exist

or value is an empty list, then default is returned.

\"\"\"

try:

val = self[key]

except KeyError:

return default

if val == []:

return default

return val

def getlist(self, key, default=None):

\"\"\"

Returns the list of values for the passed key. If key doesn\'t exist,

then a default value is returned.

\"\"\"

try:

return super(MultiValueDict, self).__getitem__(key)

except KeyError:

if default is None:

return []

return default

def __getitem__(self, key):

\"\"\"

Returns the last data value for this key, or [] if it\'s an empty list;

raises KeyError if not found.

\"\"\"

try:

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

except KeyError:

raise MultiValueDictKeyError(repr(key))

try:

return list_[-1]

except IndexError:

return []

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

django views怎么返回json

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

class Category(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)

def toJSON(self):

import json

return json.dumps(dict([(attr, getattr(self, attr)) for attr in [f.name for f in self._meta.fields]]))

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

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

print row.toJSON()

django怎样返回一个页面

定义一个页面模版hello.html

定义好url

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

访问上面定义的url

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

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

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

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

1. Celery版本

本篇博文主要针对Celery 3.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就像加入todo list一样. 为了使task运行, 我们还需要在其他线程中运行的苦工worker. worker实时观察着代运行的task, 并逐一运行这

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

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

3. 安装Celery

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

pip install django-celery

4. Django设置

我们暂时使用django runserver来启动celery. 而Celery代理人(broker), 我们使用Django database broker implementation. 现在我们只需要知道Celery

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

在settings.py中:

import djcelery

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作为数据迁移工具, 则运行:

python manage.py migrate

否则运行: (Django 1.6或Django 1.7都可以)

python manage.py syncdb

5. 创建一个task

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

django app目录中创建taske.py:

from celery import task

@task()

def add(x, y):

return x + y

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

将它们注册为celery task.

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

6. 执行task

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

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

from myapp.tasks import add

...

add.delay(2, 2)

...

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

码:

import myapp.tasks.add

myapp.tasks.add(2, 2)

7. 关于import

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

加.tasks.function_name注册的, 如果我们由于python path不同而使用不同的引用方式时(例如在tasks.py中使用from myproject.myapp.tasks import

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

8. 测试

a. 启动worker

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

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

然后启动worker:

python manage.py celery worker --loglevel=info

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

b. 启动task

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

$ python manage.py shell

from myapp.tasks import add

add.delay(2, 2)

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

[2014-10-07 08:47:08,076: INFO/MainProcess] Got task from broker: myapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc]

[2014-10-07 08:47:08,299: INFO/MainProcess] Task myapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc] succeeded in 0.183349132538s: 4

9. 另一个例子

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

# views.py

from myapp.tasks import do_something_with_form_data

def view(request):

form = SomeForm(request.POST)

if form.is_valid():

data = form.cleaned_data

# Schedule a task to process the data later

do_something_with_form_data.delay(data)

return render_to_response(...)

# tasks.py

@task

def do_something_with_form_data(data):

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

10. 调试

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

使用最简单的设置

使用python debug和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的数据库中. 这就意味着我们可以通过django admin查看该queue:

# admin.py

from django.contrib import admin

from kombu.transport.django import models as kombu_models

admin.site.register(kombu_models.Message)

13. 检查结果

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

# views.py

result = add.delay(2, 2)

...

if result.ready():

print \"Task has run\"

if result.successful():

print \"Result was: %s\" % result.result

else:

if isinstance(result.result, Exception):

print \"Task failed due to raising an exception\"

raise result.result

else:

print \"Task failed without raising exception\"

else:

print \"Task has not yet run\"

14. 定期任务

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

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

启动Celerybeat:

python manage.py celery beat

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

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

# settings.py

CELERYBEAT_SCHEDULER = \'djcelery.schedulers.DatabaseScheduler\'

Django 前台与后台交互问题

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

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

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

jquery ajax请求。看下面的示例代码

//这是一个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异步怎么返回前端的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

以上内容为新媒号(sinv.com.cn)为大家提供!新媒号,坚持更新大家所需的互联网后端知识。希望您喜欢!

版权申明:新媒号所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 k2#88.com(替换@) 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023-09-24 10:08
下一篇 2023-09-24 10:08

相关推荐

  • 区块链误区有哪些(区块链可怕之处)

    区块链技术存在的不足的地方有哪些? 节点的不平等 第一,理论上,分布式网络中每个节点应当被平等对待,但是为了挖矿获得回报,各节点可能会增加算力进行硬件竞赛,从而导致节点的不平等,破...

    2023-09-23
  • typecho目录插件?

    求一款好用的Typecho高亮插件 1、然后登陆进入Typecho的后台,点击“控制台” - “外观”。然后点击“编辑当前外观” - “header.php”,在左边的代码框中找到...

    2023-09-23
  • 多看微信读书哪个好

    导读:今天新媒号来给各位分享关于多看微信读书哪个好的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! 本文目录一览: 1、多看和微信读书哪个好 2、我为什么要...

    2023-03-09
  • 蛋断法原理(蛋断减肥原理)

    那个312锻炼法和那个叫祝总骧的到底是不是骗人的 1、只是起到一个缓解作用,眼睛疾病的种类非常多,常见的有白内障、青光眼、近视眼、结膜炎、干眼症等,单靠一种锻炼方式不能根治,还是要...

    2023-09-27
  • 满城有什么区块链(满城都有哪些小区)

    区块链公司有哪些? 如下: 目前几乎所有互联网公司都开始做区块链了。传统的金融公司大都有参与。纯区块链正经公司有做一些技术研发的,包括云象、趣链、太一;也有做公链主链的,比如迅雷、...

    2023-03-08
  • 区块链是期权是什么?

    区块链是什么 1、区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式,它是比特币的一个底层运用技术。 2、区块链是什么意思?区块链是一种分布式数据库技...

    2023-10-03
  • 如何将文件转换成zip?

    怎么将文件压缩成zip格式? 压缩文件成zip格式的方法: 品牌型号:华硕 系统版本:UX30K723A 软件版本:win7 1、首先,我们需要下载一个压缩软件,例如WinRAR。...

    2023-09-24
  • 微信支付关闭哪个开关好(2023年最新解答)

    导读:很多朋友问到关于微信支付关闭哪个开关好的相关问题,本文新媒号就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧! 使用微信、支付宝要留意了,这2个功能最好关...

    2023-03-09
  • 元宇宙靠什么,元宇宙靠什么实现

    什么是元宇宙,如何去实现它? 关于元宇宙的理解,我们可以把它当做一个无限逼近于现实世界的虚拟世界。在这个虚拟世界当中,我们可以完成一切我们想要完成的事情,比如仿佛真实的探索游戏世界...

    2023-03-08
  • 微信验证过多封多久

    导读:本篇文章新媒号来给大家介绍有关微信验证过多封多久的相关内容,希望对大家有所帮助,一起来看看吧。 本文目录一览: 1、微信号一般封多久就自动解封? 2、微信登录验证码过于频繁要...

    2023-03-09

发表回复

登录后才能评论