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使用cPickle模块序列化实例
Sep 25 Python
Python的函数的一些高阶特性
Apr 27 Python
python抓取网页中链接的静态图片
Jan 29 Python
PyQT实现多窗口切换
Apr 20 Python
python实现自动登录后台管理系统
Oct 18 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
python实现微信防撤回神器
Apr 29 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
Jun 25 Python
在pycharm下设置自己的个性模版方法
Jul 15 Python
django框架基于queryset和双下划线的跨表查询操作详解
Dec 11 Python
Python基于Tensor FLow的图像处理操作详解
Jan 15 Python
Python自动化测试PO模型封装过程详解
Jun 22 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 文件上传后端处理实用技巧方法
2017/01/06 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
Python代码调试的几种方法总结
2015/04/15 Python
python里运用私有属性和方法总结
2019/07/08 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
使用Python实现画一个中国地图
2019/11/23 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
django使用JWT保存用户登录信息
2020/04/22 Python
用python批量移动文件
2021/01/14 Python
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
C语言编程练习
2012/04/02 面试题
C#和SQL Server的面试题
2016/08/12 面试题
网络工程专业大学生求职信
2014/10/01 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
护士年终个人总结
2015/02/13 职场文书
小区环境卫生倡议书
2015/04/29 职场文书