首页 > 其他分享 >BBS 07

BBS 07

时间:2023-12-14 15:44:57浏览次数:15  
标签:07 script 标签 request --- article BBS id

新增文章富文本编辑器

富文本编辑器
	- 类似于 word操作  插入图片。。  kindedit
    - 类似于 md 操作
    
    
    
# 官网:http://kindeditor.net/doc.php
	- 下载压缩包---》放在static文件夹下
    -  新增文章页面:
    <textarea name="content" id="editor_id" cols="200" rows="10" class="form-control"></textarea>
    {% block script %}
    <script charset="utf-8" src="/static/kindeditor/kindeditor-all.js"></script>
    <script charset="utf-8" src="/static/kindeditor/lang/zh-CN.js"></script>
    <script>
        KindEditor.ready(function (K) {
            window.editor = K.create('#editor_id', {
                width: '100%',
                height: '600px',
                 resizeType:0
            });
        });
    </script>
{% endblock %}
    

去除xss攻击

Beautifulsoup4  爬虫解析模块--》用来删除html标签中得某些标签
#pip3 install Beautifulsoup4


# html 特殊字符
    -页面中看到<script>  其实是    $lt; script $gt; 
    -真正的<script>   是看不到的,被渲染
    -django 模板默认是处理的xss攻击的----》就是对 特殊字符做替换
    -如果  |safe  就不替换了---》一定要保证 |safe  字符串是没问题的
    
# 如果在富文本编辑器中写代码,不存在问题---》富文本编辑器做了替换
# 如果在 源码中直接放标签会有问题

# 后端 bs4模块-->删除script标签
soup = BeautifulSoup(content)  # html标签样子
list_script = soup.find_all('script')  # 找到所有script标签,不会包含 用户的代码  已经被特殊字符替换了
for l in list_script:
    l .decompose()  # 把这个标签从 html中删除
content = str(soup)  #带标签---》存带标签的
desc = soup.text[0:70]  # 取摘要,只要文字,不要标签




# 真正的去除xss攻击

    < script > ---> 替换     $lt;  $gt;    存到数据库中
    
    $lt; script $gt;    $lt;/ script $gt; 

富文本编辑器上传图片

 后端

from django.conf import settings
def upload_file(request):
    file = request.FILES.get('myfile')
    path = os.path.join(settings.MEDIA_ROOT, 'img')
    with open('%s/%s' % (path, file.name), 'wb') as f:
        for line in file:
            f.write(line)

    return JsonResponse({
        "error": 0,
        "url": "/media/img/%s" % file.name
    })

前端

  KindEditor.ready(function (K) {
            window.editor = K.create('#editor_id', {
                width: '100%',
                height: '600px',
    
                resizeType: 0,
                uploadJson: '/upload_file/',
                filePostName: 'myfile',
                extraFileUploadParams: {
                    csrfmiddlewaretoken: '{{ csrf_token }}'
                }
            });
        });
    
    
 # 注释掉中间件
 # 'django.middleware.clickjacking.XFrameOptionsMiddleware',

 

修文章

 前端

{% extends 'backend/backend_base.html' %}

{% block articles %}

    <div>
        <h3 class="text-center">添加文章</h3>
        <form method="post" action="/update_article/?id={{ article.id }}">
            {% csrf_token %}
            <input type="hidden" name="id" value="{{ article.id }}">
            <div class="form-group">
                <label for="">标题</label>
                <input type="text" class="form-control" name="title" value="{{ article.title }}">
            </div>
            <div class="form-group">
                <label for="">内容</label>
                <textarea name="content" id="editor_id" cols="200" rows="10" class="form-control">
                     {{ article.content }}
                </textarea>
            </div>
            <div class="form-group">
                <label for="">分类</label>
                <select class="form-control" name="category">
                    {% for category in category_list %}
                        {% if article_category.id == category.id %}
                            <option value="{{ category.id }}" selected>{{ category.name }}</option>
                        {% else %}
                            <option value="{{ category.id }}">{{ category.name }}</option>
                        {% endif %}

                    {% endfor %}


                </select>

            </div>
            <div class="form-group">
                <label for="">标签</label>
                <select class="form-control" multiple name="tag">
                    {% for tag in tag_list %}
                        {% if tag in tags %}
                            <option value="{{ tag.id }}" selected>{{ tag.name }}</option>
                        {% else %}
                            <option value="{{ tag.id }}">{{ tag.name }}</option>
                        {% endif %}
                    {% endfor %}


                </select>

            </div>

            <div class="text-center">
                <button class="btn btn-danger">新增文章</button>
            </div>
        </form>

    </div>
{% endblock %}


{% block script %}
    <script charset="utf-8" src="/static/kindeditor/kindeditor-all.js"></script>
    <script charset="utf-8" src="/static/kindeditor/lang/zh-CN.js"></script>
    <script>
        KindEditor.ready(function (K) {
            window.editor = K.create('#editor_id', {
                width: '100%',
                height: '600px',
                resizeType: 0,
                uploadJson: '/upload_file/',
                filePostName: 'myfile',
                extraFileUploadParams: {
                    csrfmiddlewaretoken: '{{ csrf_token }}'
                }
            });
        });
    </script>
{% endblock %}

 

后端

# 修改文章
@login_required(login_url='/login/')
def update_article(request):
    if request.method == 'GET':
        article_id = request.GET.get('id')
        article = Article.objects.get(pk=article_id)
        article_category = article.category  # 当前文章分类
        tags = article.tag.all()  # 当前文章所有标签
        # 拿出当前作者所有分类
        category_list = Category.objects.filter(blog=request.user.blog).all()
        # 拿出当前作者所有标签
        tag_list = Tag.objects.filter(blog=request.user.blog).all()
        return render(request, 'backend/update_article.html', locals())
    else:
        # article_id=request.POST.get('id')
        article_id = request.GET.get('id')

        title = request.POST.get('title')
        content = request.POST.get('content')
        category = request.POST.get('category')
        tag = request.POST.getlist('tag')
        # 处理xss攻击
        soup = BeautifulSoup(content)  # html标签样子
        list_script = soup.find_all('script')  # 找到所有script标签,不会包含 用户的代码  已经被特殊字符替换了
        for l in list_script:
            l.decompose()  # 把这个标签从 html中删除
        content = str(soup)
        desc = soup.text[0:70]  # 取摘要,只要文字,不要标签
        Article.objects.filter(pk=article_id).update(title=title, content=content, desc=desc, category_id=category)
        ArticleToTag.objects.filter(article_id=article_id).delete()
        for i in tag:
            ArticleToTag.objects.create(article_id=article_id, tag_id=i)

        return redirect('/backend/')

 

修改头像

评论成功发送邮件

# django 发送邮件
    - 配置文件修改
        EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com
        EMAIL_PORT = 465
        EMAIL_HOST_USER = '[email protected]'  # 帐号
        EMAIL_HOST_PASSWORD = ''  # 密码
        DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
        #这样收到的邮件,收件人处就会这样显示
        #DEFAULT_FROM_EMAIL = 'lqz<'[email protected]>'
        EMAIL_USE_SSL = True   #使用ssl
        #EMAIL_USE_TLS = False # 使用tls
        
   -写代码--同步
from django.core.mail import send_mail
send_mail('您有新评论了,快去看把', '您的文章id:[%s],被[%s],评论了[%s]' % (article_id, request.user.username, content),settings.EMAIL_HOST_USER, ['[email protected]', '[email protected]', '[email protected]'])

 

总结

# 1 富文本编辑器--kindedit
    -配置参数
    -上传图片---》配合后端接口
    -去除xss攻击---》bs4模块
# 2 修改文章
    -文章渲染到页面上
    
# 3 修改头像
    -request.user.avatar=文件对象
    -save()
    
# 4 发送邮件
    -配置文件
    -调用django提供的send_mail---》起线程异步操作
    
    
    
# 5 表 models,表关系
# 6 注册页面
    -前端---》form 渲染
    -后端-->form校验数据
    -头像实时显示
    -ajax提交注册
    -错误信息渲染  jq 的dom
    
# 7 登录
    -前端
    -验证码---》自己写---》借助于第三方--->存在哪
# 8 首页功能---》分页
    -文章渲染--for
    -轮播图:render,ajax
        -页面加载完成,向后端发送请求
    -修改密码
        -模态框的使用
        -alert
# 9 个人站点
    -文章显示
    -侧边栏:抽取,视图函数合并,路由合并
# 10 文章详情
    - 显示文章  |safe
# 11 点赞点踩---》偷样式
    类选择器选择标签
    前端数字+1
    
# 12 评论
    -render显示根评论和子评论
    -ajax提交根评论并显示
    -ajax提交子评论并显示
# 13 后台管理
    当做作者文章显示
    删除文章
# 14 新增文章

 

标签:07,script,标签,request,---,article,BBS,id
From: https://www.cnblogs.com/wzh366/p/17901306.html

相关文章

  • P2053 [SCOI2007] 修车
    题意有\(n\)个工人,\(m\)个工作。每个人给每个工作有\(t_{i,j}\)的花费。求每个工作的最小平均花费。Sol直接连边跑费用流不好搞。考虑将每种工人在不同时间做的工作暴力建点。枚举\(k\)表示第\(i\)个工人在倒数第\(k\)个做\(j\)工作。这样仍然不好考虑贡献,......
  • JavaWeb - day07 - MySQL - DQL、多表设计
    01.MySQL-DQL-基本查询介绍DQL英文全称是DataQueryLanguage(数据查询语言),用来查询数据库表中的记录。查询关键字:SELECT查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是要远高于增删改操作的。当我们打开某个网站或APP......
  • R语言贝叶斯Metropolis-Hastings Gibbs 吉布斯采样器估计变点指数分布分析泊松过程车
    原文链接:http://tecdat.cn/?p=26578 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于吉布斯采样器的研究报告,包括一些图形和统计输出。指数分布是泊松过程中事件之间时间的概率分布,因此它用于预测到下一个事件的等待时间,例如,您需要在公共汽车站等待的时间,直到下一班车......
  • 机器学习-线性回归-多项式升维-07
    目录1.为什么要升维2代码实现3,总结1.为什么要升维升维的目的是为了去解决欠拟合的问题的,也就是为了提高模型的准确率为目的的,因为当维度不够时,说白了就是对于预测结果考虑的因素少的话,肯定不能准确的计算出模型。在做升维的时候,最常见的手段就是将已知维度进行相乘来构建......
  • 0x07.常用windows命令、搭建网站、状态码
    常用windows命令cmdwtcal 计算器control 控制面板winver 查看版本services.msc服务mstsc 远程桌面regedit 注册表ncpa.cpl 网络连接explorer 此电脑netplwiz 用户账户inetmgr IIS控制台判断windows-server版本IIS版本......
  • BBS 06
    事务事务:四大特性 -原子性-一致性-持久性-隔离性#点赞点踩案例 1点赞点踩增加记录2文章表中数字+1#django中使用事务 1导入fromdjango.dbimporttransaction2使用上下文管理器使用withtransaction.atomic():写的代码,会要么都成......
  • springboot+vue小白升级之路07-快速实现批量删除、小白升级之路08-实现批量导入导出ex
    我们接着之前的内容,全部代码我贴一下,大家参考使用。数据库droptableifexistsan_user;createtablean_user( idintnotnullauto_incrementprimarykeycomment'主键id', namevarchar(255)notnulluniquecomment'姓名', `password`varchar(255)notnullcomment......
  • [20231207]开发不应该这样写sql4.txt
    [20231207]开发不应该这样写sql4.txt--//最近在优化sql语句,发现另外一种风格,实际上以前也遇到过,感觉这就像一种病,会传染只要一个这样写后面的要么跟进要么--//不改。我觉得开发应该感谢exadata,不然我们的生产系统估计会垮掉。1.环境:XXXXXX>@ver1PORT_STRING          ......
  • 解决 OSError: [WinError -1066598274] Windows Error 0xc06d007e (xjl456852原创)
    异常OSError:[WinError-1066598274]WindowsError0xc06d007e或Processfinishedwithexitcode-1066598274(0xC06D007E)遇到问题:程序在调用PCA方法时,出现上述异常.这种PCA方法使用sklearn中的依赖包.我尝试了pip和mamba重新安装多个依赖包之后问题得到解决(只选择一......
  • TSINGSEE青犀可视化视频云平台JT/T1078接入能力在智慧物流中的应用
    一、引言随着科技的快速发展和全球贸易的蓬勃发展,智慧物流成为了现代物流业的重要发展方向。智慧物流通过引入先进的信息技术,实现了物流过程的自动化、智能化和信息化,从而提高了物流效率和准确性。在这个过程中,JT/T1078接入技术发挥着关键的作用。二、JT/T1078接入技术JT/T1078接入......