欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

请教大神关于 Django 自动发邮件时候的 CSRF 问题

程序员文章站 2024-03-24 14:17:52
...

环境:

系统:Mac OS 10.12.6

Python 3.5

Django 1.11

MySQL 5.6.36

------------------------------------------------------

问题描述:

我在练习 Contact Us 部分,收集用户反馈信息。


请教大神关于 Django 自动发邮件时候的 CSRF 问题


输入后得到的页面是:


请教大神关于 Django 自动发邮件时候的 CSRF 问题


下面是我的 setting.py 的 MIDDLEWARE:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

下面是我的 views.py :

from django.shortcuts import render_to_response, render
from django.http import HttpResponseRedirect
from mysite.books.models import Book
from django.core.mail import send_mail
from mysite.contact.forms import ContactForm

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            send_mail(
                cd['subject'],
                cd['message'],
                cd.get('email', 'aaa@qq.com'),
                ['aaa@qq.com']
            )
            return HttpResponseRedirect('/contact/thanks/')

    else:
        form = ContactForm()

    return render_to_response('contact_form.html', {'form': form})
    

def thanks(request):
    return render_to_response('thanks.html')

下面是我的 contact_form.html :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Contact us</title>
</head>
<body>
    {% if form.errors %}
        <p style="color: red">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
    {% endif %}

    <form action="" method="post" >
        {% csrf_token %}
        <table>
            {{ form.as_table }}
        </table>

        <input type="submit" name="Submit">
    </form>
</body>
</html>

上面是我想解决的问题。谢谢。

顺便说一句,我如果注释掉 setting 里面 MIDDLEWARE 的  

'django.middleware.csrf.CsrfViewMiddleware',

那邮件就可以正常发送。


另外,我想问一下 

from django.views.decorators.csrf import csrf_exempt
这里面的 csrf_exempt 怎么用呢?可以解决 这个 CSRF 的问题吗?


谢谢各路大神指点!


相关标签: django csrf