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基于pyDes库实现des加密的方法
Apr 29 Python
老生常谈进程线程协程那些事儿
Jul 24 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
用python打印1~20的整数实例讲解
Jul 01 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
Python中常见的数制转换有哪些
May 27 Python
PyQt中使用QtSql连接MySql数据库的方法
Jul 28 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
Django haystack实现全文搜索代码示例
Nov 28 Python
python 6种方法实现单例模式
Dec 15 Python
Python列表的深复制和浅复制示例详解
Feb 12 Python
python超详细实现完整学生成绩管理系统
Mar 17 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
BBS(php &amp; mysql)完整版(四)
2006/10/09 PHP
php iconv() : Detected an illegal character in input string
2010/12/05 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
2017/02/09 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
Python编写百度贴吧的简单爬虫
2015/04/02 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
python学生管理系统代码实现
2020/04/05 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
python pygame实现球球大作战
2019/11/25 Python
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
分家协议书
2014/04/21 职场文书
民事和解协议书格式
2014/11/29 职场文书
清洁工个人工作总结
2015/03/05 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
会议主持词通用版
2019/04/02 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
Go语言中break label与goto label的区别
2021/04/28 Golang
python基础学习之生成器与文件系统知识总结
2021/05/25 Python
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript
python数字图像处理:图像简单滤波
2022/06/28 Python