我有django的问题,
就好像,当用户提交一些数据时,它会进入view.py
进行处理,最终会进入成功页面。
但过程太长了。我不希望用户等待那么长时间。我想要的是在用户提交数据后立即进入成功页面。服务器将在之后处理数据返回成功页面。
你能告诉我如何处理它吗? 这是我的代码,但我不知道它为什么不起作用。
url.py
from django.conf.urls import patterns, url
from hebeu.views import handleRequest
urlpatterns = patterns('',
url(r'^$', handleRequest),
)
view.py
def handleRequest(request):
if request.method == 'POST':
response = HttpResponse(parserMsg(request))
return response
else:
return None
def parserMsg(request):
rawStr = smart_str(request.body)
msg = paraseMsgXml(ET.fromstring(rawStr))
queryStr = msg.get('Content')
openID = msg.get('FromUserName')
arr = smart_unicode(queryStr).split(' ')
#start a new thread
cache_classroom(openID,arr[1],arr[2],arr[3],arr[4]).start()
return "success"
我的英语不好,我希望你能理解。
答案 0 :(得分:1)
看看Celery,它是一个分布式任务队列,可以完美地处理您的情况。有一些设置可以让一切正常工作,但是一旦Celery真的很容易使用。
与Django集成从这里开始:http://docs.celeryproject.org/en/latest/django/index.html
答案 1 :(得分:1)
为parseMsg编写一个管理命令,并使用subprocess.popen触发该命令,并将成功返回给用户,parseMsg进程将在后台运行。如果这种操作在应用程序中更多,那么你应该使用芹菜。
答案 2 :(得分:1)
这很安静,使用下面的代码将#start封装成一个新线程
from threading import Thread
from datetime import datetime
class ProcessThread(Thread):
def __init__(self, name):
Thread.__init__(self)
self.name = name
self.started = datetime.now()
def run(self):
cache_classroom(openID,arr[1],arr[2],arr[3],arr[4]).start()
# I added this so you might know how long the process lasted
# just incase any optimization of your code is needed
finished = datetime.now()
duration = (self.start - finished).seconds
print "%s thread started at %s and finished at %s in "\
"%s seconds" % (self.name, self.started, finished, duration)
# let us now run start the thread
my_thread = ProcessThread("CacheClassroom")
my_thread.start()