Python3 + Django2.0 百度Ueditor 富文本编辑器的集成

百度富文本编辑器官网地址:http://fex.baidu.com/ueditor/

疑问:为什么要二次集成?

答案:因为百度富文本编辑器Ueditor没有对python的支持

步骤1:

  在官网下载Ueditor的任意版本代码:http://ueditor.baidu.com/website/download.html#ueditor

步骤2:

  将下载的代码放入到 django 项目中

步骤3:前端引用

  在前端HTML代码中引用富文本编辑器【注意:此时因为还没有实例化富文本编辑器,所以暂时无效果!!!】

<!--  引用对应的js文件 -->
<script type="text/javascript" charset="utf-8"
src="{% static 'xxx/xxx/ueditor.config.js' %}"></script>
<script type="text/javascript" charset="utf-8"
src="{% static 'xxx/xxx/ueditor.all.min.js' %}"></script> <!-- 富文本编辑器 --> <div>
<script id="uedit" type="text/plain></script>
</div>

步骤6:js代码

  在前端引用之后,使用js实例化Ueditor,并且配置一些参数:

// 富文本编辑器处理方法
News.prototype.listenEditor = function () {
// 实例化一个富文本编辑器
window.ue = UE.getEditor('editor', {
'initialFrameHeight': 400,//设置富文本编辑器的高度
//'serverUrl': '/ueditor/upload/', //设置文件上传的视图函数(服务器路径)
/*
* initialFrameWidth:"100%":设置富文本 编辑器自适应宽度
* 也可以在:ueditor.config.js中修改initialFrameWidth 达到同样的目的
*/
initialFrameWidth:"100%"
});
};

步骤6:军事机密,django + python服务端的集成处理(直接复制就可以用了)

  1> views.py 中逻辑代码,还需要在settings进行对应的配置

# encoding: utf-8

"""
百度富文本编辑器python版本服务端集成代码
""" import json
import re
import string
import time
import hashlib
import random
import base64
import sys
import os
from urllib import parse
# from django.conf import settings
from django.conf import settings
from django.http import JsonResponse
from django.shortcuts import reverse
from django.views.decorators.csrf import csrf_exempt
from django.http import FileResponse
from django.views.generic import View
from django.utils.decorators import method_decorator
from django.views.decorators.http import require_http_methods # 更改工作目录。这么做的目的是七牛qiniu的sdk
# 在设置缓存路径的时候默认会设置到C:/Windows/System32下面
# 会造成没有权限创建。
# os.chdir(os.path.dirname(__file__)) # 这个在我的项目中设置后,服务器启动回报:manage.py 文件不存在,注释后一切正常
try:
import qiniu
except:
raise RuntimeError("3333333333")
# pass
from io import BytesIO # 七牛相关配置
UEDITOR_QINIU_ACCESS_KEY = ""
UEDITOR_QINIU_SECRET_KEY = ""
UEDITOR_QINIU_BUCKET_NAME = ""
UEDITOR_QINIU_DOMAIN = "" # ueditor 富文本编辑器的 config.json 配置文件路径
UEDITOR_CONFIG_PATH = ""
# 配置文件上传路径
UEDITOR_UPLOAD_PATH = ""
# 是否要将文件上传到七牛
UEDITOR_UPLOAD_TO_QINIU = False
# 是否要将文件上传到自己的服务器
UEDITOR_UPLOAD_TO_SERVER = False # 用来判断是否要将文件上传到自己的服务器
try:
UEDITOR_UPLOAD_TO_SERVER = settings.UEDITOR_UPLOAD_TO_SERVER
if UEDITOR_UPLOAD_TO_SERVER:
UEDITOR_UPLOAD_PATH = settings.UEDITOR_UPLOAD_PATH
if not os.path.exists(UEDITOR_UPLOAD_PATH):
os.mkdir(UEDITOR_UPLOAD_PATH)
except Exception as e:
os.chdir(os.path.join('..', '..', os.path.dirname(__file__)))
raise RuntimeError("123"+os.getcwd())
# pass # 用来判断是否要将文件上传到七牛
try:
UEDITOR_UPLOAD_TO_QINIU = settings.UEDITOR_UPLOAD_TO_QINIU
except:
raise RuntimeError("1111111111111111")
# pass # 如果既没有配置上传到本地,又没有配置上传到七牛,那么就抛出异常
if not UEDITOR_UPLOAD_PATH and not UEDITOR_UPLOAD_TO_QINIU:
raise RuntimeError("UEditor的UEDITOR_UPLOAD_TO_SERVER或者UEDITOR_UPLOAD_TO_QINIU必须配置一项!") # 判断是否配置了config.json文件的路径
try:
UEDITOR_CONFIG_PATH = settings.UEDITOR_CONFIG_PATH
except:
raise RuntimeError("请配置UEditor的配置文件的路径!") # 如果配置了七牛的配置信息
if UEDITOR_UPLOAD_TO_QINIU:
try:
UEDITOR_QINIU_ACCESS_KEY = settings.UEDITOR_QINIU_ACCESS_KEY
UEDITOR_QINIU_SECRET_KEY = settings.UEDITOR_QINIU_SECRET_KEY
UEDITOR_QINIU_BUCKET_NAME = settings.UEDITOR_QINIU_BUCKET_NAME
UEDITOR_QINIU_DOMAIN = settings.UEDITOR_QINIU_DOMAIN
except Exception as e:
option = e.args[0]
raise RuntimeError('请在app.config中配置%s!' % option)
#
# @method_decorator(decorator,name=''):将函数装饰器转换为类装饰器
# @csrf_exempt:csrftoken装饰器
# @require_http_methods(['GET','POST']):请求装饰器,只允许 get 、 post 请求
#
@method_decorator([csrf_exempt, require_http_methods(['GET', 'POST'])], name='dispatch')
class UploadView(View):
# 构造函数
def __init__(self):
super(UploadView, self).__init__() def _random_filename(self, rawfilename):
"""
随机的文件名,保证文件名称不会冲突
"""
letters = string.ascii_letters
random_filename = str(time.time()) + "".join(random.sample(letters, 5))
filename = hashlib.md5(random_filename.encode('utf-8')).hexdigest()
subffix = os.path.splitext(rawfilename)[-1]
return filename + subffix def _json_result(self, state='', url='', title='', original=''):
"""
返回指定格式的json数据的
"""
result = {
'state': state,
'url': url,
'title': title,
'original': original
}
return JsonResponse(result) def _upload_to_qiniu(self, upfile, filename):
"""
上传文件到七牛
"""
if not sys.modules.get('qiniu'):
raise RuntimeError('没有导入qiniu模块!')
q = qiniu.Auth(UEDITOR_QINIU_ACCESS_KEY, UEDITOR_QINIU_SECRET_KEY)
token = q.upload_token(UEDITOR_QINIU_BUCKET_NAME)
buffer = BytesIO()
for chunk in upfile.chunks():
buffer.write(chunk)
buffer.seek(0)
ret, info = qiniu.put_data(token, filename, buffer.read())
if info.ok:
url = parse.urljoin(UEDITOR_QINIU_DOMAIN, ret['key'])
return 'SUCCESS', url, ret['key'], ret['key']
else:
return 'FAIL', None, None, None def _upload_to_server(self, upfile, filename):
"""
上传文件到自己的服务器
"""
with open(os.path.join(UEDITOR_UPLOAD_PATH, filename), 'wb') as fp:
for chunk in upfile.chunks():
fp.write(chunk)
url = reverse("ueditor:send_file", kwargs={"filename": filename})
return 'SUCCESS', url, filename, filename def _action_config(self):
"""
处理configl类型的响应
将配置文件以 json 格式返回给前端
"""
config_path = UEDITOR_CONFIG_PATH
with open(config_path, 'r', encoding='utf-8') as fp:
result = json.loads(re.sub(r'\/\*.*\*\/', '', fp.read()))
return JsonResponse(result) def _action_upload(self, request):
"""
处理文件(图片,视频,普通文件)上传
"""
upfile = request.FILES.get("upfile")
filename = self._random_filename(upfile.name) qiniu_result = None
server_result = None if UEDITOR_UPLOAD_TO_QINIU:
qiniu_result = self._upload_to_qiniu(upfile, filename) if UEDITOR_UPLOAD_TO_SERVER:
server_result = self._upload_to_server(upfile, filename) if qiniu_result and qiniu_result[0] == 'SUCCESS':
return self._json_result(*qiniu_result)
elif server_result and server_result[0] == 'SUCCESS':
return self._json_result(*server_result)
else:
return self._json_result() def _action_scrawl(self, request):
base64data = request.form.get("upfile")
img = base64.b64decode(base64data)
filename = self._random_filename('xx.png')
with open(os.path.join(UEDITOR_UPLOAD_PATH, filename), 'wb') as fp:
fp.write(img)
url = reverse('ueditor:send_file', kwargs={"filename": filename})
return self._json_result('SUCCESS', url, filename, filename) # 类视图入口函数
# 当请求该类视图时,会优先执行此函数
# activate:文件类型
def dispatch(self, request, *args, **kwargs):
super(UploadView, self).dispatch(request, *args, **kwargs)
action = request.GET.get('action')
if action == 'config':
return self._action_config()
elif action in ['uploadimage', 'uploadvideo', 'uploadfile']:
return self._action_upload(request)
elif action == 'uploadscrawl':
return self._action_scrawl(request)
else:
return self._json_result() def send_file(request, filename):
fp = open(os.path.join(UEDITOR_UPLOAD_PATH, filename), 'rb')
response = FileResponse(fp)
response['Content-Type'] = "application/octet-stream"
return response

  2> settings.py 中的配置

# """
# 百度UEditor富文本编辑配置
# """
# 是否要将文件上传到七牛(必须)
UEDITOR_UPLOAD_TO_QINIU = True
# 是否要将文件上传到自己的服务器(必须)
UEDITOR_UPLOAD_TO_SERVER = False # 七牛相关配置(UEDITOR_UPLOAD_TO_QINIU:True:则必须进行配置,否则无须配置)
UEDITOR_QINIU_ACCESS_KEY = "自己的ACCESS_KEY"
UEDITOR_QINIU_SECRET_KEY = "自己的SECRET_KEY "
UEDITOR_QINIU_BUCKET_NAME = "对象存储空间名称"
# 域名 http://域名/
UEDITOR_QINIU_DOMAIN = "http://域名/" # config.json 配置文件路径
# php版本的Ueditor config.json 路径为:ueditor\utf8-php\php\config.json
UEDITOR_CONFIG_PATH = os.path.join(BASE_DIR, 'front', 'dist', 'ueditor', 'utf8-php', 'php', 'config.json') # 配置文件上传路径(UEDITOR_UPLOAD_TO_SERVER:True:则必须进行配置,否则无须配置)
# UEDITOR_UPLOAD_PATH = MEDIA_ROOT

django之百度Ueditor富文本编辑器后台集成的更多相关文章

  1. 百度ueditor富文本编辑器的使用

    百度ueditor富文本编辑器的使用 //以下为我在官网下载的ueditor v1.3.5 php版的大楷配置步骤第一步: //配置文件的引入应该比功能文件先引入,最后设置语言类型.即:editor. ...

  2. ASP.NET MVC5 中百度ueditor富文本编辑器的使用

    随着网站信息发布内容越来越多,越来越重视美观,富文本编辑就是不可缺少的了,众多编辑器比较后我选了百度的ueditor富文本编辑器. 百度ueditor富文本编辑器分为两种一种是完全版的ueditor, ...

  3. PHP如何搭建百度Ueditor富文本编辑器

    本文为大家分享了PHP搭建百度Ueditor富文本编辑器的方法,供大家参考,具体内容如下 下载UEditor 官网:下载地址 将下载好的文件解压到thinkphp项目中,本文是解压到PUBLIC目录下 ...

  4. vue集成百度UEditor富文本编辑器

    在前端开发的项目中.难免会遇到需要在页面上集成一个富文本编辑器.那么.如果你有这个需求.希望可以帮助到你 vue是前端开发者所追捧的框架,简单易上手,但是基于vue的富文本编辑器大多数太过于精简.于是 ...

  5. 百度UEditor(富文本编辑器)的基础用法

    百度的这个编辑器挺强大的,这里只是用他的文本功能,没有介绍上传图片视频的. 我用是的SSH来写的项目. 1. 把下载的UEditor(ueditor1_4_3_1-utf8-jsp)解压后全部复制到W ...

  6. 百度UEditor富文本编辑器去除过滤div等标签

    将设计排版好的页面html代码上传到数据库,再读取出来的时候发现所有的div都被替换成了p标签. 解决方法: 首先在ueditor.all.js文件内搜索allowDivTransToP,找到如下的代 ...

  7. 百度UEditor富文本编辑器去除自动追加p标签

    本篇文章还原了我在遇到这个问题时的解决过程: 找到ueditor.all.js文件,搜索 me.addInputRule(function(root){ 或者直接搜索 //进入编辑器的li要套p标签 ...

  8. vue2.x结合百度UEditor富文本编辑器

    1.首先下载UEditor源码(https://ueditor.baidu.com/website/),将整个文件放到static文件夹中 2.在src/components文件夹下创建公共组件UEd ...

  9. 百度Ueditor富文本编辑器 .net版本 任意文件上传执行漏掉修复

    问题描述: 借由上传网络图片功能中可传递可执行文件.后台代码中只做了文件类型的检测未能正确的拦截掉非法文件. 只需将上传地址改为 XXXXXX.jpg?.aspx最终服务上最终存储的文件会变为XXXX ...

随机推荐

  1. 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ...

  2. 【LeetCode】427. Construct Quad Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  3. 【LeetCode】297. Serialize and Deserialize Binary Tree 解题报告(Python)

    [LeetCode]297. Serialize and Deserialize Binary Tree 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode ...

  4. idea使用教程-idea简介

    集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器.编译器.调试器和图形用户界面等工具.集成了代码编写功 ...

  5. 使用.NET 6开发TodoList应用(9)——实现PUT请求

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 PUT请求本身其实可说的并不多,过程也和创建基本类似.在这篇文章中,重点是填上之前文章里留的一个坑,我们曾经给TodoItem ...

  6. Histogram Processing

    目录 HISTOGRAM EQUALIZATION 代码示例 HISTOGRAM MATCHING (SPECIFICATION) 其它 Gonzalez R. C. and Woods R. E. ...

  7. UML 基本模型元素

    目录 1. 结构模型元素 (1)类(class) (2)接口(interface) (3)协作(collaboration) (4)用例(use case) (5)活动类(active class) ...

  8. CSS基础 装饰 元素本身隐藏和显示效果及案例

    1.visibility:hidden; 2.display: none: 区别: 1.visibility:hidden 隐藏元素本身,且在网页中 占位置 2.display:none; 隐藏元素本 ...

  9. 为EasySharding.EFCore提供Dapper相关查询扩展

    承接上一篇博文中的中间件基本都是写入性的操作,但对于查询操作实际上是比较鸡肋的,如果单纯的查询,没有分表的情况下基本还能适应,这里为了Dapper提供了扩展 Dapper的扩展查询是需要写表名称的,所 ...

  10. Pytest_常用执行参数详解(3)

    前面讲了测试用例的执行方式,也认识了 -v  -s 这些参数,那么还有没有其它参数呢?答案肯定是有的,我们可以通过 pytest -h来查看所有可用参数. 从图中可以看出,pytest的参数有很多,但 ...