Run Python app บน Apache2 ด้วย Flask
บทความนี้เขียนเพื่อเป็นข้อมูลอ้างอิงให้ตัวเองเวลาต้องกลับมาแก้ไขหรือติดตั้ง Python บน Ubuntu server ที่ผ่านมาก็ใช้วิธี google หาว่าต้องทำอะไร อย่างไร แล้วทดลองทำตามนั้น พอใช้ได้แล้วก็ลืมว่าทำอะไรอย่างไร เพราะไม่ใช่เรื่องที่จะมา set up แบบนี้บ่อย ๆ แต่บางครั้ง ก็มีเหตุให้มีการ update ระบบทำให้ Python app ที่ทำไว้ใช้ไม่ได้ ต้องกลับมาเริ่มต้นติดตั้งใหม่อีก
เลือก Flask เพราะเขาว่าง่ายสุด
ปัจจุบันเห็นมีตัวเลือกการทำ web app ด้วย Python หลายตัว แต่ตัวที่คนพูดถึงและใช้มากคือ Django กับ Flask. Django ดูจะใช้ได้มากกว่าแต่ก็ต้องเรียนรู้มากกว่า ที่ต้องการคือทดลองเอา Python library ที่ทำไว้ขึ้นเว็บให้คนทั่วไปที่ไม่ใช่นักโปรแกรมใช้ได้ เลยเลือก Flask เพราะต้องการนำ app ขึ้นใช้งานบนเว็บให้ได้แบบเร่งด่วน
เตรียมระบบให้พร้อม
ขั้นแรกเราต้องมี Ubuntu server ที่มี root access ไปแก้ไขระบบได้ และต้องติดตั้งโปรแกรมเหล่านี้ก่อน (ถ้ายังไม่มี)
$sudo apt-get install python3
$sudo apt-get install apache2
$sudo apt-get install lib-apache2-mod-wsgi-py3
mod_wsgi เป็นตัวที่ Flask แนะนำให้ใช้บน Apache web server. mod_wsgi เป็น module ของ Apache web server ที่เป็น interface ให้กับ Python web app โดยเราจะสร้างไฟล์ .wsgi เพื่อเป็นไฟล์ที่ start app ที่ทำ
ในการทดลองนี้ ต้องการสร้าง tltkweb ที่รับข้อมูลภาษาไทยและ run function ที่เขียนไว้ใน tltk package จึงต้องใช้ WTForms เพื่อให้รับและส่งข้อมูลผ่าน web form ได้. ทั้ง tltk และ wtforms สามารถ install ด้วยการใช้ pip3 install ได้. ไฟล์โครงการจะเก็บใน folder /home/USER/flask ภายในมีไฟล์ tltkweb.py, tltkweb.wsgi, และ config.py และมี subfolder app สำหรับใส่โปรแกรม code และ template ที่ใช้แสดงหน้าเว็บ ส่วนไฟล์ tltkweb.wsgi เป็นไฟล์เริ่มต้นงาน
สร้างไฟล์ tltkweb.wsgi
import sys
sys.path.insert(0,’home/USER/flask/’)
from tltkweb import app as application
สร้างไฟล์ tltkweb.py
from app import app
กำหนดให้นำข้อมูล subfolder app มาใช้ในชื่อ app
สร้างไฟล์ config.py
import os
class Config(object):
SECRET_KEY = os.environ.get(‘SECRET_KEY’) or ‘you-will-never-guess’
ไฟล์ config นี้สร้าง class Config ซึ่งไปใข้ใน _init_.py และ secret key ที่ใช้ตอนสร้าง session
Subfolder app
ภายใน subfolder app (flask/app/) ให้สร้างไฟล์ routes.py กับ forms.py และ subfolder templates (flask/app/templates/) สำหรับเก็บ web templates ใน folder app นี้ให้สร้างไฟล์ _init_.py
ไฟล์ _init_.py
ไฟล์ routes.py
ในไฟล์ routes.py สร้างแต่ละ function ผ่านการใช้ ‘@app.route(‘/th2ipa’,…) และใช้ไฟล์ forms.py ในชื่อ InputForm แล้วกำหนด function th2ipa ซึ่งรับข้อมูลผ่าน InputForm ข้อมูลเข้ามาจาก form.inputtxt.data เมื่อเรียก th2ipa ได้ output ส่งไปที่ template “out.html” ถ้ายังไม่มีข้อมูลพิมพ์มาก็ใช้ template “th2ipa.html”
หากต้องการสร้าง function อื่นๆ ต่อ ก็เขียน ‘@app.rout(‘/function2’, method=[‘GET’,’POST’]) แล้วตามด้วย def function2(): ….
ไฟล์ forms.py
ในไฟล์ forms.py กำหนด InputForm เป็น flaskform เพื่อรับ input text string มาไว้ที่ inputtxt และ submit เพื่อส่งค่าที่ได้
ไฟล์ out.html
เก็บไว้ใน folder flask/tltkweb/app/templates และนำคำสั่งสร้าง template ของ Flask-WTF มาเพื่อเขียน html ไฟล์สำหรับเป็น output
ในไฟล์มีอ้างถึง base.html ซึ่งก็เป็นการนำคำสั่งมาเขียนเพื่อสร้าง html output ซึ่งจะเห็นมีการเขียน tag <html> <head> <body> รวมถึง Javascript สำหรับ copy ผลลง clipboard ในไฟล์อ้างถึง block content ในไฟล์ out.html
Configure Apache
ใน /etc/apache2/site-available ให้สร้างไฟล์ tltkweb.conf
<VirtualHost *:80>
ServerName example.comDocumentRoot /var/www/html
WSGIDaemonProcess tltkweb user=USER group=group1 threads=5
WSGIScriptAlias / /home/USER/flask/tltkweb.wsgi <Directory /home/USER/flask/>
WSGIProcessGroup tltkweb
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
จากนั้นจึงใช้คำสั่งเพื่อ enable configuration นี้
$sudo a2ensite tltkweb.conf
$sudo service apache2 restart
Run program
ภาพทดลองโปรแกรมออกมาตามนี้หลังเรียกโปรแกรมผ่านเว็บ http://161.200.50.2/th2ipa (161.200.50.2 เป็น web address ที่ลองติดตั้งโปรแกรม)