request.method ='post'禁止?

时间:2014-05-16 04:41:30

标签: django forms post get

我想使用request.POST而不是request.GET,

#contact_form.html
<form action = '/contact/' method = 'post'>
    <p>Subject:<input type = 'text' name = 'subject'></p>
    <p>Your e-mail (optional): <input type = 'text' name = 'e-mail'></p>
    <p>Message:<textarea name = 'message' rows = '10' cols = '50'></textarea></p>
    <input type = 'submit' value = 'Submit'>
</form>


#views.py
def contact(request):
    errors = []
    if request.method == 'POST':
        if not request.POST.get('subject',''):
            errors.append('Enter a subject.')
        if not request.POST.get('message',''):
            errors.append('Enter a message.')
        if not request.POST.get('email') and '@'not in request.POST['email']:
            errors.append('Enter a valid e-mail address.')
        if not errors:
            send_mail(
                    request.POST['subject'],
                    request.POST['message'],
                    request.POST.get('email', 'noreplay@example.com'),
                    ['siteowner@example.com'],
                    )
            return HttpResponseRedirect('/contact/thanks/')
    return render_to_response('contact_form.html',{'errors':errors})

然后,我得到了这个:

禁止(403)

CSRF验证失败。请求中止。

=============================================== ========================

我该怎么办? POST和GET究竟有什么区别?

2 个答案:

答案 0 :(得分:0)

此错误由Cross Site Request Forgery protection(CSRF)中间件显示,其目的是防止恶意网站在没有您的用户的情况下发送数据。知识。

简而言之:您需要将{% csrf_token %}添加到模板中的<form>元素中。

有什么好处?我们假设你把它放在一个网页上,有人决定用虚假数据向你发送垃圾邮件,并设法注入任何人进入页面时提交表单的Javascript代码。 (或者更糟糕的是,如果您的表单允许用户执行破坏性操作,例如删除他的帐户。)CSFR会停止该操作,因为它确保只有作为对HTML表单的响应而发送的请求才能通过。

除此之外:还有更好的方法来生成和验证表单。您可以使用django.forms使Django生成联系表单,该联系表单将自动验证用户是否输入了主题,消息文本和有效的电子邮件地址,并显示相应的错误消息(如果他们不知道。

答案 1 :(得分:0)

车的答案绝对正确,你也可以在看到这样的功能之前和@csrf_exempt:

@csrf_exempt
def contact(request):

你应该像这样导入它:

from django.views.decorators.csrf import csrf_exempt