django項目開發實戰——博客(三)

經過好幾版的修改,終於變成了現在這個樣子(咳咳。)網站可以戳這裏,歡迎大家多提意見哦~

在這裏插入圖片描述

在之前的基礎上,做了以下增加:

評論功能

評論功能依舊用了渲染的方式,加了一些原生js控制css樣式。

評論框:

<form class="pure-form comment" method="post" action="{% url 'comment:comment' pk=post.id %}">
    <fieldset class="pure-group">
        暱稱:<input class="pure-input-1-4" name="comment-name" type="text" placeholder="暱稱">
        &nbsp;&nbsp;
        郵箱:<input class="pure-input-1-3" name="comment-email" type="email" placeholder="留下郵箱,可以收到回覆提醒哦~">
    </fieldset>
    <textarea class="comment-content" name="comment" placeholder="想對作者說點什麼。。。" onfocus="show_person_info(this)"></textarea>
    <div class="comment-div">
        <span id="tip_comment">支持markdown格式</span>
        <button class="pure-button" type="submit" href="#">發表評論</button>
    </div>
</form>

評論展示區域

{% for comment in comment_list %}
   <ul class="comment-list ">
       <li class="comment-li first-comment" onmouseover="show_reply(this)"
           onmouseleave="hidden_replay(this)">
           <i class="fa fa-user-circle"></i>
           <span>{{ comment.name }}:</span>
           <a class="reply" href='javascript:void(0);' onclick="show_replyform(this)">回覆</a>
           <div class="comment-info">{{ comment.text | safe }}</div>

           <form class="pure-form reply-form" id="reply-form" method="post"
                 action="{% url 'comment:comment' pk=post.id %}">

               <input hidden name="reply_to" value="{{ comment.id }}">
               <input hidden name="reply_name" value="{{ comment.name }}">
               <input hidden name="root_to" value="{{ comment.id }}">
               <input hidden name="reply_email" value="{{ comment.email }}">
               <fieldset class="pure-group">
                   暱稱:<input class="pure-input-1-4" name="comment-name" type="text" placeholder="暱稱">
                   &nbsp;&nbsp;
                   郵箱:<input class="pure-input-1-3" name="comment-email" type="email"
                             placeholder="留下郵箱,可以收到回覆提醒哦~">
               </fieldset>
               <textarea class="comment-content" name="comment" onblur="hidden_replyform(this)"
                         placeholder="想對作者說點什麼。。。"></textarea>
               <div class="comment-div">
                   <span id="tip_comment">支持markdown格式</span>
                   <button class="pure-button" type="submit" href="#">發表評論</button>
               </div>
           </form>

       </li>
       {% for reply in comment.replies %}
           <li class="comment-li reply-comment" onmouseover="show_reply(this)"
               onmouseleave="hidden_replay(this)">
               <i class="fa fa-user-circle"></i>
               <span>{{ reply.name }}回覆{{ reply.reply_name }}: </span>
               <a class="reply" href='javascript:void(0);' onclick="show_replyform(this)">回覆</a>
               <div class="comment-info">{{ reply.text | safe }}</div>

               <form class="pure-form reply-form" method="post"
                     action="{% url 'comment:comment' pk=post.id %}">
                   <input hidden name="reply_to" value="{{ reply.id }}">
                   <input hidden name="reply_name" value="{{ reply.name }}">
                   <input hidden name="root_to" value="{{ comment.id }}">
                   <input hidden name="reply_email" value="{{ reply.email }}">
                   <fieldset class="pure-group">
                       暱稱:<input class="pure-input-1-4" name="comment-name" type="text"
                                 placeholder="暱稱">
                       &nbsp;&nbsp;
                       郵箱:<input class="pure-input-1-3" name="comment-email" type="email"
                                 placeholder="留下郵箱,可以收到回覆提醒哦~">
                   </fieldset>
                   <textarea class="comment-content" name="comment" onblur="hidden_replyform(this)"
                             placeholder="想對作者說點什麼。。。"></textarea>
                   <div class="comment-div">
                       <span id="tip_comment">支持markdown格式</span>
                       <button class="pure-button" type="submit" href="#">發表評論</button>
                   </div>
               </form>

           </li>
       {% endfor %}
   </ul>
{% endfor %}

comment/models.py

from django.db import models


class Comment(models.Model):
    name = models.CharField(max_length=20)
    email = models.EmailField(max_length=50)
    website = models.URLField(blank=True)
    text = models.TextField()
    created_time = models.DateTimeField(auto_now_add=True)

    post = models.ForeignKey('Post.Post', on_delete=True)  # 一篇文章有多個評論

    # 評論
    reply_to = models.IntegerField(verbose_name="回覆的哪條評論", default=0)
    reply_name = models.CharField(verbose_name="回覆的哪個人", max_length=50, default=None)
    reply_email = models.EmailField(verbose_name="被回覆的郵箱", max_length=50, default='chuxiaoyi@chuxiaoyi@cn')
    root_to = models.IntegerField(verbose_name="回覆的是哪個主評論", default=0)

    class Meta:
        ordering = ['-created_time']

異步任務

celery目前已經完成支持django了,原始文檔戳這裏。我主要在評論區回覆郵件和增加pv(頁面訪問量)使用了異步。

首先,在和項目同名的包下的創建celery.py(與settings.py同級)文件:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MySite.settings')

app = Celery('MySite', broker='redis://127.0.0.1:6379/3')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

並且。在和celery.py同級的__init__.py中添加如下代碼:

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

然後,在需要使用異步的功能所在app中添加tasks.py。在這裏,我加在了Postcomment裏:

Post/tasks.py

from celery import shared_task
from .models import Post
from django.db.models import F

@shared_task
def add_pv(post_id):
    """
    增加頁面訪問量
    :return:
    """
    Post.objects.filter(id=post_id).update(views=F('views') + 1)

comment/tasks.py

from celery import shared_task
from django.core.mail import send_mail
from django.conf import settings


@shared_task
def async_send_mail(email, text, post_pk):
    """
    異步發送信息,告知被回覆者有人評論
    :param email:
    :param text:
    :return:
    """
    title = "郵箱發送test"
    msg = "收到回覆:" + text + \
          "\n跳轉到www.chuxiaoyi.cn/detail/post-{}/查看".format(post_pk)
    from_email = settings.EMAIL_HOST_USER
    recievers = [email, ]
    print(email)
    send_mail(title, msg, from_email, recievers, fail_silently=False)

寫好之後,在views.py中直接調用即可

async_send_mail.delay(comment.reply_email, comment.text, pk)
add_pv.delay(pk)

部署:通過supervisor管理celery

安裝supervisor

sudo apt-get install supervisor

添加celery配置,在/etc/supervisor/conf.d文件夾下,創建celery.conf:

[program:celery]

#啓動命令入口
command=/root/.pyenv/shims/celery worker -A MySite --loglevel=info

# 命令程序所在目錄
directory=/home/BlogWebsite

# 運行命令的用戶名
user=root

autostart=true
autorestart=true
stdout_logfile=/var/log/celery/blog_comment_mail_worker.log
stderr_logfile=/var/log/celery/blog_comment_mail_worker.log

後臺運行celery

sudo supervisorctl start celery

sudo supervisorctl stop celery

sudo supervisorctl restart celery
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章