Python 我应该担心Django模板效率低下吗?
我对Django比较陌生,我正在使用1.5版构建RESTAPI。对api的调用期望返回JSON(我将其用于Ember.js前端) 我想知道我是否不能这样做:Python 我应该担心Django模板效率低下吗?,python,django,json,django-templates,ember-data,Python,Django,Json,Django Templates,Ember Data,我对Django比较陌生,我正在使用1.5版构建RESTAPI。对api的调用期望返回JSON(我将其用于Ember.js前端) 我想知道我是否不能这样做: def listproject(request, pk_id): # list single project at /projects/<pk_id> project = Project.objects.get(pk = pk_id) snapshots = Snapshot.objects.filter(proje
def listproject(request, pk_id):
# list single project at /projects/<pk_id>
project = Project.objects.get(pk = pk_id)
snapshots = Snapshot.objects.filter(project = project)
# (both are same up to here)
return render_to_response('project.json',
{"project":project, "snapshots":snapshots},
mimetype="text/json")
与Django共事的时间比我长得多的人认为,使用模板来实现这一点效率低下。他建议我做以下几点:
def listproject(request, pk_id):
# list single project at /projects/<pk_id>
project = Project.objects.get(pk = pk_id)
snapshots = Snapshot.objects.filter(project = project)
# (both are same up to here)
ret_json = []
ret_json.append('{"id": "' + str(project.pk) + '", ')
ret_json.append('"name": "' + project.name + '", "snapshot_ids": [')
snapshot_json = []
for snapshot in snapshots:
snapshot_json.append('"' + str(snapshot.pk) + '",')
ret_json.append(''.join(snapshot_json)[0:-1] + ']}')
return HttpResponse(content=''.join(ret_json), mimetype="text/json")
def列表项目(请求,主键id):
#在/个项目中列出单个项目/
project=project.objects.get(pk=pk\u id)
快照=快照.objects.filter(项目=项目)
#(到目前为止,两者都是相同的)
ret_json=[]
ret_json.append(“{”id:“'+str(project.pk)+',”)
ret_json.append(“'name:”+project.name+”,“snapshot_id:[”)
快照_json=[]
对于快照中的快照:
snapshot_json.append(“”+str(snapshot.pk)+“,”)
ret_json.append(''.join(快照_json)[0:-1]+']}')
返回HttpResponse(content=''.join(ret_json),mimetype=“text/json”)
我都试过了。虽然我的版本生成了更可读的JSON,但它们的工作原理相同
请帮助我们结束辩论!哪个更有效(为什么)?Django模板确实不是特别有效。但是,只有当您有非常大的模板,并且这些模板本身扩展或包含许多其他模板时,例如在复杂的内容管理系统中,这才是真正的问题。对于包含少量字段的单个模板,与服务请求的总体开销相比,模板呈现是微不足道的 也就是说我对你的两个选择都有点困惑。为什么不通过标准的
JSON
库生成JSON?这是正确的方法,而不是在模板或Python代码中构建字符串
ret = {'id': project.id,
'name': project.name,
'snapshot_ids': [snapshot.id for snapshot in snapshots]}
ret_json = json.dumps(ret)
Django模板确实不是特别有效。但是,只有当您有非常大的模板,并且这些模板本身扩展或包含许多其他模板时,例如在复杂的内容管理系统中,这才是真正的问题。对于包含少量字段的单个模板,与服务请求的总体开销相比,模板呈现是微不足道的 也就是说我对你的两个选择都有点困惑。为什么不通过标准的
JSON
库生成JSON?这是正确的方法,而不是在模板或Python代码中构建字符串
ret = {'id': project.id,
'name': project.name,
'snapshot_ids': [snapshot.id for snapshot in snapshots]}
ret_json = json.dumps(ret)
这两种选择在我看来都很可怕。我希望尽可能避免“手工编写”JSON,而只是直接从Python数据结构转换 幸运的是,
json
模块就是为此而设计的
import json
def listproject(request, pk_id):
# list single project at /projects/<pk_id>
project = Project.objects.get(pk=pk_id)
snapshots = Snapshot.objects.filter(project=project)
data = {
"id": project.pk,
"name": project.name,
"snapshot_ids": [snapshot.pk for snapshot in snapshots],
}
return HttpResponse(content=json.dumps(data), mimetype="text/json")
导入json
def列表项目(请求、主键id):
#在/个项目中列出单个项目/
project=project.objects.get(pk=pk\u id)
快照=快照.objects.filter(项目=项目)
数据={
“id”:project.pk,
“名称”:project.name,
“快照_id”:[快照中快照的snapshot.pk],
}
返回HttpResponse(content=json.dumps(data),mimetype=“text/json”)
避免“手工编写”代码的原因显而易见——避免打字错误,代码更短更简单,json模块可能更快
如果您担心生成的JSON的“可读性”,JSON模块会提供一些选项来控制输出(缩进等):这两个选项对我来说都很可怕。我希望尽可能避免“手工编写”JSON,而只是直接从Python数据结构转换 幸运的是,
json
模块就是为此而设计的
import json
def listproject(request, pk_id):
# list single project at /projects/<pk_id>
project = Project.objects.get(pk=pk_id)
snapshots = Snapshot.objects.filter(project=project)
data = {
"id": project.pk,
"name": project.name,
"snapshot_ids": [snapshot.pk for snapshot in snapshots],
}
return HttpResponse(content=json.dumps(data), mimetype="text/json")
导入json
def列表项目(请求、主键id):
#在/个项目中列出单个项目/
project=project.objects.get(pk=pk\u id)
快照=快照.objects.filter(项目=项目)
数据={
“id”:project.pk,
“名称”:project.name,
“快照_id”:[快照中快照的snapshot.pk],
}
返回HttpResponse(content=json.dumps(data),mimetype=“text/json”)
避免“手工编写”代码的原因显而易见——避免打字错误,代码更短更简单,json模块可能更快
如果您担心生成的JSON的“可读性”,JSON模块会提供一些选项来控制输出(缩进等):我通常使用这个小功能:
import json
from django.http import HttpResponse
def json_response(ob):
return HttpResponse(
json.dumps(ob), mimetype="application/json")
因此,您可以从视图中返回结果:
def listproject(request, pk_id):
project = Project.objects.get(pk=pk_id) # Use get_object_or_404 ?
snapshots = Snapshot.objects.filter(project=project)
return json_response({
"id": project.pk,
"name": project.name,
"snapshot_ids": [snapshot.pk for snapshot in snapshots],
})
我通常使用这个小功能:
import json
from django.http import HttpResponse
def json_response(ob):
return HttpResponse(
json.dumps(ob), mimetype="application/json")
因此,您可以从视图中返回结果:
def listproject(request, pk_id):
project = Project.objects.get(pk=pk_id) # Use get_object_or_404 ?
snapshots = Snapshot.objects.filter(project=project)
return json_response({
"id": project.pk,
"name": project.name,
"snapshot_ids": [snapshot.pk for snapshot in snapshots],
})
你为什么只问效率?这不是唯一的标准(您编写Python时,开始时的速度比必要时慢好几倍!)。写作和修改的容易程度如何?那么可理解性呢?很好!不过,这是为生产代码设计的,所以它的要求要严格一些。Daniel和Anentropic的答案除了是“正确的方式”之外,更易于书写、更改和理解。到处都是职业选手!你为什么只问效率?这不是唯一的标准(您编写Python时,开始时的速度比必要时慢好几倍!)。写作和修改的容易程度如何?那么可理解性呢?很好!不过,这是为生产代码设计的,所以它的要求要严格一些。Daniel和Anentropic的答案除了是“正确的方式”之外,更易于书写、更改和理解。到处都是职业选手<代码>'snapshot\u id':[snapshot.id用于快照中的快照]我不熟悉这种语法。作为参考:。现在看起来很明显,但我发誓事实并非如此!谢谢你的回答,丹尼尔!列表理解也可以再次用于使项目数组成为版本。避免字符串攻击感觉很好=)
快照id:[snapshot.id用于快照中的快照]
我是