У меня возникли проблемы с токенами CSRF в моем проекте Django. То, что я пытаюсь сделать, это разрешить пользователю отправлять файл на определенный адрес электронной почты, используя форму на моем веб-сайте. Проблема заключается в том, что «токен CSRF отсутствует или неверен». Я пропустил еще несколько вопросов; однако кажется, что мое приложение построено иначе, чем другие. Я все еще очень новичок в веб-разработке, не говоря уже о Django. Я думаю, что это может быть связано с чем-то в взглядах, но, похоже, ни одно из этих решений не является полезным для моих целей. Если у кого есть какие-либо идеи о том, как мы можем поставить в CSRF токен или исправить здесь, вот файлы, которые были изменены для того, чтобы добавить эту функциональность электронной почты:Отправка электронной почты с помощью Django; Недопустимый токен CSRF
#views.py
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.core.context_processors import csrf
from django import forms
from ReadMyPaper.feedbackEmail.forms import EmailForm
#Create your views here.
def send_email(request):
if request.method != 'POST':
form = EmailForm()
return render_to_response('email.html', {'email_form': form})
form = EmailForm(request.POST, request.FILES)
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
email = form.cleaned_data['email']
attach = request.FILES['attach']
try:
mail = EmailMessage(subject, message, settings.EMAIL_HOST_USER, [email])
mail.attach(attach.name, attach.read(), attach.content_type)
mail.send()
#return render_to_response('Email.html', {'message': 'Sent email to %s'%email})
args = {}
args.update(csrf(request))
args['form'] = EmailForm()
#return render_to_response('email.html' , args)
#return render_to_response(
#'email.html', args
#context_instance=RequestContext(request)
return render_to_response("email.html", args)
except:
# return render_to_response('admin/Error.html', {'message': 'Either the attachment is too big or corrupt'})
return render_to_response('loggedin.html')
формы ...
from django import forms
class EmailForm(forms.Form):
email = forms.EmailField()
subject = forms.CharField(max_length=100)
attach = forms.Field(widget = forms.FileInput)
message = forms.CharField(widget = forms.Textarea)
шаблон ...
{% block content %}
{{message}}
{% if email_form %}
<form method="POST" action ="." enctype="multipart/form-data">
{% csrf_token %}
<br></br>
{{email_form.as_p}}
<label> </label><label> </label><label> </label>
<input type ="submit" name = "send" value = "Send"/>
</form>
{% endif %}
{% endblock content %}
И файл настройки ...
#settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# Host for sending e-mail.
EMAIL_HOST = 'smtp.gmail.com'
# Port for sending e-mail.
EMAIL_PORT = 587
# Optional SMTP authentication information for EMAIL_HOST.
EMAIL_HOST_USER = ‘[email protected]'
EMAIL_HOST_PASSWORD = ‘mypassword'
EMAIL_USE_TLS = True
Очевидно, что это не настоящий адрес электронной почты и пароль для адреса gmail. У меня есть фактический gmail, который я использую.
Спасибо так много! Маркер работал. Я предполагаю, что это потому, что он автоматически использует RequestContext? Это была проблема, которую мы обнаружили, когда мы исследовали это, однако совет по использованию «рендеринга» никогда не возникал. Спасибо за вашу помощь. У нас сейчас небольшая проблема с отправкой электронной почты, но это совершенно новая возможность червей ... спасибо! – cloudyGirrl
Да, если вы не передаете 'RequestContext' в вызов' render() ', он автоматически создает такой экземпляр контекста. – catavaran