สวัสดีครับ ผมสงสัยว่าเวลาเราติดตั้ง Django หรือ Turbogears บนเครื่องที่เราพัฒนา เสร็จแล้วเวลานำไปติดตั้งบน server จริงนั้น ต้องติดตั้งอะไรอีกมั้ยครับ
คือผมสังเกตว่าถ้าเราพัฒนาจาก framework ที่เขียนด้วย PHP เวลาทำเสร็จ ก็อัพโหลดขึ้นไปวางตรงๆ ได้เลย แต่ Django หรือ Turbogears เวลาติดตั้ง ผมจะรันไฟล์ setup แล้วมันก็จะทำอะไรสักอย่างเบื้องหลังซึ่งมองไม่เห็น
เลยเป็นกังวลและสงสัยว่าโฮสต์ที่เราใช้นั้น มีเพียงแค่ Python ติดตั้งอยู่ เพียงพอหรือไม่ที่จะรันโปรเจ็กที่พัฒนาจาก Django หรือ Turbogears
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
PHP ก็ยุ่งเหมือนกันนะ เวลาที่มันต้องการ extension ที่ไม่มีอยู่แล้ว Django Turbogears ก็คล้ายๆ กัน ถ้าเราใช้โมดูลภายนอกที่ไม่ได้ลงอยู่แล้วก็ต้องลงเพิ่มเอง จะยุ่งก็ตรงนี้แหละ
นั่นหมายความว่ามีปัญหาแค่ module ภายนอกที่อาจถูกเรียกใช้ คล้ายๆ กับ extension ใน PHP ใช่ไหมครับ
โดยที่ตัว Turbogears เองก็ไม่ได้มีโปรแกรม หรือ application อะไรจำเพาะเจาะจง?
ถ้าตั้งใจให้รัน Python ก็น่าจะมี Python MySQL อยู่แล้ว และจะดียิ่งขึ้นถ้ามี Turbogears กับ Django ในตัว
"และจะดียิ่งขึ้นถ้ามี Turbogears กับ Django ในตัว"
ปัญหาคือตอนนี้มองภาพไม่ออก ผมสามารถสร้างโปรเจ็กด้วย TG บน laptop ที่รัน Ubuntu ถ้าโฮสต์ที่ผมต้องการเช่ามี Python ติดตั้งไว้เพียงอย่างเดียว
จะยุ่งยากแค่ไหนในการนำ TG ขึ้นไปใช้ครับ
ลง TG และสิ่งที่มันต้องการทั้งหมด เอาโค้ดของเราขึ้นไป แล้วก็เซ็ต mod_python
ขอบคุณครับคุณ sugree
อยากจะลองเรื่องพวกนี้นะ (แต่ต่อคิว Rails อยู่ :-P)
สำหรับติดตั้ง django ที่จะใช้เป็น serverจริง
ถ้าเป็น Apache
โดยส่วนมาก จะใช้กับ โมดูล ชื่อ ModPython (www.modpython.org)
คือ
- ติดตั้ง Apache
- ติดตั้ง Modpython
- Config Apache * สำคัญมาก เพราะต้องทำการ Add Handler ด้วย
และถ้ามี file หรือ รูปภาพที่ต้องการจะเสิร์ฟ ก็ ต้อง Off Handler เฉพาะในส่วนของ Url นั้น directory นั้น
ถ้าต้องการข้อมูลเพิ่มเติมก้อ เมลล์มานะคะ
ผมทดลองติดตั้ง และเรียก
http://localhost/mysite/admin/
พบข้อความ error หลายบรรทัด ดูไม่ออกครับ
Mod_python error: "PythonHandler django.core.handlers.modpython" Traceback (most recent call last): File "/usr/lib/python2.4/site-packages/mod_python/apache.py", line 299, in HandlerDispatch result = object(req) File "/usr/lib/python2.4/site-packages/django/core/handlers/modpython.py", line 181, in handler return ModPythonHandler()(req) File "/usr/lib/python2.4/site-packages/django/core/handlers/modpython.py", line 149, in __call__ self.load_middleware() File "/usr/lib/python2.4/site-packages/django/core/handlers/base.py", line 22, in load_middleware for middleware_path in settings.MIDDLEWARE_CLASSES: File "/usr/lib/python2.4/site-packages/django/conf/__init__.py", line 28, in __getattr__ self._import_settings() File "/usr/lib/python2.4/site-packages/django/conf/__init__.py", line 57, in _import_settings self._target = Settings(settings_module) File "/usr/lib/python2.4/site-packages/django/conf/__init__.py", line 85, in __init__ raise EnvironmentError, "Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e) EnvironmentError: Could not import settings 'mysite.settings' (Is it on sys.path? Does it have syntax errors?): No module named mysite.settingsเข้าใจว่าติดตั้ง หรือ กำหนดอะไรผิดแน่ๆ
ผมติดตั้ง apache2 libapache2-mod-python django บน debian ครับ
แก้ไขไฟล์ที่เดียว คือ /etc/apache2/httpd.conf
<Location "/mysite/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE mysite.settings PythonDebug On </Location>แนะนำการกำหนดใช้งาน modpython ที่ถูกต้องให้ด้วยครับ
ขอบคุณครับ
ลองแบบนี้
<Location "/mysite/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE mysite.settings PythonDebug On PythonPath "['/path/to/project'] + sys.path" </Location>เช่น
<Location "/mysite/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE mysite.settings PythonDebug On PythonPath "['/usr/local/django-apps/', '/var/www'] + sys.path" </Location>ผมสร้าง django project ชื่อ mysite ไว้ที่
โดยมีไฟล์ /home/user/urls.py เป็นแบบนี้ครับ
from django.conf.urls.defaults import * urlpatterns = patterns('', # Example: #(r'^mysite/', include('mysite.foo.urls')), # Uncomment this for admin: (r'^admin/', include('django.contrib.admin.urls')), )ผมจึงแก้ไขไฟล์ /etc/apache2/httpd.conf ดังนี้
<Location "/mysite/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE mysite.settings PythonDebug On PythonPath "['','/home/user/mysite/'] + sys.path" </Location>แล้ว สั่ง /etc/init.d/apache2 restart เพื่อ run apache2 ใหม่
และเรียก http://localhost/mysite/ จะมีerror เหมือนเดิม
แต่ถ้าเรียก http://localhost/admin/ จะมี error แบบนี้ครับ
แปลกครับ และ ไม่เข้าใจว่ามีอะไรผิด
แล้วก็ไม่รู้ว่าจะตรวจสอบได้อย่างไร
แนะนำเพิ่มเติมให้ด้วยนะครับ
ทั้งนี้หากสั่งด้วยคำสั่ง
จะสามารถเข้าไปใช้งานได้ที่
ได้แบบสบายๆ ครับ
น่าจะเป็นแบบนี้
<Location "/mysite/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE mysite.settings PythonDebug On PythonPath "['/home/user'] + sys.path" </Location>ให้ใส่ เข้าไปตั้งแต่ parent directory ด้วยน่ะคะ
PythonPath "['','/home/user/mysite/'] + sys.path"
ให้ใส่ '/home/user/','/home/user/mysite/' ถ้ายังอีก ก้อใส่ '/home' ไปด้วยค่ะ
เท่าที่ลองมา ถ้าจะใช้งานจริงๆ จังๆ ควรจะ run django แบบ fastcgi จะดีกว่า อย่าลืมว่า mod_python นั้นใช้ memory ผืนเดียวกับ apache และ user ทุกๆ คนที่ใช้ mod_python ก็จะใช้ memory ผืนเดียวกันนี้ด้วย ดังนั้นการ control อะไรต่างๆ มันจะใช้ร่วมกันไปหมด จะดีก็ต่อเมือคุณเป็น admin ของ server นั้นๆ ที่สามารถปรับแต่ง apache หรือ start/stop apache ได้ด้วยตนเอง ในขณะที่ถ้าใช้ apache หรือ lighttpd คุยกับ django ที่ทำงานแบบ fastcgi โดย run ด้วย user จะทำให้ user แต่ละคนสามารถ start/stop django เองได้ เริ่องที่ต้องกังวลนิดหน่อยคือแต่ละคนจะต้องไม่แย่ง port กัน หรืออาจจะใช้ fastcgi ที่คุยกับ web server ผ่าน unix socket น่าจะปลอดภัยกว่า
ลอง wsgi มั้ยคะ