在python web.py中使用百度富文本编辑器 UEditor

时间:2022-12-25 19:46:17

UEditor官方没有支持python的版本,有人改了个python的django版本,但是没找到web.py的。

于是参考php版本,实现了一下web.py集成UEditor,包含了文件上传,图片上传,视频上传,图片远程抓取,涂鸦等。

可能会有一些session之类的没有处理。

Demo代码可以在https://github.com/meizhitu/100programhomework/tree/master/100-25-literal-10-todo 查看

首先改ueditor.config.js,把原来指向php的链接改成web.py的

 //图片上传配置区
,imageUrl:"/ue_imageUp" //图片上传提交地址
,imagePath:"" //图片修正地址,引用了fixedImagePath,如有特殊需求,可自行配置
//,imageFieldName:"upfile" //图片数据的key,若此处修改,需要在后台对应文件修改对应参数
//,compressSide:0 //等比压缩的基准,确定maxImageSideLength参数的参照对象。0为按照最长边,1为按照宽度,2为按照高度
//,maxImageSideLength:900 //上传图片最大允许的边长,超过会自动等比缩放,不缩放就设置一个比较大的值,更多设置在image.html中
//,savePath: [ 'upload1', 'upload2', 'upload3' ] //图片保存在服务器端的目录, 默认为空, 此时在上传图片时会向服务器请求保存图片的目录列表,
// 如果用户不希望发送请求, 则可以在这里设置与服务器端能够对应上的目录名称列表
//比如: savePath: [ 'upload1', 'upload2' ]

//涂鸦图片配置区
,scrawlUrl:"/ue_scrawlUp" //涂鸦上传地址
,scrawlPath:"" //图片修正地址,同imagePath

//附件上传配置区
,fileUrl:"/ue_fileUp" //附件上传提交地址
,filePath:"" //附件修正地址,同imagePath
//,fileFieldName:"upfile" //附件提交的表单名,若此处修改,需要在后台对应文件修改对应参数

//远程抓取配置区
//,catchRemoteImageEnable:true //是否开启远程图片抓取,默认开启
,catcherUrl:"/ue_getRemoteImage" //处理远程图片抓取的地址
,catcherPath:"" //图片修正地址,同imagePath
//,catchFieldName:"upfile" //提交到后台远程图片uri合集,若此处修改,需要在后台对应文件修改对应参数
//,separater:'ue_separate_ue' //提交至后台的远程图片地址字符串分隔符
//,localDomain:[] //本地*域名,当开启远程图片抓取时,除此之外的所有其它域名下的图片都将被抓取到本地,默认不抓取127.0.0.1和localhost

//图片在线管理配置区
,imageManagerUrl:"/ue_imageManager" //图片在线管理的处理地址
,imageManagerPath:"" //图片修正地址,同imagePath

//屏幕截图配置区
,snapscreenHost: location.hostname //屏幕截图的server端文件所在的网站地址或者ip,请不要加http://
,snapscreenServerUrl: "/ue_imageUp" //屏幕截图的server端保存程序,UEditor的范例代码为“URL +"server/upload/php/snapImgUp.php"”
,snapscreenPath: ""
,snapscreenServerPort: location.port //屏幕截图的server端端口
//,snapscreenImgAlign: '' //截图的图片默认的排版方式

//word转存配置区
,wordImageUrl:"/ue_imageUp" //word转存提交地址
,wordImagePath:"" //
//,wordImageFieldName:"upfile" //word转存表单名若此处修改,需要在后台对应文件修改对应参数

//视频上传配置区
,getMovieUrl:"/ue_getMovie" //视频数据获取地址
,videoUrl:"/ue_fileUp" //附件上传提交地址
,videoPath:"" //附件修正地址,同imagePath
//,videoFieldName:"upfile" //附件提交的表单名,若此处修改,需要在后台对应文件修改对应参数
然后配置web.py的urls映射

urls = (
'/', 'Index',
'/ue_imageUp', Ue_ImageUp,
'/ue_fileUp', Ue_FileUp,
'/ue_scrawlUp', Ue_ScrawlUp,
'/ue_getRemoteImage', Ue_GetRemoteImage,
'/ue_getMovie', Ue_GetMovie,
'/ue_imageManager', Ue_ImageManager,
)
最后实现这些web.py的class。

#coding=utf-8
import base64
import uuid
import urllib2
import os

import web

ueconfig_dir = 'static/upload'
ueconfig_url = '/' + ueconfig_dir


def listImage(rootDir, retlist):
for cfile in os.listdir(rootDir):
path = os.path.join(rootDir, cfile)
if os.path.isdir(path):
listImage(path, retlist)
else:
if cfile.endswith('.gif') or cfile.endswith('.png') or cfile.endswith('.jpg') or cfile.endswith('.bmp'):
retlist.append('/static/upload/' + cfile)


def saveUploadFile(fileName, content):
fileName = fileName.replace('\\', '/') # replaces the windows-style slashes with linux ones.
fout = open(ueconfig_dir + '/' + fileName, 'wb') # creates the file where the uploaded file should be stored
fout.write(content) # writes the uploaded file to the newly created file.
fout.close() # closes the file, upload complete.


class Ue_ImageUp:
def GET(self):
reqData = web.input()
if 'fetch' in reqData:
web.header('Content-Type', 'text/javascript')
return 'updateSavePath(["upload"]);'
web.header("Content-Type", "text/html; charset=utf-8")
return ""

def POST(self):
postData = web.input(upfile={}, pictitle="")
web.debug(postData)
fileObj = postData.upfile
picTitle = postData.pictitle
fileName = fileObj.filename
newFileName = str(uuid.uuid1()) + ".png"
saveUploadFile(newFileName, fileObj.file.read())
return "{'url':'" + ueconfig_url + '/' + newFileName + "','title':'" + picTitle + "','original':'" + fileName + "','state':'" + "SUCCESS" + "'}"


class Ue_FileUp:
def GET(self):
web.header("Content-Type", "text/html; charset=utf-8")
return ""

def POST(self):
postData = web.input(upfile={})
fileObj = postData.upfile
fileName = postData.Filename
ext = '.' + fileName.split('.')[-1]
#web.py的static目录对中文文件名不支持,会404
newFileName = str(uuid.uuid1()) + ext
#fileNameFormat = postData.fileNameFormat
saveUploadFile(newFileName, fileObj.file.read())
return "{'url':'" + ueconfig_url + '/' + newFileName + "','fileType':'" + ext + "','original':'" + fileName + "','state':'" + "SUCCESS" + "'}"


class Ue_ScrawlUp:
def GET(self):
web.header("Content-Type", "text/html; charset=utf-8")
return ""

def POST(self):
reqData = web.input(upfile={})
if 'action' in reqData:
if reqData.action == 'tmpImg':
#上传背景
fileObj = reqData.upfile
fileName = fileObj.filename
saveUploadFile(fileName, fileObj.file.read())
return "<script>parent.ue_callback(" + ueconfig_url + '/' + fileName + "','" + "SUCCESS" + "')</script>"
else:
base64Content = reqData.content
fileName = str(uuid.uuid1()) + '.png'
saveUploadFile(fileName, base64.decodestring(base64Content))
return "{'url':'" + ueconfig_url + '/' + fileName + "',state:'" + "SUCCESS" + "'}"


class Ue_GetRemoteImage:
def GET(self):
web.header("Content-Type", "text/html; charset=utf-8")
return ""

def POST(self):
postData = web.input()
urls = postData.upfile
#urls = urls.replace('&','&')
urllist = urls.split("ue_separate_ue")
fileType = [".gif", ".png", ".jpg", ".jpeg", ".bmp"]
outlist = []
for fileurl in urllist:
if not fileurl.startswith('http'):
continue
ext = "." + fileurl.split('.')[-1]
web.debug(ext + "|" + fileurl)
if ext in fileType:
fileName = str(uuid.uuid1()) + ext
saveUploadFile(fileName, urllib2.urlopen(fileurl).read())
outlist.append(ueconfig_url + "/" + fileName)
outlist = "ue_separate_ue".join(outlist)
return "{'url':'" + outlist + "','tip':'远程图片抓取成功!','srcUrl':'" + urls + "'}"


class Ue_GetMovie:
def POST(self):
reqData = web.input()
skey = reqData.searchKey
vtype = reqData.videoType
surl = 'http://api.tudou.com/v3/gw?method=item.search&appKey=myKey&format=json&kw=' + skey + '&pageNo=1&pageSize=20&channelId=' + vtype + '&inDays=7&media=v&sort=s'
htmlContent = urllib2.urlopen(surl).read()
web.debug(htmlContent)
return htmlContent


class Ue_ImageManager:
def POST(self):
reqData = web.input()
if 'action' in reqData:
if reqData.action == 'get':
retfiles = []
listImage(ueconfig_dir, retfiles)
htmlContent = "ue_separate_ue".join(retfiles)
return htmlContent