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

luc*_*uca 24 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'),
Run Code Online (Sandbox Code Playgroud)

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

hel*_*ate 21

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

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

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

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

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

如果您决定使用基于班级的路线,另一个好的资源是http://ccbv.co.uk/.


Jur*_*ste 13

因为Django允许你在url配置中使用callables,你可以使用helper函数.

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
Run Code Online (Sandbox Code Playgroud)

要使用它:

url(r'^foo',
    method_dispatch(POST = post_handler,
                    GET = get_handler)),
Run Code Online (Sandbox Code Playgroud)

  • 即使这是一个很棒的解决方案,也要记住,中间件可以尝试访问“回调”(视图),就像django.middleware.csrf.CsrfViewMiddleware一样,可以检查是否存在csrf_exempt并提供回调。那不是Django视图,您的系统中可能会有意外的行为。 (3认同)