參考資料:celery官方教程
Demo
給網(wǎng)站做了一個(gè)留言板,留言后直接發(fā)送郵件給管理員,順便加上celery測(cè)試了一下異步任務(wù)。celery基本按照官方教程來(lái)就可以,僅有setting.py要注意一下。
- 用163發(fā)送郵件設(shè)置比較方便,一般不會(huì)有什么問(wèn)題,注意from_email必須填真實(shí)的,否則550錯(cuò)誤,需要去郵箱設(shè)置開(kāi)通smtp發(fā)送權(quán)限,本地服務(wù)器直接發(fā)送容易遇到各種問(wèn)題,建議用smtp
- 使用django發(fā)送郵件之前,先在服務(wù)器環(huán)境下測(cè)試,看能否發(fā)送郵件,可能需要
apt-get install sendmail
celery -A proj worker -l info
查看celery tasks狀態(tài),見(jiàn)下圖MainProcess ] Received task是收到任務(wù),PoolWorker-1] Task是執(zhí)行任務(wù)
Paste_Image.png
settings.py
Email配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'youemailname@163.com'
EMAIL_HOST_PASSWORD = 'pass'
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = 'Server <sever@xxx.com>'
celery部分配置參考的是celery官方的django demo
# CELERY_BROKER_URL = 'amqp://guest:guest@localhost//'
# 不用amqp后端,我自己換成redis #/0為redis第一個(gè)數(shù)據(jù)庫(kù)
CELERY_BROKER_URL = 'redis://localhost:6379/0'
#這兩個(gè)json應(yīng)該也可以不用,使用默認(rèn)就行,還不知道有什么區(qū)別,以后再研究
CELERY_ACCEPT_CONTENT = ['json']
# 這個(gè)也不要了
# CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'
CELERY_TASK_SERIALIZER = 'json'
代碼部分
郵件發(fā)送代碼
@shared_task
def levemessage(message):
time.sleep(60)
send_mail(subject='網(wǎng)站有一個(gè)留言',message=message,from_email='youremail@163.com',recipient_list=['yourotheremail@qq.com'],fail_silently=False)
print('mail sent')
django.views留言代碼
def contactme(request):
email = request.GET.get('email')
message = request.GET.get('message')
print('email:',email,'message:',message)
if not (email and message):
return render(request,'page/contactme.html')
else:
print('sendemail')
content = 'email:%s\nmessage:%s\n' %(email,message)
levemessage.delay(content)
return HttpResponse('留言成功,謝謝反饋')
html模板
{% block content %}
<div class="contactform">
<label for="email">Email</label><input type="text" name="email" id="email">
<label for="message">留言</label><textarea name="message" id="message" cols="30" rows="6"></textarea>
<button id="contactme">提交留言</button>
</div>
{% endblock %}
ajax提交
<script>
function contactme(data) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
if (xhr.status === 200) {
alert('成功發(fā)送留言,點(diǎn)擊確定后跳轉(zhuǎn)到首頁(yè)');
window.location.href = "/";
} else {
alert('留言失敗,網(wǎng)絡(luò)或者系統(tǒng)出現(xiàn)故障')
}
}
}
xhr.open('GET','/contact_me.html?'+data);
xhr.send(data);
alert('請(qǐng)求已發(fā)送,請(qǐng)等待響應(yīng)');
}
var i = function initElem() {
var message = document.getElementById('message').value;
var email = document.getElementById('email').value;
params = "email="+ encodeURIComponent(email) + "&message=" + encodeURIComponent(message);
contactme(params);
}
var btn = document.getElementById('contactme');
btn.onclick = i;
</script>