جدول المحتويات

طرق النشر

إن هناك عشرات الطرق لإطلاق تطبيقات عكاشة شأنه في ذلك شان تطبيقات WSGI حيث أنها معايير كتابة تطبيقات الويب في بايثون. ومن هذه الطرق

الطريقة التي ننصح بها هي mod_wsgi بشكل رسمي وعبر python-paste للاختبار والتطوير

طريقة CGI البائدة وما يشبهها

استخدم دالة run_with_cgi الموجودة في برنامج الصغير المرفق مع PEP 0333 هذه الدالة تستلم كائن تطبيق الويب.

ضع ذاك الكود (كود الدالة وإنشاء الكائن ثم استدعاء الدالة مع تمرير التطبيق لها) في ملف ثم ضعه في cgi-bin ثم اسمح بتنفيذه.

عبر خادم python-paste المنضد

انظر صفحة مثال أولي بسيط

عبر mod_proxy في apache

لنفرض أن التطبيق يعمل على خادم paste الضمني على المنفذ 8080 ويستمع فقط للطلبات المحلية على العنوان 127.0.0.1 أي localhost حتى نجعله متوفر عبر خادم apache العام على منفذ 80 يمكننا بكل بساطة أن نضيف ما يلي إلى إعدادات Apache

ProxyPass         /myapp  http://localhost:8080/
ProxyPassReverse  /myapp  http://localhost:8080/

وفي هذه الحالة ستحال الطلبات القدمة إلى المنفذ 80 إن كانت تبدأ ب /myapp إلى http://localhost:8080/

عبر google app engine

لنفرض أن لديك تطبيق ويب اسمه test.py يحتوي على فئة اسمها MyWebApp ونريد تشغيله على غوغل apps engine لذا نعمل ملف الذي يشغله وليكن اسمه apptest.py مثلا هكذا:

#! /usr/bin/python
# -*- coding: UTF-8 -*-
import sys, os, os.path
from test import webApp
 
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
 
d=os.path.dirname(__file__)
application=MyWebApp(
    os.path.join(d, 'templates'),
    staticBaseDir={'/_files/':os.path.join(d, 'files')}
);
run_wsgi_app(application)

ونعمل ملف app.yaml نخبره أن يحل كل شيء إلى apptest.py هكذا

application: okashaTest
version: 1
runtime: python
api_version: 1

handlers:
- url: .*
  script: apptest.py

بعدها قم بتجربته فإن كان كل شيء على خير ما يرام يمكنك نقل تخديم الملفات الساكنة إلى google apps عوضا عن عكاشة بتعديل الملف app.yaml إلى

application: okashaTest
version: 1
runtime: python
api_version: 1

handlers:
- url: /_files
  static_dir: files

- url: .*
  script: apptest.py

ملاحظة: لا تستطيع استخدام قوالب formatTemplate لأنها غير متوفرة في بايثون 2.5 بل 2.6.

ملاحظة: عليك تعديل سطرين من كود baseWebApp.py عكاشة من except webAppBaseException as e إلى صيغة بايثون القديمة except webAppBaseException, e

عبر mod_python في خادم apache

عبر mod_wsgi في خادم apache

طريقة توزيع الملفات

قم بتثبيت إضافة mod_wsgi في خادم أباتشي من مدير الجزم (في أعجوبة اسم الحزم هو mod_wsgi)

تأكد من تثبيت الحزم التي قد تلزمك مثل python-kid أو python-elixir (هي لا تلزم عكاشة لكن من المفيد استعمالها)

بعد ذلك قم بإعادة توزيع الملفات بحيث تناسب الخادم فإن كان حسابك على الخادم يعطيك وصول إلى مجلد البيت وكنت تضع ملفاتك هناك ضعها خارج مجلد public_html. كذلك خصص مجلد لتضع فيه ما قد يلزمك من مكتبات بايثون بما فيها وحدة تطبيق الويب الخاص بك مثلا /home/ahmad/pyapps/ ثم اعمل ملف بايثون مهمته الوحيدة تعريف كائن اسمه application من صنف تطبيق الويب الخاص بك. سم ذاك الملف myapp.wsgi

# -*- coding: UTF-8 -*-
import sys, os, os.path
prefix=os.path.expanduser('~/myapp-files/')
pyprefix=os.path.expanduser('~/pyapps/')
sys.path.insert(0, pyprefix)
from myapp import MyApp
application=MyApp(
  os.path.join(prefix,'templates'),
  staticBaseDir={'/media/':os.path.join(prefix,'static-files')}
  );

هذا الملف يحدد /home/ahmad/pyapps/ كمجلد للبحث عن مكتبات بايثون والتي من بينها myapp.py كذلك يحدد المجلد /home/ahmad/myapp-files/ كي يحتوي على القوالب والملفات الساكنة.

إعداد apache

لنفرض أن لديك خادم وتريد تشغيل التطبيق فيه على جذر نطاق فرعي sub-domain اسمه myapp.myhost.org عندها تكون الإعدادات كما يلي:

<VirtualHost *:80>
  ServerName myapp.myhost.org
 
    WSGIDaemonProcess myapp.myhost.org processes=1 threads=15 display-name=myapp user=ahmad group=ahmadgroup
    WSGIProcessGroup myapp.myhost.org
 
    WSGIScriptAlias / /home/ahmad/pyapps/myapp.wsgi
 
</VirtualHost>

يمكنك أيضا إلقاء عبئ تحميل الملفات الساكنة على خادم الويب وليس على عكاشة وذلك بإضافة المقطع التالي داخل السابق

    DocumentRoot /home/ahmad/myapp-files/static-files/
    Alias /favicon.ico /home/ahmad/myapp-files/static-files/favicon.ico
 
    Alias /media/ /home/ahmad/myapp-files/static-files/
 
    <Directory /home/ahmad/myapp-files/static-files>
    Order allow,deny
    Allow from all
    </Directory>

عبر Fast CGI

توفر flup دعم fast cgi تطليقات wsgi مثل عكاشة كل ما عليك هو عمل ملف يشبه الملف أدناه وتسميته myapp.fcgi وحفظه في مكان يراه خادم apache

#! /usr/bin/python
# -*- coding: UTF-8 -*-
 
sys.path.insert(0, os.path.expanduser('~/projects/'))
from flup.server.fcgi import WSGIServer
from myapp import MyApp
application=MyApp(
  os.path.join(prefix,'templates'),
  staticBaseDir={'/media/':os.path.join(prefix,'static-files')}
  );
 
if __name__ == '__main__':
  WSGIServer(application).run()

انظر

خوادم أخرى

من أفضل خوادم WSGI أداءً وتوفيرا في الذاكرة وسرعة الاستجابة

تقييم خوادم WSGI

بعكس ما تتوقع فإن أداء twisted و tornado كان سئيا جدا في اختبارات الأداء.