GET请求POST处理视图

时间:2013-01-22 20:25:50

标签: django django-views

我的视图仅用于处理以

开头的POST请求
user = User.objects.get(username=request.POST['name'])

我是否需要确保不使用GET请求调用视图?不确定我是在考虑好的练习/安全类型的事情还是强迫症。

我正在使用@require_POST装饰器,因为使用GET调用视图会导致"Key 'name' not found in <QueryDict: {}>和500错误。

我认为发生这种情况的唯一可能性是用户查看页面的HTML并出于某种原因考虑在地址栏中尝试表单的action属性 - 这似乎不太可能。

我自己尝试了几个网站并得到了一个错误页面,而不是@require_POST给我的405错误的空白页。

如果模板设计师错误地为我的视图制作了超链接或忘记了method="post",那么防止GET请求也许是一种好习惯? (在这种情况下,我想我应该使用上面的get_object_or_404

我假设将@require_GET添加到仅用于处理GET请求的视图中是不必要的?

2 个答案:

答案 0 :(得分:2)

您似乎明白为什么要使用@requirePOST。如果您不想在GET上导致错误,另一个选择是使用以下内容:

def view(request):
    if request.method == 'POST':
        ..code for post..
    else:
        *redirect, or other code*

至于您是否需要使用@requireGET,唯一可能造成伤害的方法是,如果您需要同时执行GETPOST的视图。即在POST上引起操作的表单,但只是在GET上为用户显示。但是,如果您需要GET,则视图中不应存在任何可能通过POST泄露的内容。

答案 1 :(得分:1)

  

我是否需要确保不使用GET请求调用视图?不   如果我正在考虑良好的实践/安全类型的事情或存在   OCD。

是。我想你会回答你自己的问题。您的视图需要request.POST获取请求错误。如果您想创建无错误的代码,您将确保没有获取请求访问此视图。 Django提供了一个方便的pythonic装饰器来做到这一点。我认为你根本不是强迫症。另外,我不知道在生产中触发错误(给你发电子邮件,记录它等等)是多么昂贵,但这是需要考虑的事情。

  

我认为发生这种情况的唯一机会是用户查看页面的HTML并出于某种原因考虑尝试操作   地址栏中表单的属性 - 这似乎不太可能。

我认为这不重要用户如何向此发出GET请求,我认为这个视图必须是一个帖子请求才有意义。

  

在某种情况下,防止GET请求可能是一种好习惯   模板设计师误将超链接发送到我的视图或忘记   方法=“后”? (在这种情况下,我想我应该使用   上面的get_object_or_404)

在这种情况下,我不认为考虑可以对此视图提出请求的许多方法很重要。重要的是它需要一个Post请求。您可以使用您可以使用的工具来确保进入该功能的所有请求都是发布请求。

有一点是,name未被假定。你仍然可以获得KeyError。即使您确保请求是POST,也无法确保发布请求具有参数name

这就是为什么频繁使用get的原因

if not request.POST.get('name'):
  # raise some sort of error?
user = User.objects.get(username=request.POST['name'])