如何在django urlpatterns中基于HTTP方法进行区分

时间:2013-09-30 14:02:57

标签: python django rest

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

由于它通常在REST apis中完成,这意味着相同的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)

2 个答案:

答案 0 :(得分:17)

我不认为你可以用不同的功能做到这一点而不向URL添加一堆逻辑(这绝不是一个好主意),但你可以在函数内部检查请求方法:

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

您也可以切换到class-based views。然后,您只需要为每个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/

答案 1 :(得分:13)

因为Django允许你在url配置中使用callables,你可以使用辅助函数来完成。

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