uWSGI แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜: แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒœแƒ•แƒ”แƒ แƒขแƒแƒชแƒ˜แƒ LibreOffice-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒ™แƒแƒœแƒ•แƒ”แƒ แƒขแƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒกแƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒšแƒแƒ“ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ LibreOffice, uwsgi-python, แƒžแƒ˜แƒšแƒแƒ™แƒ˜แƒขแƒ˜ ะธ แƒ•แƒ”แƒ‘แƒแƒ‘. แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ›แƒ–แƒ. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ uWSGI แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“ แƒ“แƒ uWSGI แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ—แƒแƒœ แƒ“แƒแƒกแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒšแƒแƒ“ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— nginx.

แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒกแƒ˜ uWSGI แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒžแƒ˜แƒ—แƒแƒœแƒจแƒ˜ แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒฃแƒ แƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒกแƒ’แƒแƒœ แƒแƒ แƒ˜ แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ˜แƒ— environ แƒ“แƒ start_response.

import os       # ะธะผะฟะพั€ั‚ะธั€ัƒะตะผ
import pylokit  # ะฝะตะพะฑั…ะพะดะธะผั‹ะต
import tempfile # ะฝะฐะผ
import webob    # ะผะพะดัƒะปะธ

office = pylokit.Office('/usr/lib/libreoffice/program') # ะทะฐะณั€ัƒะถะฐะตะผ ะฑะธะฑะปะธะพั‚ะตะบัƒ LibreOffice ะฟะพ ัƒะบะฐะทะฐะฝะฝะพะผัƒ ะฟัƒั‚ะธ

def application(environ, start_response): # ั„ัƒะฝะบั†ะธั ะดะปั uWSGI
    request = webob.Request(environ) # ะฟะพะปัƒั‡ะฐะตะผ ะทะฐะฟั€ะพั ะธะท ะพะบั€ัƒะถะตะฝะธั
    file = request.POST['file'] # ั„ะฐะนะป ะดะปั ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธั ะฟะตั€ะตะดะฐั‘ั‚ัั ั‡ะตั€ะตะท multipart/form-data ั ะธะผะตะฝะตะผ file
    filename, extension = os.path.splitext(file.filename) # ะฟะพะปัƒั‡ะฐะตะผ ะธะผั ะธ ั€ะฐััˆะธั€ะตะฝะธะต
    with tempfile.NamedTemporaryFile(suffix=extension) as inp, tempfile.NamedTemporaryFile(suffix='.%s' % request.path.split('/')[-1]) as out: # ัะพะทะดะฐั‘ะผ ะพะดะธะฝ ะฒั€ะตะผะตะฝะฝั‹ะน ั„ะฐะนะป ั ั€ะฐััˆะธั€ะตะฝะธะตะผ ะฟะตั€ะตะดะฐะฝะฝะพะณะพ ั„ะฐะนะปะฐ ะธ ะดั€ัƒะณะพะน ะฒั€ะตะผะตะฝะฝั‹ะน ั„ะฐะนะป ั ั€ะฐััˆะธั€ะตะฝะธะตะผ ะธะท ะพะบะพะฝั‡ะฐะฝะธั ะทะฐะฟั€ะพัะฐ (ะดะปั ัะพะฒะผะตัั‚ะธะผะพัั‚ะธ ั unoconv-api)
        inp.write(file.file.read()) # ะทะฐะฟะธัั‹ะฒะฐะตะผ ัะพะดะตั€ะถะธะผะพะต ะฟะตั€ะตะดะฐะฝะฝะพะณะพ ั„ะฐะนะปะฐ ะฒ ะฟะตั€ะฒั‹ะน ะฒั€ะตะผะตะฝะฝั‹ะน ั„ะฐะนะป
        inp.flush() # (ั‚.ะบ. LibreOfficeKit ะฟะพั‡ะตะผัƒ-ั‚ะพ ั€ะฐะฑะพั‚ะฐะตั‚ ั‚ะพะปัŒะบะพ ั ั„ะฐะนะปะฐะผะธ)
        with office.documentLoad(inp.name) as doc: # ะทะฐะณั€ัƒะถะฐะตะผ ะฟะตั€ะตะดะฐะฝะฝั‹ะน ั„ะฐะนะป 
            doc.saveAs(out.name) # ัะบัะฟะพั€ั‚ะธั€ัƒะตะผ ะทะฐะณั€ัƒะถะตะฝะฝั‹ะน ั„ะฐะนะป ะฒ ะดั€ัƒะณะพะน ะฒั€ะตะผะตะฝะฝั‹ะน ั„ะฐะนะป (ั„ะพั€ะผะฐั‚ ะฑะตั€ั‘ั‚ัั ะธะท ั€ะฐััˆะธั€ะตะฝะธั)
            with open(out.name, 'rb') as out2: # ะพั‚ะบั€ั‹ะฒะฐะตะผ ะดั€ัƒะณะพะน ะฒั€ะตะผะตะฝะฝั‹ะน ั„ะฐะนะป
                response = webob.Response(body=out2.read()) # ัะพะทะดะฐั‘ะผ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะธะท ั‡ั‚ะตะฝะธั ะดั€ัƒะณะพะณะพ ะฒั€ะตะผะตะฝะฝะพะณะพ ั„ะฐะนะปะฐ
                return response(environ, start_response) # ะธ ะฒะพะทะฒั€ะฐั‰ะฐะตะผ ะตะณะพ

แƒ—แƒฅแƒ•แƒ”แƒœ, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ.

แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒ”แƒ แƒ—แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜แƒแƒœแƒ˜ odt แƒคแƒแƒ˜แƒšแƒ˜แƒก pdf-แƒ–แƒ” แƒ’แƒแƒ“แƒแƒงแƒ•แƒแƒœแƒ แƒ“แƒแƒแƒฎแƒšแƒแƒ”แƒ‘แƒ˜แƒ— 1,5-แƒฏแƒ”แƒ  แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒ˜แƒ, แƒ•แƒ˜แƒ“แƒ แƒ” unoconv-api.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ