2013-01-22 57 views
1

我有一个看法打算只处理与GET请求的POST操作视图

user = User.objects.get(username=request.POST['name']) 

开始POST请求,我需要确保视图不与GET请求调用?不知道我是否在考虑良好的做法/安全类型的东西或是OCD。

我使用@require_POST修饰器,因为调用"Key 'name' not found in <QueryDict: {}> GET结果和500错误的视图。

我想这种情况发生的唯一机会是,如果用户查看页面的HTML,并出于某种原因想要尝试地址栏中表单的action属性 - 这似乎不大可能。

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

也许这是很好的做法,以防止万一模板设计错误,使一个超链接到我的视图或忘记method="post" GET请求? (在这种情况下,我想我应该使用上面的get_object_or_404

我认为将@require_GET添加到仅用于处理GET请求的视图是非原则的吗?

回答

1

Do I need to ensure the view is not invoked with a GET request? Not sure if I'm thinking about good practice/security-type things or being OCD.

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

I suppose the only chance of this happening is if a user looked at the HTML of the page and for some reason thought to try the action attribute of the form in the address bar -which seems unlikely.

我不认为它很重要用户如何可以使一个GET请求到这一点,我认为它唯一要紧的是这种观点必须是一个post请求。

Perhaps it's good practice to guard against GET requests in case a template designer mistakenly makes a hyperlink to my view or forgets method="post"? (In which case, I suppose I should use get_object_or_404 above)

在这种情况下,我不认为”思考的许多方面是一个GET请求可能这种观点进行是很重要的。重要的是它需要一个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']) 
+0

是EAFP风格和一个500错误适当?尝试:用户名= request.POST ['名称']除KeyError:返回HttpResponseServerError('坏名字') – KnewB

+1

我认为这是完全合适的,我认为主要问题是你控制一个错误,不让未处理的条件控制错误。我相信你的try语句是一个很好的为什么要处理这个问题 – dm03514

+0

哎呦我的意思是返回HttpResponseServerError('Error:user required')' – KnewB

2

好像你明白你为什么会想使用@requirePOST。另一种选择,如果你不想引起GET一个错误,就是沿着这些线路使用的东西:

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

至于你是否需要使用@requireGET,它会伤害的唯一方法是,如果你需要一个视图来执行GETPOST。即使在POST动作,但简单地显示为上GET用户的形式。但是,如果你需要GET那么就不应在可能通过POST受到影响的看法什么。