Python的Flask框架中集成CKeditor富文本编辑器的教程


Posted in Python onJune 13, 2016

CKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScript编写。具备功能强大、配置容易、跨浏览器、支持多种编程语言、开源等特点。它非常流行,互联网上很容易找到相关技术文档,国内许多WEB项目和大型网站均采用了CKeditor。

下载CKeditor
访问CKeditor官方网站,进入下载页面,选择Standard Package(一般情况下功能足够用了),然后点击Download CKEditor按钮下载ZIP格式的安装文件。如果你想尝试更多的功能,可以选择下载Full Package。

下载好CKeditor之后,解压到Flask项目static/ckeditor目录即可。

在Flask项目中使用CKeditor
在Flask项目中使用CKeditor只需要执行两步就可以了:

在<script>标签引入CKeditor主脚本文件。可以引入本地的文件,也可以引用CDN上的文件。
使用CKEDITOR.replace()把现存的<textarea>标签替换成CKEditor。
示例代码:

<!DOCTYPE html>
<html>
  <head>
    <title>A Simple Page with CKEditor</title>
    <!-- 请确保CKEditor文件路径正确 -->
    <script src="{{ url_for('static', filename='ckeditor/ckeditor.js') }}"></script>
  </head>
  <body>
    <form>
      <textarea name="editor1" id="editor1" rows="10" cols="80">
        This is my textarea to be replaced with CKEditor.
      </textarea>
      <script>
        // 用CKEditor替换<textarea id="editor1">
        // 使用默认配置
        CKEDITOR.replace('editor1');
      </script>
    </form>
  </body>
</html>

因为CKeditor足够优秀,所以第二步也可只为<textarea>追加名为ckeditor的class属性值,CKeditor就会自动将其替换。例如:

<!DOCTYPE html>
<html>
  <head>
    <title>A Simple Page with CKEditor</title>
    <!-- 请确保CKEditor文件路径正确 -->
    <script src="{{ url_for('static', filename='ckeditor/ckeditor.js') }}"></script>
  </head>
  <body>
    <form>
      <textarea name="editor1" id="editor1" class="ckeditor" rows="10" cols="80">
        This is my textarea to be replaced with CKEditor.
      </textarea>
    </form>
  </body>
</html>

CKEditor脚本文件也可以引用CDN上的文件,下面给出几个参考链接:

<script src="//cdn.ckeditor.com/4.4.6/basic/ckeditor.js"></script>

 基础版(迷你版)

<script src="//cdn.ckeditor.com/4.4.6/standard/ckeditor.js"></script>

 标准版

<script src="//cdn.ckeditor.com/4.4.6/full/ckeditor.js"></script>

完整版
开启上传功能
默认配置下,CKEditor是没有开启上传功能的,要开启上传功能,也相当的简单,只需要简单修改配置即可。下面来看看几个相关的配置值:

  • filebrowserUploadUrl :文件上传路径。若设置了,则上传按钮会出现在链接、图片、Flash对话窗口。
  • filebrowserImageUploadUrl : 图片上传路径。若不设置,则使用filebrowserUploadUrl值。
  • filebrowserFlashUploadUrl : Flash上传路径。若不设置,则使用filebrowserUploadUrl值。

为了方便,这里我们只设置filebrowserUploadUrl值,其值设为/ckupload/(后面会在Flask中定义这个URL)。

设置配置值主要使用2种方法:

方法1:通过CKEditor根目录的配置文件config.js来设置:

CKEDITOR.editorConfig = function( config ) {
  // ...
  // file upload url
  config.filebrowserUploadUrl = '/ckupload/';
  // ...
};

方法2:将设置值放入作为参数放入CKEDITOR.replace():

<script>
CKEDITOR.replace('editor1', {
  filebrowserUploadUrl: '/ckupload/',
});
</script>

Flask处理上传请求
CKEditor上传功能是统一的接口,即一个接口可以处理图片上传、文件上传、Flash上传。先来看看代码:

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('/ckupload/', methods=['POST'])
def ckupload():
  """CKEditor file upload"""
  error = ''
  url = ''
  callback = request.args.get("CKEditorFuncNum")
  if request.method == 'POST' and 'upload' in request.files:
    fileobj = request.files['upload']
    fname, fext = os.path.splitext(fileobj.filename)
    rnd_name = '%s%s' % (gen_rnd_filename(), fext)
    filepath = os.path.join(app.static_folder, 'upload', rnd_name)
    # 检查路径是否存在,不存在则创建
    dirname = os.path.dirname(filepath)
    if not os.path.exists(dirname):
      try:
        os.makedirs(dirname)
      except:
        error = 'ERROR_CREATE_DIR'
    elif not os.access(dirname, os.W_OK):
      error = 'ERROR_DIR_NOT_WRITEABLE'
    if not error:
      fileobj.save(filepath)
      url = url_for('static', filename='%s/%s' % ('upload', rnd_name))
  else:
    error = 'post error'
  res = """

<script type="text/javascript">
 window.parent.CKEDITOR.tools.callFunction(%s, '%s', '%s');
</script>

""" % (callback, url, error)
  response = make_response(res)
  response.headers["Content-Type"] = "text/html"
  return response

上传文件的获取及保存部分比较简单,是标准的文件上传。这里主要讲讲上传成功后如何回调的问题。

CKEditor文件上传之后,服务端返回HTML文件,HTML文件包含JAVASCRIPT脚本,JS脚本会调用一个回调函数,若无错误,回调函数将返回的URL转交给CKEditor处理。

这3个参数依次是:

  • CKEditorFuncNum : 回调函数序号。CKEditor通过URL参数提交给服务端
  • URL : 上传后文件的URL
  • Error : 错误信息。若无错误,返回空字符串

使用蓝本
在大型应用中经常会使用蓝本,在蓝本视图中集成CKEditor的步骤和app视图基本相同。

1. 创建蓝本时需指明蓝本static目录的绝对路径

demo = Blueprint('demo', static_folder="/path/to/static")

2. 对应url需加上蓝本端点

<script src="{{url_for('.static', filename='ckeditor/ckeditor.js')}}"></script>

<script type="text/javascript">
  CKEDITOR.replace(
    "ckeditor_demo", {
      filebrowserUploadUrl: './ckupload/'
    }
  );
</script>

3. 设置endpoint端点值

response = form.upload(endpoint=demo)
Python 相关文章推荐
python抓取京东商城手机列表url实例代码
Dec 18 Python
从零学python系列之数据处理编程实例(一)
May 22 Python
python 实现红包随机生成算法的简单实例
Jan 04 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
在Python中表示一个对象的方法
Jun 25 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
python lambda函数及三个常用的高阶函数
Feb 05 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
Python调用shell cmd方法代码示例解析
Jun 18 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 #Python
浅谈python中的面向对象和类的基本语法
Jun 13 #Python
深入理解python多进程编程
Jun 12 #Python
python中根据字符串调用函数的实现方法
Jun 12 #Python
python中函数总结之装饰器闭包详解
Jun 12 #Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 #Python
深入理解python中的闭包和装饰器
Jun 12 #Python
You might like
优化php效率,提高php性能的一些方法
2011/03/24 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
jQuery 性能优化指南(3)
2009/05/21 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
python实现网站的模拟登录
2016/01/04 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
python实现KNN分类算法
2019/10/16 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
幼师自我鉴定范文
2013/10/01 职场文书
自荐信的基本格式
2014/02/22 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server