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

作者:digwtx 时间:2022-08-25 11:26:22 

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,编辑器
0
投稿

猜你喜欢

  • Python模块pexpect安装及使用流程

    2023-04-19 05:41:29
  • PHP实战之投票系统的实现

    2023-10-24 10:40:39
  • SQL中笛卡尔积的实际应用

    2024-01-27 14:18:21
  • 10行Python代码助你整理杂乱无章的文件

    2021-03-08 21:11:12
  • Python学习之不同数据类型间的转换总结

    2021-10-04 06:06:57
  • keras小技巧——获取某一个网络层的输出方式

    2023-08-20 12:56:47
  • 安全校验Session验证码并避免绕开验证码攻击

    2022-06-30 20:15:41
  • python 实现多线程的三种方法总结

    2022-10-17 07:09:11
  • 使用python编写android截屏脚本双击运行即可

    2021-01-25 20:47:19
  • 解决在Python编辑器pycharm中程序run正常debug错误的问题

    2023-09-09 09:58:39
  • OpenCV-Python实现油画效果的实例

    2022-03-26 09:16:37
  • python DataFrame数据格式化(设置小数位数,百分比,千分位分隔符)

    2021-02-03 21:34:10
  • python递归下载文件夹下所有文件

    2023-08-07 07:21:55
  • python-opencv中的cv2.inRange函数用法说明

    2022-09-29 23:39:08
  • 解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题

    2024-04-27 16:17:33
  • Python中for循环详解

    2021-06-22 18:41:56
  • 在for循环中length值是否需要缓存

    2023-07-02 05:19:20
  • Golang编译器介绍

    2024-05-02 16:26:01
  • HTML标签tbody的用法

    2009-11-02 10:11:00
  • Win10安装MySQL5.7.18winX64 启动服务器失败并且没有错误提示

    2024-01-27 04:59:14
  • asp之家 网络编程 m.aspxhome.com