>백엔드 개발 >파이썬 튜토리얼 >xhEditor 텍스트 편집기를 Python의 Flask 사이트에 통합

xhEditor 텍스트 편집기를 Python의 Flask 사이트에 통합

高洛峰
高洛峰원래의
2017-03-03 13:37:061412검색

xhEditor 소개

xhEditor는 jQuery를 기반으로 개발된 간단하고 컴팩트하며 효율적인 시각적 HTML 편집기이며 IE 6.0 이상과 호환됩니다. , 파이어폭스 3.0+, 오페라 9.6+, 크롬 1.0+, 사파리 3.22+.

xhEditor는 제가 가장 좋아하는 편집기였으며 드래그 앤 드롭 업로드를 지원하는 최초의 편집기 중 하나이기도 했습니다. xhEditor는 그 당시에는 훌륭한 편집기였으며, 끌어서 놓기 기능이 제가 가장 좋아하는 기능이었습니다. 안타깝게도 개발이 중단되었습니다. xhEditor의 마지막 안정 버전은 1.1.14이며, 2년 넘게 업데이트되지 않았습니다(개발 버전 1.2.1은 2013년에 출시되었습니다). 작성자가 개발 및 유지 관리를 중단했으며 커뮤니티 포럼을 열 수 없습니다. 모두.

xhEditor는 jQuery를 기반으로 개발되었기 때문에 새로운 버전의 jQuery를 잘 지원하지 않습니다. jQuery 버전 1.4만이 가장 잘 지원됩니다.

더 이상 업데이트되지 않지만 서식 있는 텍스트 편집기가 필요한 일부 상황에서는 여전히 완벽한 기능을 제공합니다.

이 글에서는 1.1.14 버전을 예로 들어 Flask 프로젝트에서 xhEditor 편집기를 사용하는 방법과 이미지 업로드, 파일 업로드의 백엔드 기능을 구현하는 방법을 설명합니다.

xhEditor 주요 기능:

  • 간소화된 Mini: 4개 파일의 초기 로드(다음 포함): 1 js(50k) + 2 css (10k) + 이미지 1개(5k), 총 65k. js, css 파일을 gzip으로 압축하여 전송하면 24k 정도까지 더 줄일 수 있습니다.

  • 사용하기 쉬움: 간단한 호출 방법과 클래스 속성 추가만으로 텍스트 영역을 기능이 풍부한 시각적 편집기로 즉시 전환할 수 있습니다.

  • 접근성: WAI-ARIA에 대한 포괄적인 지원, 정밀한 조작을 위한 풀 키보드 및 풀 음성 안내를 제공하여 완벽한 장벽 없는 액세스 경험을 제공하여 장애인이 멋진 글을 쓸 수 있도록 합니다. 삶.

  • 내장 Ajax 업로드: HTML4 및 HTML5 업로드 지원(다중 파일 업로드, 실제 업로드 진행 및 파일 드래그 앤 드롭 업로드), 클립보드를 포함한 강력한 Ajax 업로드 내장 업로드 및 원격 캡처 업로드를 받고 완벽한 사용자 업로드 경험을 추구하세요.

  • Word 자동 정리: Word 코드를 자동으로 감지 및 정리하고 효율적이고 완벽한 Word 코드 필터링 솔루션을 제공하며 세부 정보 손실 없이 최적화되고 간소화된 코드를 생성합니다.

  • UBB 비주얼 편집: 완벽한 UBB 비주얼 편집 솔루션을 제공하여 시각적 편집의 편리함을 즐기면서 안전하고 효율적인 코드 저장을 얻을 수 있습니다.

Flask 프로젝트에서 xhEditor 사용
먼저 xhEditor 공식 웹사이트에서 xhEditor 편집기 버전 1.1.14를 다운로드한 후 압축을 풀어야 합니다.
Flask 프로젝트의 static/xheditor 디렉터리입니다.

xhEditor 텍스트 편집기를 Python의 Flask 사이트에 통합

xhEditor 텍스트 편집기를 Python의 Flask 사이트에 통합

xhEditor는 클래스 초기화와 JavaScript 초기화라는 두 가지 초기화 방법을 제공합니다. 클래스 초기화는 xheditor의 클래스 속성을 텍스트 영역으로 설정하기만 하면 자동으로 xhEditor 편집기가 됩니다. 페이지는 동시에 여러 편집기에 있을 수 있으며 이 클래스 속성에 매개변수를 추가할 수 있습니다. (PS: CKEditor에도 이 기능이 있습니다.)

이 두 가지 초기화 방법에 대해 공식 웹사이트에서는 매우 편리한 설정 마법사를 제공하므로 구성이 비교적 간단합니다.

샘플 코드:

<head>
<script type="text/javascript" charset="utf-8" src="{{ url_for(&#39;static&#39;, filename=&#39;xheditor/jquery/jquery-1.4.4.min.js&#39;) }}"></script>
<script type="text/javascript" charset="utf-8" src="{{ url_for(&#39;static&#39;, filename=&#39;xheditor/xheditor-1.1.14-zh-cn.min.js&#39;) }}"></script>
<style>.xheditor {width: 640px; height:320px;}</style>
</head>

<body>
<textarea id="content" name="content" class="xheditor {tools:&#39;mfull&#39;}"></textarea>
</body>

이제 xhEditor 편집기가 생겼습니다.

upImgUrl: 이미지 파일 업로드 수신 URL(예: /upload/), 내장 변수 {editorRoot}xhEditor 텍스트 편집기를 Python의 Flask 사이트에 통합

upImgExt를 사용할 수 있습니다. : 이미지 업로드 전 로컬 파일 제한 확장자, 기본값: jpg, jpeg, gif, png

    업로드된 파일 수신 URL이 /upload/라고 가정하면 편집기 초기화 코드는 다음과 같습니다.
  • <textarea class="xheditor {tools:&#39;mfull&#39;,upImgUrl:&#39;/upload/&#39;}"></textarea>
  • 다른 유형의 파일 업로드 설정 등.

Flask가 업로드 요청을 처리합니다

xhEditor는 표준 HTML4 업로드와 HTML5 업로드라는 두 가지 업로드 방법을 지원합니다.

HTML4 업로드는 표준 양식 업로드 필드를 사용합니다. 업로드 파일 필드 이름은 filedata

HTML5의 전체 POST 데이터 흐름입니다. upload는 upload입니다. 파일의 전체 데이터와 로컬 파일 이름 및 기타 정보는 서버 변수 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(&#39;%Y%m%d%H%M%S&#39;)
  return &#39;%s%s&#39; % (filename_prefix, str(random.randrange(1000, 10000)))

@app.route(&#39;/upload/&#39;, methods=[&#39;GET&#39;, &#39;POST&#39;])
def upload():
  &#39;&#39;&#39;文件上传函数

  本函数未做上传类型判断及上传大小判断。
  &#39;&#39;&#39;
  result = {"err": "", "msg": {"url": "", "localfile": ""}}

  if request.method == &#39;POST&#39; and &#39;filedata&#39; in request.files:
    # 传统上传模式,IE浏览器使用这种模式
    fileobj = request.files[&#39;filedata&#39;]
    fname, fext = os.path.splitext(fileobj.filename)
    rnd_name = &#39;%s%s&#39; % (gen_rnd_filename(), fext)
    fileobj.save(os.path.join(app.static_folder, &#39;upload&#39;, rnd_name))
    result["msg"]["localfile"] = fileobj.filename
    result["msg"]["url"] = &#39;!%s&#39; % \
      url_for(&#39;static&#39;, filename=&#39;%s/%s&#39; % (&#39;upload&#39;, rnd_name))

  elif &#39;CONTENT_DISPOSITION&#39; in request.headers:
    # HTML5上传模式,FIREFOX等默认使用此模式
    pattern = re.compile(r"""\s.*?\s?filename\s*=\s*[&#39;|"]?([^\s&#39;"]+).*?""", re.I)
    _d = request.headers.get(&#39;CONTENT_DISPOSITION&#39;).encode(&#39;utf-8&#39;)
    if urllib.quote(_d).count(&#39;%25&#39;) > 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 = &#39;%s%s&#39; % (gen_rnd_filename(), fext)
    with open(os.path.join(app.static_folder, &#39;upload&#39;, rnd_name), &#39;wb&#39;) as fp:
      fp.write(img)

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

  return json.dumps(result)

远程抓图
一般情况下,当复制站外的图片时,我们希望可以把图片保存到本地,远程抓图就可以完成这个事情。

启用远程抓图功能,需要设置2个参数:

  • localUrlTest : 非本站域名测试正则表达式

  • remoteImgSaveUrl : 远程图片抓取接收程序URL

设置这2个参数之后,我们的编辑器初始化代码变成:


复制代码 代码如下:




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

远程抓图处理示例代码:

def gen_rnd_filename():
  filename_prefix = datetime.datetime.now().strftime(&#39;%Y%m%d%H%M%S&#39;)
  return &#39;%s%s&#39; % (filename_prefix, str(random.randrange(1000, 10000)))

@app.route(&#39;/uploadremote/&#39;, methods=[&#39;POST&#39;])
def uploadremote():
  """
  xheditor保存远程图片简单实现
  URL用"|"分隔,返回的字符串也是用"|"分隔
  返回格式是字符串,不是JSON格式
  """
  localdomain_re = re.compile(r&#39;https?:\/\/[^\/]*?(localhost:?\d*)\/&#39;, re.I)
  imageTypes = {&#39;gif&#39;: &#39;.gif&#39;, &#39;jpeg&#39;: &#39;.jpg&#39;, &#39;jpg&#39;: &#39;.jpg&#39;, &#39;png&#39;: &#39;.png&#39;}
  urlout = []
  result = &#39;&#39;
  srcUrl = request.form.get(&#39;urls&#39;)
  if srcUrl:
    urls = srcUrl.split(&#39;|&#39;)
    for url in urls:
      if not localdomain_re.search(url.strip()):
        downfile = urllib.urlopen(url)
        fext = imageTypes[downfile.headers.getsubtype().lower()]
        rnd_name = &#39;%s%s&#39; % (gen_rnd_filename(), fext)
        with open(os.path.join(app.static_folder, &#39;upload&#39;, rnd_name), &#39;wb&#39;) as fp:
          fp.write(downfile.read())
        urlreturn = url_for(&#39;static&#39;, filename=&#39;%s/%s&#39; % (&#39;upload&#39;, rnd_name))
        urlout.append(urlreturn)
      else:
        urlout.append(url)
  result = &#39;|&#39;.join(urlout)
  return result


更多xhEditor 텍스트 편집기를 Python의 Flask 사이트에 통합相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.