|
# 后台管理
所有文件夹都可以根据功能再细化,你还可以继续创建文件夹分类处理
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标签
这两步都繁琐 有没有人帮我们处理一下呢
[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())
|
|
|