إن هناك عشرات الطرق لإطلاق تطبيقات عكاشة شأنه في ذلك شان تطبيقات WSGI حيث أنها معايير كتابة تطبيقات الويب في بايثون. ومن هذه الطرق
الطريقة التي ننصح بها هي mod_wsgi بشكل رسمي وعبر python-paste للاختبار والتطوير
استخدم دالة run_with_cgi الموجودة في برنامج الصغير المرفق مع PEP 0333 هذه الدالة تستلم كائن تطبيق الويب.
ضع ذاك الكود (كود الدالة وإنشاء الكائن ثم استدعاء الدالة مع تمرير التطبيق لها) في ملف ثم ضعه في cgi-bin ثم اسمح بتنفيذه.
انظر صفحة مثال أولي بسيط
لنفرض أن التطبيق يعمل على خادم 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/
لنفرض أن لديك تطبيق ويب اسمه 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_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/ كي يحتوي على القوالب والملفات الساكنة.
لنفرض أن لديك خادم وتريد تشغيل التطبيق فيه على جذر نطاق فرعي 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>
توفر 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 أداءً وتوفيرا في الذاكرة وسرعة الاستجابة
بعكس ما تتوقع فإن أداء twisted و tornado كان سئيا جدا في اختبارات الأداء.