如何为 GET 和 POST 编写单独的视图

Posted

技术标签:

【中文标题】如何为 GET 和 POST 编写单独的视图【英文标题】:How to write separate views for GET and POST 【发布时间】:2013-05-25 04:18:01 【问题描述】:

首先,我希望两个视图都使用完全相同的 URL,因为我不想让我的 URLConf 变得更复杂。我想要 GET 和 POST 的单独视图以使我的代码更清晰。代码是这样的:

def view2 (request):
    # handle POST request, possibly a ajax one
    return HTTPRESPONSE(json_data, mimetype="Application/JSON")

def view1 (request):
    if method == POST:
        view2(request)
        # What should I return here???

    else:
        # handle GET
        return render(request, template, context)

我的问题是关于# What should I return here??? 行。如果我不在那里返回,则会发生错误:

不返回 http 响应

但我已经在 view2 中返回了一个 HTTP 响应。我怎样才能做到这一点?

【问题讨论】:

你应该return view2(request)。 View2 将结果返回给调用者(view1),但调用者也需要返回。 【参考方案1】:

另一种可能更简洁的方法是使用class-based views

from django.views.generic import TemplateView

class View1(TemplateView):
    def get(self, request, *args, **kwargs):
        """handle get request here"""

    def post(self, request, *args, **kwargs):
        """handle post request here"""

    def head(self, request, *args, **kwargs):
        """handle head request here. Yes, you can handle any kind of requests, not just get and post"""

当然,您可以添加常用方法,__init__(除非您确定自己在做什么,否则这是无用的),应用login_required(请参阅this SO question)以及几乎所有您可以使用 django 视图执行的操作(例如应用中间件、权限等) python 类(例如继承、元类/装饰器等)

此外,Django 还提供了一大堆基于通用类的视图来解决常见情况,如列表页面、详细信息页面、编辑页面等。

【讨论】:

我真的很喜欢这个答案。它使代码非常清晰且易于维护。 这绝对是处理视图的更好方法。当您可以调用单独的函数时,您不想在if else 中编写两个大而复杂的逻辑。【参考方案2】:

需要返回view2的结果:

def view1 (request):
    if request.method == 'POST':
        return view2(request)
    else:
        # handle GET
        return render(request, template, context)

【讨论】:

以上是关于如何为 GET 和 POST 编写单独的视图的主要内容,如果未能解决你的问题,请参考以下文章

如何为没有已知列的 PostgreSQL 视图编写通用更新触发器?

如何为每一行编写加入日期时间的 SQL 查询

win api - 如何为树视图实现单独的事件过程

如何为POST,GET等多个Http请求创建单一逻辑应用程序

如何为路由组添加前缀以及如何在刀片视图中调用子路由

如何为带有可选参数的函数编写测试