uWSGI เจชเจ•เจตเจพเจจเจพเจ‚: เจฒเจฟเจฌเจฐเฉ‡เจ†เจซเจฟเจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃเจพ

เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจนเฉˆ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจชเจฐเจฟเจตเจฐเจคเจจ เจคเจฟเจ†เจฐ เจ•เจฐเจจ เจฒเจˆ เจฒเจฟเจฌเจฐ, uwsgi-เจชเจพเจˆเจฅเจจ, เจชเจพเจˆเจฒเฉ‹เจ•เจฟเจŸ ะธ webob. เจคเฉเจธเฉ€เจ‚ เจตเฉ€ เจตเจฐเจค เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจคเจฟเจ†เจฐ-เจ•เฉ€เจคเฉ€. เจชเจฐ เจ‡เจน เจธเจฟเจฐเจซ 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) # ะธ ะฒะพะทะฒั€ะฐั‰ะฐะตะผ ะตะณะพ

เจคเฉเจธเฉ€เจ‚, เจฌเฉ‡เจธเจผเจ•, เจ—เจฒเจคเฉ€ เจธเฉฐเจญเจพเจฒเจฃ เจจเฉ‚เฉฐ เจตเฉ€ เจธเจผเจพเจฎเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจ‡เฉฑเจ• เจŸเฉˆเจธเจŸ เจธเจฟเฉฐเจ—เจฒ-เจชเฉ‡เจœ เจ“เจกเฉ€เจŸเฉ€ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจชเฉ€เจกเฉ€เจเจซ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃเจพ เจคเฉเจฒเจจเจพ เจตเจฟเฉฑเจš เจฒเจ—เจญเจ— 1,5 เจ—เฉเจฃเจพ เจคเฉ‡เจœเจผ เจนเฉˆ unoconv-api.

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹