侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python的Flask站点中集成xhEditor文本编辑器的教程

Python  /  管理员 发布于 7年前   146

xhEditor简介
xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化HTML编辑器,基于网络访问并且兼容IE 6.0+, Firefox 3.0+, Opera 9.6+, Chrome 1.0+, Safari 3.22+。

xhEditor曾经是我比较喜欢的编辑器,也是率先支持拖拽上传的编辑器之一。xhEditor在当年是优秀的编辑器,功能足够强大,使用体验也相当好,拖拽上传是我最喜欢的功能,只可惜已经停止开发了。xhEditor最后的稳定版本是1.1.14,至今已超过2年未更新(2013年发布了开发版本1.2.1),作者已经停止开发和维护了,社区论坛完全不能打开。

由于xhEditor基于jQuery开发,而对于新版本的jQuery,它并不能很好的支持,只有1.4版本的jQuery是支持得最好的。

虽然已经不再更新了,但在一些需要富文本编辑器的场合,她还是可以完全胜任的。

本文以1.1.14版本为例,讲述如何在Flask项目中使用xhEditor编辑器,并实现图片上传、文件上传的后端功能。

xhEditor主要特点:

  • 精简迷你:初始加载4个文件,包括:1个js(50k)+2个css(10k)+1个图片(5k),总共65k。若js和css文件进行gzip压缩传输,可以进一步缩减为24k左右。
  • 使用简单:简单的调用方式,加一个class属性就能将您的textarea立马变成一个功能丰富的可视化编辑器。
  • 无障碍访问:提供WAI-ARIA全面支持,全键盘精细操作,全程语音向导,提供完美无障碍访问体验,让残疾人也能够谱写精彩人生。
  • 内置Ajax上传:内置强大的Ajax上传,包括HTML4和HTML5上传支持(多文件上传、真实上传进度及文件拖放上传),剪切板上传及远程抓取上传,追求完美的用户上传体验。
  • Word自动清理:实现Word代码自动检测并清理,提供高效完美的Word代码过滤方案,生成代码最优化精简,但是却不丢失任何细节效果。
  • UBB可视化编辑:提供完美的UBB可视化编辑解决方案,在您获得安全高效代码存储的同时,又能享受可视化编辑的便捷。

在Flask项目中使用xhEditor
首先我们需要到xhEditor官网下载1.1.14版本的xhEditor编辑器,下载之后解压到
Flask项目的static/xheditor目录。

xhEditor提供2种初始化方式:Class初始化和JavaScript初始化。Class初始化只需要给textarea设置值为xheditor的class属性,它就会自动变成xhEditor编辑器,一个页面可以同时同在多个编辑器,而且这个类属性可以添加参数。(PS:CKEditor也有这个功能)

对于这两种初始化方式,官网有提供设置很方便的设置向导,使得配置相对比较简单。

示例代码:

<head><script type="text/javascript" charset="utf-8" src="https:/article/{{ url_for('static', filename='xheditor/jquery/jquery-1.4.4.min.js') }}"></script><script type="text/javascript" charset="utf-8" src="https:/article/{{ url_for('static', filename='xheditor/xheditor-1.1.14-zh-cn.min.js') }}"></script><style>.xheditor {width: 640px; height:320px;}</style></head><body><textareaname="content" class="xheditor {tools:'mfull'}"></textarea></body>

现在,我们就拥有一个xhEditor编辑器了。

开启上传功能
xhEditor的上传功能需要设置几个参数(以图片上传为例):

  • upImgUrl : 图片文件上传接收URL,例:/upload/,可使用内置变量{editorRoot}
  • upImgExt : 图片上传前限制本地文件扩展名,默认:jpg,jpeg,gif,png

这里假设上传文件接收URL为/upload/,我们的编辑器初始化代码就变成:

<textarea class="xheditor {tools:'mfull',upImgUrl:'/upload/'}"></textarea>

其他类型的文件上传设置类推。

Flask处理上传请求
xhEditor支持2种上传方式:标准HTML4上传和HTML5上传。

  • HTML4上传使用标准的表单上传域,上传文件域的name为:filedata
  • HTML5上传的整个POST数据流就是上传的文件完整数据,而本地文件名等信息储

存于HTTP_CONTENT_DISPOSITION这个服务器变量中

返回内容必需是标准的json字符串,结构可以是如下:

{"err":"","msg":"200906030521128703.gif"} 或者{"err":"","msg":{"url":"200906030521128703.jpg","localfile":"test.jpg","id":"1"}}

注:若选择结构2,则url变量是必有。

文件上传处理示例代码:

def gen_rnd_filename():  filename_prefix = datetime.datetime.now().strftime('%Y%m%d%H%M%S')  return '%s%s' % (filename_prefix, str(random.randrange(1000, 10000)))@app.route('/upload/', methods=['GET', 'POST'])def upload():  '''文件上传函数  本函数未做上传类型判断及上传大小判断。  '''  result = {"err": "", "msg": {"url": "", "localfile": ""}}  if request.method == 'POST' and 'filedata' in request.files:    # 传统上传模式,IE浏览器使用这种模式    fileobj = request.files['filedata']    fname, fext = os.path.splitext(fileobj.filename)    rnd_name = '%s%s' % (gen_rnd_filename(), fext)    fileobj.save(os.path.join(app.static_folder, 'upload', rnd_name))    result["msg"]["localfile"] = fileobj.filename    result["msg"]["url"] = '!%s' % \      url_for('static', filename='%s/%s' % ('upload', rnd_name))  elif 'CONTENT_DISPOSITION' in request.headers:    # HTML5上传模式,FIREFOX等默认使用此模式    pattern = re.compile(r"""\s.*?\s?filename\s*=\s*['|"]?([^\s'"]+).*?""", re.I)    _d = request.headers.get('CONTENT_DISPOSITION').encode('utf-8')    if urllib.quote(_d).count('%25') > 0:      _d = urllib.unquote(_d)    filenames = pattern.findall(_d)    if len(filenames) == 1:      result["msg"]["localfile"] = urllib.unquote(filenames[0])      fname, fext = os.path.splitext(filenames[0])    img = request.data    rnd_name = '%s%s' % (gen_rnd_filename(), fext)    with open(os.path.join(app.static_folder, 'upload', rnd_name), 'wb') as fp:      fp.write(img)    result["msg"]["url"] = '!%s' % \      url_for('static', filename='%s/%s' % ('upload', rnd_name))  return json.dumps(result)

远程抓图
一般情况下,当复制站外的图片时,我们希望可以把图片保存到本地,远程抓图就可以完成这个事情。

启用远程抓图功能,需要设置2个参数:

  • localUrlTest : 非本站域名测试正则表达式
  • remoteImgSaveUrl : 远程图片抓取接收程序URL

设置这2个参数之后,我们的编辑器初始化代码变成:

复制代码 代码如下:
<textarea class="xheditor {tools:'mfull',upImgUrl:'/upload/',localUrlTest:/^https?:\/\/[^\/]*?(localhost:?\d*)\//i,remoteImgSaveUrl:'/uploadremote/'}"></textarea>

这里表示抓取除localhost之外其它域名的图片。

远程抓图处理示例代码:

def gen_rnd_filename():  filename_prefix = datetime.datetime.now().strftime('%Y%m%d%H%M%S')  return '%s%s' % (filename_prefix, str(random.randrange(1000, 10000)))@app.route('/uploadremote/', methods=['POST'])def uploadremote():  """  xheditor保存远程图片简单实现  URL用"|"分隔,返回的字符串也是用"|"分隔  返回格式是字符串,不是JSON格式  """  localdomain_re = re.compile(r'https?:\/\/[^\/]*?(localhost:?\d*)\/', re.I)  imageTypes = {'gif': '.gif', 'jpeg': '.jpg', 'jpg': '.jpg', 'png': '.png'}  urlout = []  result = ''  srcUrl = request.form.get('urls')  if srcUrl:    urls = srcUrl.split('|')    for url in urls:      if not localdomain_re.search(url.strip()):        downfile = urllib.urlopen(url)        fext = imageTypes[downfile.headers.getsubtype().lower()]        rnd_name = '%s%s' % (gen_rnd_filename(), fext)        with open(os.path.join(app.static_folder, 'upload', rnd_name), 'wb') as fp:          fp.write(downfile.read())        urlreturn = url_for('static', filename='%s/%s' % ('upload', rnd_name))        urlout.append(urlreturn)      else:        urlout.append(url)  result = '|'.join(urlout)  return result

您可能感兴趣的文章:

  • Python的Flask框架中集成CKeditor富文本编辑器的教程
  • 使用Python读写文本文件及编写简单的文本编辑器
  • python基于Tkinter库实现简单文本编辑器实例
  • python写的一个文本编辑器
  • 好用的Python编辑器WingIDE的使用经验总结
  • 基于wxpython开发的简单gui计算器实例
  • python使用wxpython开发简单记事本的方法
  • python使用wxPython打开并播放wav文件的方法
  • Python中使用wxPython开发的一个简易笔记本程序实例
  • Python实现的文本编辑器功能示例


  • 上一条:
    详解Python的Flask框架中的signals信号机制
    下一条:
    Python的Flask框架中集成CKeditor富文本编辑器的教程
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客