最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python的Flask站點中集成xhEditor文本編輯器的教程

 更新時間:2016年06月13日 16:11:34   作者:digwtx  
xhEditor是基于jQuery的Web端文本編輯器,基本的圖片上傳等功能也都帶有,這里我們就來看一下Python的Flask站點中集成xhEditor文本編輯器的教程

xhEditor簡介
xhEditor是一個基于jQuery開發(fā)的簡單迷你并且高效的可視化HTML編輯器,基于網(wǎng)絡(luò)訪問并且兼容IE 6.0+, Firefox 3.0+, Opera 9.6+, Chrome 1.0+, Safari 3.22+。

xhEditor曾經(jīng)是我比較喜歡的編輯器,也是率先支持拖拽上傳的編輯器之一。xhEditor在當(dāng)年是優(yōu)秀的編輯器,功能足夠強大,使用體驗也相當(dāng)好,拖拽上傳是我最喜歡的功能,只可惜已經(jīng)停止開發(fā)了。xhEditor最后的穩(wěn)定版本是1.1.14,至今已超過2年未更新(2013年發(fā)布了開發(fā)版本1.2.1),作者已經(jīng)停止開發(fā)和維護了,社區(qū)論壇完全不能打開。

由于xhEditor基于jQuery開發(fā),而對于新版本的jQuery,它并不能很好的支持,只有1.4版本的jQuery是支持得最好的。

雖然已經(jīng)不再更新了,但在一些需要富文本編輯器的場合,她還是可以完全勝任的。

本文以1.1.14版本為例,講述如何在Flask項目中使用xhEditor編輯器,并實現(xiàn)圖片上傳、文件上傳的后端功能。

xhEditor主要特點:

  • 精簡迷你:初始加載4個文件,包括:1個js(50k)+2個css(10k)+1個圖片(5k),總共65k。若js和css文件進行g(shù)zip壓縮傳輸,可以進一步縮減為24k左右。
  • 使用簡單:簡單的調(diào)用方式,加一個class屬性就能將您的textarea立馬變成一個功能豐富的可視化編輯器。
  • 無障礙訪問:提供WAI-ARIA全面支持,全鍵盤精細(xì)操作,全程語音向?qū)?,提供完美無障礙訪問體驗,讓殘疾人也能夠譜寫精彩人生。
  • 內(nèi)置Ajax上傳:內(nèi)置強大的Ajax上傳,包括HTML4和HTML5上傳支持(多文件上傳、真實上傳進度及文件拖放上傳),剪切板上傳及遠(yuǎn)程抓取上傳,追求完美的用戶上傳體驗。
  • Word自動清理:實現(xiàn)Word代碼自動檢測并清理,提供高效完美的Word代碼過濾方案,生成代碼最優(yōu)化精簡,但是卻不丟失任何細(xì)節(jié)效果。
  • UBB可視化編輯:提供完美的UBB可視化編輯解決方案,在您獲得安全高效代碼存儲的同時,又能享受可視化編輯的便捷。

在Flask項目中使用xhEditor
首先我們需要到xhEditor官網(wǎng)下載1.1.14版本的xhEditor編輯器,下載之后解壓到
Flask項目的static/xheditor目錄。

2016613160455992.jpg (568×150)

2016613160518061.jpg (590×237)

xhEditor提供2種初始化方式:Class初始化和JavaScript初始化。Class初始化只需要給textarea設(shè)置值為xheditor的class屬性,它就會自動變成xhEditor編輯器,一個頁面可以同時同在多個編輯器,而且這個類屬性可以添加參數(shù)。(PS:CKEditor也有這個功能)

對于這兩種初始化方式,官網(wǎng)有提供設(shè)置很方便的設(shè)置向?qū)В沟门渲孟鄬Ρ容^簡單。

示例代碼:

<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>

現(xiàn)在,我們就擁有一個xhEditor編輯器了。

2016613160542615.jpg (653×366)

開啟上傳功能
xhEditor的上傳功能需要設(shè)置幾個參數(shù)(以圖片上傳為例):

  • upImgUrl : 圖片文件上傳接收URL,例:/upload/,可使用內(nèi)置變量{editorRoot}
  • upImgExt : 圖片上傳前限制本地文件擴展名,默認(rèn):jpg,jpeg,gif,png

這里假設(shè)上傳文件接收URL為/upload/,我們的編輯器初始化代碼就變成:

<textarea class="xheditor {tools:'mfull',upImgUrl:'/upload/'}"></textarea>

其他類型的文件上傳設(shè)置類推。

Flask處理上傳請求
xhEditor支持2種上傳方式:標(biāo)準(zhǔn)HTML4上傳和HTML5上傳。

  • HTML4上傳使用標(biāo)準(zhǔn)的表單上傳域,上傳文件域的name為:filedata
  • HTML5上傳的整個POST數(shù)據(jù)流就是上傳的文件完整數(shù)據(jù),而本地文件名等信息儲

存于HTTP_CONTENT_DISPOSITION這個服務(wù)器變量中

返回內(nèi)容必需是標(biāo)準(zhǔn)的json字符串,結(jié)構(gòu)可以是如下:

{"err":"","msg":"200906030521128703.gif"} 或者
{"err":"","msg":{"url":"200906030521128703.jpg","localfile":"test.jpg","id":"1"}}

注:若選擇結(jié)構(gòu)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():
  '''文件上傳函數(shù)

  本函數(shù)未做上傳類型判斷及上傳大小判斷。
  '''
  result = {"err": "", "msg": {"url": "", "localfile": ""}}

  if request.method == 'POST' and 'filedata' in request.files:
    # 傳統(tǒng)上傳模式,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上傳模式,F(xiàn)IREFOX等默認(rèn)使用此模式
    pattern = re.compile(r"""\s.*?\s?filename\s*=\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, 'upload', rnd_name), 'wb') as fp:
      fp.write(img)

    result["msg"]["url"] = '!%s' % \
      url_for('static', filename='%s/%s' % ('upload', rnd_name))

  return json.dumps(result)

遠(yuǎn)程抓圖
一般情況下,當(dāng)復(fù)制站外的圖片時,我們希望可以把圖片保存到本地,遠(yuǎn)程抓圖就可以完成這個事情。

啟用遠(yuǎn)程抓圖功能,需要設(shè)置2個參數(shù):

  • localUrlTest : 非本站域名測試正則表達式
  • remoteImgSaveUrl : 遠(yuǎn)程圖片抓取接收程序URL

設(shè)置這2個參數(shù)之后,我們的編輯器初始化代碼變成:

復(fù)制代碼 代碼如下:

<textarea class="xheditor {tools:'mfull',upImgUrl:'/upload/',localUrlTest:/^https?:\/\/[^\/]*?(localhost:?\d*)\//i,remoteImgSaveUrl:'/uploadremote/'}"></textarea>

這里表示抓取除localhost之外其它域名的圖片。

遠(yuǎn)程抓圖處理示例代碼:

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('/uploadremote/', methods=['POST'])
def uploadremote():
  """
  xheditor保存遠(yuǎn)程圖片簡單實現(xiàn)
  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, 'upload', rnd_name), 'wb') as fp:
          fp.write(downfile.read())
        urlreturn = url_for('static', filename='%s/%s' % ('upload', rnd_name))
        urlout.append(urlreturn)
      else:
        urlout.append(url)
  result = '|'.join(urlout)
  return result

相關(guān)文章

  • 如何在Python?中使用?join()?函數(shù)把列表拼接成一個字符串

    如何在Python?中使用?join()?函數(shù)把列表拼接成一個字符串

    這篇文章主要介紹了如何在Python?中使用?join()?函數(shù)把列表拼接成一個字符串,文章圍繞?join()?函數(shù)的相關(guān)資料展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對你有幫助
    2022-03-03
  • pygame游戲之旅 添加游戲暫停功能

    pygame游戲之旅 添加游戲暫停功能

    這篇文章主要為大家詳細(xì)介紹了pygame游戲之旅的第13篇, 教大家如何添加游戲暫停功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • python selenium實現(xiàn)智聯(lián)招聘數(shù)據(jù)爬取

    python selenium實現(xiàn)智聯(lián)招聘數(shù)據(jù)爬取

    這篇文章主要介紹了python selenium實現(xiàn)智聯(lián)招聘數(shù)據(jù)爬取,需要的朋友可以參考下
    2021-04-04
  • python繪制直方圖的方法

    python繪制直方圖的方法

    這篇文章主要為大家詳細(xì)介紹了python繪制直方圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Python入門教程5. 字典基本操作【定義、運算、常用函數(shù)】

    Python入門教程5. 字典基本操作【定義、運算、常用函數(shù)】

    這篇文章主要介紹了Python字典基本操作,包括字典的基本定義、運算與常用函數(shù)相關(guān)使用技巧,代碼注釋中備有詳盡說明,便于理解,需要的朋友可以參考下
    2018-11-11
  • python3爬取torrent種子鏈接實例

    python3爬取torrent種子鏈接實例

    今天小編就為大家分享一篇python3爬取torrent種子鏈接實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 通過cmd進入python的實例操作

    通過cmd進入python的實例操作

    在本篇內(nèi)容中小編給大家分享了關(guān)于通過cmd怎么進入python的實例操作方法和步驟,有需要的朋友們可以參考下。
    2019-06-06
  • python棧實現(xiàn)進制轉(zhuǎn)換的示例詳解

    python棧實現(xiàn)進制轉(zhuǎn)換的示例詳解

    棧(Stack)是計算機科學(xué)中常用的數(shù)據(jù)結(jié)構(gòu),具有眾多實際應(yīng)用,其中之一是使用棧來實現(xiàn)進制轉(zhuǎn)換,將一個數(shù)字從一種進制表示轉(zhuǎn)換為另一種進制表示,本文將深入研究棧的原理,以及如何使用Python實現(xiàn)十進制到二進制、八進制和十六進制的進制轉(zhuǎn)換,需要的朋友可以參考下
    2023-11-11
  • 使用Python實現(xiàn)監(jiān)控進程是否有病毒

    使用Python實現(xiàn)監(jiān)控進程是否有病毒

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實現(xiàn)監(jiān)控進程是否有病毒,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • python文字轉(zhuǎn)語音的實例代碼分析

    python文字轉(zhuǎn)語音的實例代碼分析

    在本篇文章里小編給大家整理的是關(guān)于python文字轉(zhuǎn)語音的實例代碼分析,有需要的朋友們可以參考下。
    2019-11-11

最新評論

平塘县| 永平县| 革吉县| 东兰县| 师宗县| 朝阳市| 沂水县| 千阳县| 崇阳县| 渭南市| 九龙城区| 宁强县| 思南县| 永兴县| 神池县| 城固县| 巴彦淖尔市| 双柏县| 咸阳市| 红原县| 济阳县| 连城县| 太谷县| 昭通市| 封丘县| 灌云县| 洞口县| 海南省| 霍城县| 巴林右旗| 九寨沟县| 昌都县| 北京市| 沅江市| 望谟县| 中方县| 大石桥市| 定边县| 永登县| 巫山县| 广昌县|