设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 422|回复: 1

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

[复制链接]
累计签到:486 天
连续签到:1 天
发表于 2022-11-26 11:04:11 | 显示全部楼层 |阅读模式
# 后台管理
所有文件夹都可以根据功能再细化,你还可以继续创建文件夹分类处理
    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
        )
        
# 文章和标签关系表是我们自己创建的 没法使用addsetremoveclear方法
        # 自己去操作关系表 一次性可能需要创建多天数据  批量插入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个文本字符
2XSS脚本攻击
    针对用户直接编写的html代码网址
    针对用户直接编写的script标签 我们需要处理
        1、注释掉标签内部的内容
        2、直接将script删除

[如何解决?]
    我们自己解决的话
        针对1 后端通过正则表达式筛选
        针对2 首先需要确定及获取script标签
    这两步都繁琐 有没有人帮我们处理一下呢
        [beautifulsoup]模块 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[0:150]
当你发现一个数据处理起来不是很方便的时候
可以考虑百度搜搜有没有相应的功能内容

# 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())


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-1002753-1-1.html 上篇帖子: 三、BBS制作inclusion_tag、点赞点踩、子评论和根评论思想 下篇帖子: 2022-12-10在战Django中forms组件源码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表