您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:19:07 python 字数 12828 阅读 403 来源 www.jb51.cc/python

xhEditor简介 xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化HTML编辑器,基于网络访问并且兼容IE6.0+,Firefox3.0+,Opera9.6+,Chrome1.0+,Safari3.22+。

概述

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主要特点:

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

2016613160455992.jpg (568×150)

2016613160518061.jpg (590×237)

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

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

示例代码

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

<body>
<textarea id="content" name="content" class="xheditor {tools:'mfull'}"></textarea>
</body>

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

2016613160542615.jpg (653×366)

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

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

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

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

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

存于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,rnd_name),'wb') as fp:
      fp.write(img)

    result["msg"]["url"] = '!%s' % \
      url_for('static',rnd_name))

  return json.dumps(result)

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

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

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

远程抓图处理示例代码

def gen_rnd_filename():
  filename_prefix = datetime.datetime.Now().strftime('%Y%m%d%H%M%s')
  return '%s%s' % (filename_prefix,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,'wb') as fp:
          fp.write(downfile.read())
        urlreturn = url_for('static',rnd_name))
        urlout.append(urlreturn)
      else:
        urlout.append(url)
  result = '|'.join(urlout)
  return result

总结

以上是编程之家为你收集整理的Python的Flask站点中集成xhEditor文本编辑器的教程全部内容,希望文章能够帮你解决Python的Flask站点中集成xhEditor文本编辑器的教程所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶