郑统京 发表于 2022-11-26 11:04:11

四、后台管理、编辑器、添加文章、XSS攻击、上传头像

# 后台管理
所有文件夹都可以根据功能再细化,你还可以继续创建文件夹分类处理
    templates文件夹
      backend文件夹
      应用1文件夹
      应用2文件夹
[后台管理后端代码]
from bs4 import BeautifulSoup
@login_required
def add_article(request):
    if request.method =='POST':
      title = request.POST.get('title')
      content = request.POST.get('content')
      category_id = request.POST.get('category')
      tag_id_list = request.POST.getlist('tag')
      # 模块使用爬虫
      soup = BeautifulSoup(content,'html.parser')
      tags = soup.find_all()
      # 获取所有标签
      for tag in tags:
            # print(tag.name) 获取页面所有标签
            # 可以针对与 获取的script标签进行删除
            if tag.name == 'script':
                # 删除标签
                tag.decompose()
      # 文章简介
      # 1、先简单暴力的直接切去content 150个字符
      desc = soup.text[0:150] # 相当于内部用正则把文本筛选出来了
      article_obj=models.Article.objects.create(
            title=title,
            content=str(soup),# bs4处理后的结果放进来
            desc=desc,
            category_id=category_id,
            blog=request.user.blog
      )
      # 文章和标签关系表是我们自己创建的 没法使用add,set,remove,clear方法
      # 自己去操作关系表 一次性可能需要创建多天数据批量插入bulk_create()
      article_obj_list = []
      for i in tag_id_list:
            # 先生成一个对象
            tag_article_obj=models.Article2Tag(article=article_obj, tag_id=i) # i 代表for循环出来的每个tag对象
            article_obj_list.append(tag_article_obj)
      # 批量插入数据
      models.Article2Tag.objects.bulk_create(article_obj_list)
      # 跳转到后台文章展示页
      return redirect('/backend/')
    category_list = models.Category.objects.filter(blog=request.user.blog)
    tag_list = models.Tag.objects.filter(blog=request.user.blog)
    return render(request,'backend/add_article.html',locals())
# 添加文章
1、文章简介
不能直接切取
    应该先想办法获取到当前页面的内容之后在截取150个文本字符
2、XSS脚本攻击
    针对用户直接编写的html代码网址
    针对用户直接编写的script标签 我们需要处理
      1、注释掉标签内部的内容
      2、直接将script删除

[如何解决?]
    我们自己解决的话
      针对1 后端通过正则表达式筛选
      针对2 首先需要确定及获取script标签
    这两步都繁琐 有没有人帮我们处理一下呢
      模块 bs4模块
            专门用来处理html页面的
            该模块主要用于爬虫程序
    下载千万别下错了
# beautifulsoup模块使用
      soup = BeautifulSoup(content,'html.parser')
      tags = soup.find_all()
      # 获取所有标签
      for tag in tags:
            # print(tag.name) 获取页面所有标签
            # 可以针对与 获取的script标签进行删除
            if tag.name == 'script':
                # 删除标签
                tag.decomposed()
      # 文章简介
      # 1、先简单暴力的直接切去content 150个字符
      desc = soup.text
当你发现一个数据处理起来不是很方便的时候
可以考虑百度搜搜有没有相应的功能内容

# kind editor 富文本编辑器
编辑器的种类有很多,你可以在网上继续搜索

# 编辑器上传图片
别人写好了接口 但是接口不是你自己的
你需要手动去修改
import os
from BBS14 import settings
def upload_imge(request):
    back_dic = {'error': 0, }# 先提前定义返回给编辑器的数据格式
    # 用户写文章上传的头像 也算是静态资源 也应该放到media文件夹下
    if request.method == 'POST':
      # 获取用户上传的图片对象
      # 不是自己写的,那么打印看一下 print(request.FILES) 看到imgFile
      file_obj=request.FILES.get('imgFile')
      # 手动拼接存储文件的路径
      file_dir = os.path.join(settings.BASE_DIR,'media','article_img')
      # 优化操作 先判断文件夹是否存在 不存在 自动创建
      if not os.path.isdir(file_dir):
            os.mkdir(file_dir)# 创建一层目录结构
      # 拼接图片的完整路径
      file_path = os.path.join(file_dir,file_obj.name)
      with open(file_path,'wb')as f:
            for line in file_obj:
                f.write(line)
      # 为什么不直接把放上面处理好的file_dir呢? 以为file_dir路径是/BBS14/media,我们没有开设这个接口
      back_dic['url']='/media/article_img/%s'%file_obj.name
    return JsonResponse(back_dic)

在使用别人的开发或者模块 出现了问题不要慌 看看文档可能会有对应的处理方法
# 修改头像@login_required
def set_avatar(request):
    if request.method =='POST':
      file_obj = request.FILES.get('avatar')
      # models.UserInfo.objects.filter(pk=request.user.pk).update(avatar=file_obj) # 不会自动加(avatar/文件名)前缀所以上传时候少了前缀就不显示头像
      # 1、自己手动加前缀
      # 比较麻烦
      # 2、换一种更新方式,不用update方式就可以了
      user_obj = request.user
      user_obj.avatar =file_obj
      user_obj.save()
      return redirect('/home/')
    blog= request.user.blog
    username = request.user.username
    return render(request,'set_avatar.html',locals())

xiaozao0303 发表于 2022-11-29 10:54:16

页: [1]
查看完整版本: 四、后台管理、编辑器、添加文章、XSS攻击、上传头像