28

我在查找有关此信息时遇到了一些困难,可能这不是正确的方法。我想根据 http 方法(GET 或 POST 或 DELETE 或 PUT)将请求路由到两个不同的视图函数。

正如通常在 REST api 中所做的那样,这意味着相同的 url 基于 HTTP 方法具有不同的含义。

我在 django 的 urls.py 文件中看不到这样做的方法,我想要类似的东西:

url(r'^tasks$', 'app.views.get_tasks', method='get'),
url(r'^tasks$', 'app.views.create_task',  method='post'),

(注意:我正在使用 django 1.4)

4

3 回答 3

27

我不认为你可以在不向 URL 添加一堆逻辑的情况下使用不同的函数来执行此操作(这绝不是一个好主意),但你可以在函数内部检查请求方法:

def myview(request):
    if request.method == 'GET':
        # Code for GET requests
    elif request.method == 'POST':
        # Code for POST requests

您还可以切换到基于类的视图。然后,您只需为每个 HTTP 方法定义一个方法:

class CreateMyModelView(CreateView):
    def get(self, request, *args, **kwargs):
        # Code for GET requests

    def post(self, request, *args, **kwargs):
        # Code for POST requests

如果您决定走基于类的路线,另一个很好的资源是http://ccbv.co.uk/

于 2013-09-30T14:15:03.127 回答
17

因为 Django 允许您在 url 配置中使用可调用对象,所以您可以使用辅助函数来实现。

def method_dispatch(**table):
    def invalid_method(request, *args, **kwargs):
        logger.warning('Method Not Allowed (%s): %s', request.method, request.path,
            extra={
                'status_code': 405,
                'request': request
            }
        )
        return HttpResponseNotAllowed(table.keys())

    def d(request, *args, **kwargs):
        handler = table.get(request.method, invalid_method)
        return handler(request, *args, **kwargs)
    return d

要使用它:

url(r'^foo',
    method_dispatch(POST = post_handler,
                    GET = get_handler)),
于 2014-01-03T07:06:38.730 回答
0

对于 Django 3.2,您可以使用require_http_methods

from django.views.decorators.http import require_http_methods

@require_http_methods(["GET", "POST"])
def my_view(request):
    # I can assume now that only GET or POST requests make it this far
    # ...
    pass

有关详细信息,请参阅https://docs.djangoproject.com/en/3.2/topics/http/decorators/#django.views.decorators.http.require_http_methods

于 2021-09-20T05:03:34.803 回答