我在查找有关此信息方面遇到了一些困难,可能这不是正确的方法。我想基于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)
答案 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)),