1

假设我有一个视图函数,它有许多 if/else 分支来处理不同的请求情况,比如它是否是 POST/GET/form 有效/等等。对于每个分支,我使用render返回一个 http 响应对象。一切顺利。

我的问题是:这有效吗?例如,在我们看来,对于分支 A,我context_A = {key1:value1, key2:value2,...key10:value10}使用模板进行渲染。后来用户请求同一个页面,这次它在视图函数中的分支 B 中结束,我再次调用渲染返回具有相同模板的 context_B。但是只有很小的区别,假设只有 value10 变化,而其他键/值对是相同的context_Bcontext_A

这种情况的最佳做法是什么?现在我的解决方案是调用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函数还是可以正常返回数据?例如,render()在 Django 视图中使用?

我正在努力更好地定义我的问题。抱歉,添麻烦了。也许有人可以稍后编辑我的问题,以便更好地参考未来的提问者。


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)
4

2 回答 2

1

前置问题编辑

有效率吗?

取决于你所说的高效。

您是在谈论开发人员的效率还是代码的效率。

就个人而言,我尽量保持视图轻量级;尽可能少的逻辑。这意味着我可能有 2 或 3 个给定页面的模板。我宁愿拥有多个模板,而不是一个大型的整体模板。这意味着我可以更容易地想象代码在做什么。

要记住的是开发人员的时间很昂贵(可能每天数百美元/英镑),而硬件很便宜。成为一名高效的开发人员比试图纠正高效的代码更具成本效益。

因此,总而言之,您是对的,您认为使您成为最高效的开发人员,如果您发现它很慢,那么请寻找性能提升或只是将硬件扔给它。随着云计算的便宜,这种情况越来越多。

于 2013-05-29T08:28:02.457 回答
0

@Philip007,在编程方面,我尊重人们拥有自己的编码风格、思维过程和一般的做事方式。

如果我要从您那里继承此代码,是的,我会进行一些更改以使代码更简洁,但我了解您在做什么以及背后的原因。出于这个原因,我会说这是完全足够的代码。

我个人喜欢将我的 GET 和 POST 请求拆分为单独的方法,只是因为我喜欢一个只做一件事的函数(但这是我的偏好)。我可能还会在 POST 中的每个 if 语句中设置一个值,并在该代码块的末尾返回一个;但这只是一般的家务。

于 2013-05-29T09:07:30.713 回答