整体功能设计

  1. 1. 后台管理界面的设计
  2. 2. 文本编辑器的选择与配置

第一个功能—后台管理页面

现在博客园的后台管理页面

后台管理&文本编辑器 - 图1

文章发布页面

后台管理&文本编辑器 - 图2

投稿功能以及警示信息

后台管理&文本编辑器 - 图3

cnblog自定义部分

后台管理&文本编辑器 - 图4

第二个功能文本编辑器的使用

  1. 1. 资源
  2. 1. 官网链接 [http://kindeditor.net/down.php]

如何引入

  1. # 创建单独文件夹保存整个解压缩后的文件
  2. # 在HTML5中以标签方式导入
  3. <script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
  4. <script charset="utf-8" src="{% static 'blog/kindeditor/kindeditor-all.js' %}"></script>
  5. <script>
  6. KindEditor.ready(function(K) {
  7. window.editor = K.create('#article_content',{
  8. width:"800",
  9. height:"600",
  10. resizeType:0,
  11. uploadJson:"/upload/",
  12. extraFileUploadParams:{
  13. csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val()
  14. },
  15. filePostName:"upload_img"
  16. });
  17. });
  18. </script>

第三个功能—上传图片并且在编辑器中显示图片[view将图片URL返回给编辑器]

  1. 处理逻辑
  2. 1. 在处理上传功能的函数upload中,制作一个字典;
  3. 2. 该字典必须包含图片的URL路径,但图片名字是一个变量;
  4. 3. 将该字典序列化之后回传给前端;

需要回传的图片路径

[冰岛高地.jpg (4850×2728)](http://127.0.0.1:8000/media/add_article_img/冰岛高地.jpg)

后台管理&文本编辑器 - 图5

关键代码[17-22]

  1. def upload(request):
  2. """
  3. 编辑器上传文件接受视图函数
  4. :param request:
  5. :return:
  6. """
  7. # print(request.FILES)
  8. img = request.FILES.get("upload_img")
  9. print(img.name)
  10. path = os.path.join(settings.MEDIA_ROOT, "add_article_img", img.name)
  11. with open(path, "wb") as f:
  12. for line in img:
  13. f.write(line)
  14. response = {
  15. "error": 0,
  16. "url": "/media/add_article_img/%s" % img.name
  17. }
  18. return HttpResponse(json.dumps(response))

最终实现效果

后台管理&文本编辑器 - 图6

第四个功能—制作文章的摘要

设计思路

  1. 1. 粗糙的方法
  2. 1. 使用ORM查询数据库,对内容进行切片;将数据传递给前端;
  3. 2. 弊端:截取内容包含标签,容易导致页面标签混乱;如果关闭;
  4. 2. 解决方案
  5. 1. 使用 ```BeautifulSoup```解析网页标签,并且保存到数据库当中,便于展示;

标签字符串的转义

加入safe标签则会对文章进行转义,也就是将标签转换为样式。但由于切片取得的数据不全面,样式会彻底乱掉。如果不添加,则会以标签的方式显示内容,可读性显著降低

后台管理&文本编辑器 - 图7

关键代码[9-13]

  1. @login_required
  2. def add_article(request):
  3. """
  4. from bs4 import BeautifulSoup 负责解析网页标签
  5. """
  6. if request.method == "POST":
  7. title = request.POST.get("title")
  8. content = request.POST.get("content")
  9. soup = BeautifulSoup(content, "html.parser")
  10. desc = soup.text[0:150]
  11. models.Article.objects.create(title=title, desc=desc, content=content, user=request.user)
  12. return redirect("/blog/cn_backend/")
  13. return render(request, "backend/add_article.html")

最终实现效果

后台管理&文本编辑器 - 图8

第四个功能防御XSS攻击

什么是XSS攻击

  1. 1. XSS攻击通常指的是通过利用网页开发时留下的漏洞,
  2. 通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。
  3. 这些恶意网页程序通常是JavaScript,但实际上也可以包括Java VBScriptActiveX Flash
  4. 或者甚至是普通的HTML
  5. 2. 攻击成功后,攻击者可能得到包括但不限于更高的权限
  6. (如执行一些操作)、私密网页内容、会话和cookie等各种内容。

如何截取标签

后台管理&文本编辑器 - 图9

关键代码[Demo]

  1. from bs4 import BeautifulSoup
  2. s = "<h1>hello</h1><span></span><script>1234</script>"
  3. soup = BeautifulSoup(s, "html.parser")
  4. # print(soup.text)
  5. print(soup.find_all()) # 截取所有的标签
  6. for tag in soup.find_all():
  7. print(tag.name)
  8. if tag.name == "script":
  9. tag.decompose()
  10. print(str(soup))

关键代码[11-19]

  1. @login_required
  2. def add_article(request):
  3. """
  4. from bs4 import BeautifulSoup 负责解析网页标签
  5. """
  6. if request.method == "POST":
  7. title = request.POST.get("title")
  8. content = request.POST.get("content")
  9. soup = BeautifulSoup(content, "html.parser")
  10. # 过滤标签
  11. for tag in soup.find_all():
  12. print(tag.name)
  13. if tag.name == "script":
  14. tag.decompose()
  15. desc = soup.text[0:150]
  16. models.Article.objects.create(title=title, desc=desc, content=str(soup), user=request.user)
  17. return redirect("/blog/cn_backend/")
  18. return render(request, "backend/add_article.html")

标签混合

后台管理&文本编辑器 - 图10

最终效果

后台管理&文本编辑器 - 图11