uWSGI เชฐเซ‡เชธเชฟเชชเซ€เช: เชฒเซ€เชฌเชฐเช“เชซเซ€เชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹เชจเซเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐ

เชฆเชธเซเชคเชพเชตเซ‡เชœ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฃ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชจเซ‡ เชœเชฐเซ‚เชฐ เช›เซ‡ LibreOffice, uwsgi-เช…เชœเช—เชฐ, เชชเชพเชฏเชฒเซ‹เช•เชฟเชŸ ะธ เชตเซ‡เชฌเชฌ. เชคเชฎเซ‡ เชชเชฃ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชคเซˆเชฏเชพเชฐ. เชชเชฐเช‚เชคเซ เช† เชซเช•เซเชค uWSGI เชธเชฐเซเชตเชฐ เชฒเซ‹เช‚เชš เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช›เซ‡, เช…เชจเซ‡ เช…เชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚ uWSGI เชธเชฐเซเชตเชฐ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชตเชพ เชฎเชพเชŸเซ‡ nginx.

เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ เชธเซŒเชฅเซ€ เชธเชฐเชณ uWSGI เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชฌเซ‡ เชฆเชฒเซ€เชฒเซ‹ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เช…เชจเซ‡ 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) # ะธ ะฒะพะทะฒั€ะฐั‰ะฐะตะผ ะตะณะพ

เชคเชฎเซ‡, เช…เชฒเชฌเชคเซเชค, เชเชฐเชฐ เชนเซ‡เชจเซเชกเชฒเชฟเช‚เช— เชชเชฃ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชŸเซ‡เชธเซเชŸ เชธเชฟเช‚เช—เชฒ-เชชเซ‡เชœ เช“เชกเซ€เชŸเซ€ เชซเชพเช‡เชฒเชจเซ‡ เชชเซ€เชกเซ€เชเชซเชฎเชพเช‚ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเชตเซเช‚ เชคเซ‡เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€เชฎเชพเช‚ เชฒเช—เชญเช— 1,5 เช—เชฃเซเช‚ เชเชกเชชเซ€ เช›เซ‡ unoconv-api.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹