Python的Flask站点中集成xhEditor文本编辑器的教程
xhEditor简介 xhEditor曾经是我比较喜欢的编辑器,也是率先支持拖拽上传的编辑器之一。xhEditor在当年是优秀的编辑器,功能足够强大,使用体验也相当好,拖拽上传是我最喜欢的功能,只可惜已经停止开发了。xhEditor最后的稳定版本是1.1.14,至今已超过2年未更新(2013年发布了开发版本1.2.1),作者已经停止开发和维护了,社区论坛完全不能打开。 由于xhEditor基于jQuery开发,而对于新版本的jQuery,它并不能很好的支持,只有1.4版本的jQuery是支持得最好的。 虽然已经不再更新了,但在一些需要富文本编辑器的场合,她还是可以完全胜任的。 本文以1.1.14版本为例,讲述如何在Flask项目中使用xhEditor编辑器,并实现图片上传、文件上传的后端功能。 xhEditor主要特点:
在Flask项目中使用xhEditor xhEditor提供2种初始化方式:Class初始化和JavaScript初始化。Class初始化只需要给textarea设置值为xheditor的class属性,它就会自动变成xhEditor编辑器,一个页面可以同时同在多个编辑器,而且这个类属性可以添加参数。(PS:CKEditor也有这个功能) 对于这两种初始化方式,官网有提供设置很方便的设置向导,使得配置相对比较简单。 示例代码: <head> <script type="text/javascript" charset="utf-8" src="{{ url_for('static',filename='xheditor/jquery/jquery-1.4.4.min.js') }}"></script> <script type="text/javascript" charset="utf-8" src="{{ url_for('static',filename='xheditor/xheditor-1.1.14-zh-cn.min.js') }}"></script> <style>.xheditor {width: 640px; height:320px;}</style> </head> <body> <textarea id="content" name="content" class="xheditor {tools:'mfull'}"></textarea> </body> 现在,我们就拥有一个xhEditor编辑器了。 开启上传功能
这里假设上传文件接收URL为/upload/,我们的编辑器初始化代码就变成: <textarea class="xheditor {tools:'mfull',upImgUrl:'/upload/'}"></textarea> 其他类型的文件上传设置类推。 Flask处理上传请求
存于HTTP_CONTENT_DISPOSITION这个服务器变量中 返回内容必需是标准的json字符串,结构可以是如下: {"err":"","msg":"200906030521128703.gif"} 或者 {"err":"","msg":{"url":"200906030521128703.jpg","localfile":"test.jpg","id":"1"}} 注:若选择结构2,则url变量是必有。 文件上传处理示例代码: 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('/upload/',methods=['GET','POST']) def upload(): '''文件上传函数 本函数未做上传类型判断及上传大小判断。 ''' result = {"err": "","msg": {"url": "","localfile": ""}} if request.method == 'POST' and 'filedata' in request.files: # 传统上传模式,IE浏览器使用这种模式 fileobj = request.files['filedata'] fname,fext = os.path.splitext(fileobj.filename) rnd_name = '%s%s' % (gen_rnd_filename(),fext) fileobj.save(os.path.join(app.static_folder,'upload',rnd_name)) result["msg"]["localfile"] = fileobj.filename result["msg"]["url"] = '!%s' % url_for('static',filename='%s/%s' % ('upload',rnd_name)) elif 'CONTENT_DISPOSITION' in request.headers: # HTML5上传模式,FIREFOX等默认使用此模式 pattern = re.compile(r"""s.*?s?filenames*=s*['|"]?([^s'"]+).*?""",re.I) _d = request.headers.get('CONTENT_DISPOSITION').encode('utf-8') if urllib.quote(_d).count('%25') > 0: _d = urllib.unquote(_d) filenames = pattern.findall(_d) if len(filenames) == 1: result["msg"]["localfile"] = urllib.unquote(filenames[0]) fname,fext = os.path.splitext(filenames[0]) img = request.data rnd_name = '%s%s' % (gen_rnd_filename(),fext) with open(os.path.join(app.static_folder,rnd_name),'wb') as fp: fp.write(img) result["msg"]["url"] = '!%s' % url_for('static',rnd_name)) return json.dumps(result) 远程抓图 启用远程抓图功能,需要设置2个参数:
设置这2个参数之后,我们的编辑器初始化代码变成: 复制代码 代码如下: <textarea class="xheditor {tools:'mfull',upImgUrl:'/upload/',localUrlTest:/^https?://[^/]*?(localhost:?d*)//i,remoteImgSaveUrl:'/uploadremote/'}"></textarea> 这里表示抓取除localhost之外其它域名的图片。
远程抓图处理示例代码: def gen_rnd_filename(): filename_prefix = datetime.datetime.now().strftime('%Y%m%d%H%M%S') return '%s%s' % (filename_prefix,10000))) @app.route('/uploadremote/',methods=['POST']) def uploadremote(): """ xheditor保存远程图片简单实现 URL用"|"分隔,返回的字符串也是用"|"分隔 返回格式是字符串,不是JSON格式 """ localdomain_re = re.compile(r'https?://[^/]*?(localhost:?d*)/',re.I) imageTypes = {'gif': '.gif','jpeg': '.jpg','jpg': '.jpg','png': '.png'} urlout = [] result = '' srcUrl = request.form.get('urls') if srcUrl: urls = srcUrl.split('|') for url in urls: if not localdomain_re.search(url.strip()): downfile = urllib.urlopen(url) fext = imageTypes[downfile.headers.getsubtype().lower()] rnd_name = '%s%s' % (gen_rnd_filename(),fext) with open(os.path.join(app.static_folder,'wb') as fp: fp.write(downfile.read()) urlreturn = url_for('static',rnd_name)) urlout.append(urlreturn) else: urlout.append(url) result = '|'.join(urlout) return result (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |