การติดตั้ง Django และ Turbogears

สวัสดีครับ ผมสงสัยว่าเวลาเราติดตั้ง Django หรือ Turbogears บนเครื่องที่เราพัฒนา เสร็จแล้วเวลานำไปติดตั้งบน server จริงนั้น ต้องติดตั้งอะไรอีกมั้ยครับ

คือผมสังเกตว่าถ้าเราพัฒนาจาก framework ที่เขียนด้วย PHP เวลาทำเสร็จ ก็อัพโหลดขึ้นไปวางตรงๆ ได้เลย แต่ Django หรือ Turbogears เวลาติดตั้ง ผมจะรันไฟล์ setup แล้วมันก็จะทำอะไรสักอย่างเบื้องหลังซึ่งมองไม่เห็น

เลยเป็นกังวลและสงสัยว่าโฮสต์ที่เราใช้นั้น มีเพียงแค่ Python ติดตั้งอยู่ เพียงพอหรือไม่ที่จะรันโปรเจ็กที่พัฒนาจาก Django หรือ Turbogears

sugree's picture

PHP ก็ยุ่งเหมือนกันนะ เวลาที่มันต้องการ extension ที่ไม่มีอยู่แล้ว Django Turbogears ก็คล้ายๆ กัน ถ้าเราใช้โมดูลภายนอกที่ไม่ได้ลงอยู่แล้วก็ต้องลงเพิ่มเอง จะยุ่งก็ตรงนี้แหละ

นั่นหมายความว่ามีปัญหาแค่ module ภายนอกที่อาจถูกเรียกใช้ คล้ายๆ กับ extension ใน PHP ใช่ไหมครับ

โดยที่ตัว Turbogears เองก็ไม่ได้มีโปรแกรม หรือ application อะไรจำเพาะเจาะจง?

sugree's picture

ถ้าตั้งใจให้รัน Python ก็น่าจะมี Python MySQL อยู่แล้ว และจะดียิ่งขึ้นถ้ามี Turbogears กับ Django ในตัว

"และจะดียิ่งขึ้นถ้ามี Turbogears กับ Django ในตัว"

ปัญหาคือตอนนี้มองภาพไม่ออก ผมสามารถสร้างโปรเจ็กด้วย TG บน laptop ที่รัน Ubuntu ถ้าโฮสต์ที่ผมต้องการเช่ามี Python ติดตั้งไว้เพียงอย่างเดียว

จะยุ่งยากแค่ไหนในการนำ TG ขึ้นไปใช้ครับ

sugree's picture

ลง TG และสิ่งที่มันต้องการทั้งหมด เอาโค้ดของเราขึ้นไป แล้วก็เซ็ต mod_python

ขอบคุณครับคุณ sugree

veer's picture

อยากจะลองเรื่องพวกนี้นะ (แต่ต่อคิว Rails อยู่ :-P)

aireanalistic's picture

สำหรับติดตั้ง 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 ที่ถูกต้องให้ด้วยครับ
ขอบคุณครับ

sugree's picture

ลองแบบนี้

<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>
aireanalistic's picture

ผมสร้าง django project ชื่อ mysite ไว้ที่

/home/user/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 แบบนี้ครับ

Not Found

The requested URL /admin/ was not found on this server.
Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch7 mod_perl/2.0.2 Perl/v5.8.8 Server at localhost Port 80

แปลกครับ และ ไม่เข้าใจว่ามีอะไรผิด
แล้วก็ไม่รู้ว่าจะตรวจสอบได้อย่างไร
แนะนำเพิ่มเติมให้ด้วยนะครับ

ทั้งนี้หากสั่งด้วยคำสั่ง

$ cd /home/user/mysite
$ python manage.py runserver

จะสามารถเข้าไปใช้งานได้ที่

http://localhost:8000/admin/

ได้แบบสบายๆ ครับ

sugree's picture

น่าจะเป็นแบบนี้

<Location "/mysite/">
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE mysite.settings
    PythonDebug On
    PythonPath "['/home/user'] + sys.path"
</Location>
aireanalistic's picture

ให้ใส่ เข้าไปตั้งแต่ 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 น่าจะปลอดภัยกว่า

aireanalistic's picture

ลอง wsgi มั้ยคะ

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น