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模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 Python
python使用cookie库操保存cookie详解
Mar 03 Python
举例讲解Python中的身份运算符的使用方法
Oct 13 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
pycharm 在windows上编辑代码用linux执行配置的方法
Oct 27 Python
Python pymsql模块的使用
Sep 07 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
python解压zip包中文乱码解决方法
Nov 27 Python
如何利用python生成MD5并去重
Dec 07 Python
用Python生成会跳舞的美女
Jan 18 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中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
php上传图片类及用法示例
2016/05/11 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
JavaScript AJAX之惰性载入函数
2014/08/27 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
layui导航栏实现代码
2017/05/19 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
python读取Excel实例详解
2018/08/17 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
小学红领巾中秋节广播稿
2014/01/13 职场文书
就业表自我评价分享
2014/02/06 职场文书
怀念母亲教学反思
2014/04/28 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
惊天动地观后感
2015/06/10 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL