假设我有一个视图函数,它有许多if / else分支来处理不同的请求情况,例如POST / GET / form是否有效等等。对于每个分支,我使用render
返回一个http响应对象。一切顺利。
我的问题是:效率如何?例如,对于我们视图中的分支A,我使用模板渲染context_A = {key1:value1, key2:value2,...key10:value10}
。稍后用户请求相同的页面,这次它最终在视图函数的分支B中,我再次调用渲染返回context_B与相同的模板。但context_B
和context_A
只有非常小的区别,假设只有值10更改而其他键/值对相同。
这种情况的最佳做法是什么?现在我的解决方案是调用HttpResponse
(而不是render
)将json数据返回到jquery ajax方法,前提是整个模板已经返回。然后使用JQuery方法来操作DOM中的元素。但我担心这不是最好的做法,将来会引起维护问题。我认为在所有情况下使用上下文变量是一种更Djangoish的方式。但是如何?
编辑:代码示例
PS:
我是网络编程的新手。请承担我的代码质量。基本上我正在做的是将上下文与默认值放在一起,并在视图的末尾返回render()
以保证至少返回一个http响应。然后对于if / else语句的每个分支,我将json类型的数据(图像url)返回到jquery ajax方法,并使用jquery将url放在src中。
PS2:
首先,为了避免页面刷新,我必须使用ajax发送请求(xhr),对吧?当我发出ajax请求时,是否必须将数据返回到该ajax函数,还是可以正常返回数据?例如,在Django视图中使用render()
?
我正在努力更好地定义我的问题。抱歉,添麻烦了。也许有人可以稍后编辑我的问题,以便更好地参考未来的提问者。
def upload(request, size, slug):
comp = get_object_or_404(ActiveComp, slug=slug)
form= UploadForm()
# default context
context = {'comp':comp, 'form':form}
if request.method == 'POST':
temp_file = request.FILES.get('image', False)
"""
3 validations
"""
if ...:
return HttpResponse(json.dumps({"src":"none"}), mimetype="application/json")
# type checking (not REAL type checking, only file extension checking)
if ... :
return HttpResponse(json.dumps({"src":"not-image"}), mimetype="application/json")
# size checking
if ... :
return HttpResponse(json.dumps({"src":"too-big"}), mimetype="application/json")
# put uploaded image in db
# ...
# store image name in session
request.session['f1'] = img.name
#get thumbnail url using sorl-thumbnail
try:
timg = get_thumbnail(img.image, "160x110", quality=80, crop="center")
except:
context['turl'] = 'error'
else:
return HttpResponse(json.dumps({"src":timg.url}), mimetype="application/json")
else: # GET
try:
img = Image.objects.filter(user=request.user)[0]
except Exception:
context['turl'] = ""
else:
timg = get_thumbnail(img.image, "160x110", quality=50)
# store image name in session, so delete view can know the filename
request.session['f1'] = img.name
context['turl'] = timg.url
return render(request, 'template_A.html', context)
答案 0 :(得分:1)
提问前编辑
高效明智吗?
取决于你的效率。
您是在谈论开发人员的效率还是代码的效率。
就个人而言,我尽量保持视图尽可能轻量级;用尽可能少的逻辑。这意味着我可能有给定页面的2或3个模板。我宁愿拥有多个模板,而不是一个大的单片模板。这意味着我可以直观地看到代码的作用。
要记住的是开发人员的时间很昂贵(可能每天数百美元/磅),而且硬件便宜。成为一名高效的开发人员而不是尝试使用高效的代码更具成本效益。
所以它的长短不一样,你认为它是你最有效的开发人员,如果你发现它很慢,那么就寻找性能提升或者只是抛出硬件。随着云计算的便宜,这种情况越来越多。
答案 1 :(得分:0)
@ Philip007,在编程时我尊重人们有自己的编码风格,思维过程和一般的做事方式。
如果我要继承你的代码,是的,我会做一些修改,使代码更简洁,但我明白你在做什么以及背后的原因。出于这个原因,我会说这是完全适合的目的。
我个人喜欢将我的GET和POST请求拆分为单独的方法,只是因为我喜欢一个函数只做一件事(但这是我的偏好)。 我可能还会在POST中的每个if语句中设置一个值,并在该代码块的末尾返回一个值;但这又是一般的家务。