2010-04-11 28 views
1

我想使用Django构建API服务。基本的工作流程如下:在Django中构建API服务

首先,http请求转到http://mycompany.com/create?id=001&callback=http://callback.com。它会在名称为001的服务器上创建一个文件夹。

其次,如果该文件夹不存在,它将被创建。您立即以XML格式获得回应。它看起来像:

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <status> 
     <statusCode>0</statusCode> 
     <message>Success</message> 
    </status> 
    <group id="001"/> 
</response> 

最后,服务器将完成它的工作(即创建文件夹)。完成后,服务器会对提供的URL进行回调。

目前,我用

return render_to_response('create.xml', {'statusCode': statusCode, 
                'statusMessage': statusMessage, 
                'groupId': groupId, 
                }, mimetype = 'text/xml') 

发送XML响应返回。我有一个XML模板,它有statusCodestatusMessagegroupId占位符。

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <status> 
     <statusCode>{{ statusCode }}</statusCode> 
     <message>{{ statusMessage }}</message> 
    </status> 
    {% if not statusCode %} 
     <group id="{{ groupId }}"/> 
    {% endif %} 
</response> 

但这种方式我已经把第3步第2步之前,否则一步,如果是后return声明3将不会被执行。

有人可以给我一些建议如何做到这一点?谢谢。

回答

4

我有一种感觉,你可能会错过这里的一些Django基础知识。

为什么create.py在您的网址内?

如果您使用的是Django的url路由和视图,render_to_response应该可以正常工作。你可能会跳到一个关于为什么你的回应没有得到回报的错误结论。

我不知道我理解的语句:

但这种方式我已经把第3步 第2步之前,否则步骤 3如果是后 收益将不会被执行声明。

步骤3不在return语句之后。它是返回声明的一部分。

你总是可以做这样的事情分裂过程:

# Code that creates folder, statusCode, statusMessage, groupId 
response = render_to_response('create.xml', {'statusCode': statusCode, 
                'statusMessage': statusMessage, 
                'groupId': groupId, 
                }, mimetype = 'text/xml') 
# Some other code, maybe an import pdb; pdb.set_trace() 
# So that you can inspect the response inside of a python shell. 
return response 
+0

谢谢回答。是的,应该是'http://mycompany.com/create?params ...'我也在'url.py'中定义了URL。我的意思是渲染XML和创建文件夹是两个独立的步骤。我想先返回XML(紧接在HTTP请求之后),然后创建文件夹。应该在创建文件夹后进行回调。 – zihaoyu 2010-04-11 19:29:39

+0

好的。你可能需要设计一些创意。如果您想在之后创建文件夹,您将需要某些待处理文件夹的队列。队列的数据必须在请求之间持续存在。您可能需要创建一个模型,例如FolderQueue,您可以在其中隐藏所有待创建的文件夹。因为它是一个完整的模型,所以它可以非常健壮并跟踪各种数据(创建它的人,创建时的名称,名称等等)。 可能不是最简单的,但它的强大,并仍然非常容易做到感谢orm。 – Koobz 2010-04-11 19:43:05

+0

另一种方法是在会话中存储数据,但这是在寻求麻烦。使用队列方法,至少它有点惯用和自我记录,而不是一起欺骗;) – Koobz 2010-04-11 19:45:14

2

可以使用celery为TE队列的问题

+0

谢谢,这应该是有帮助的。 – zihaoyu 2010-04-11 23:21:59