Распространение приложений на twisted

Michael_XIII аватар

Моя работа — создание различных приложений на Twisted  для работы с многочисленными веб-сервисами. В отличие от проектов на TurboGears
, которые я распространяю как eggs с помощью easy_install
(через setuptools) у меня не было удобного способа «выкатить» проекты на Twisted.
До этого момента.

Twisted преодставляет удобную систему
плагинов
которые позволяют приложениям встраиваться в «twistd» стартер.

Только одна проблема — полное отсутствие приличной документации об этом процессе.

Ниже я хочу привести небольшой рассказ о том, как можно собрать простое приложение в пакет twisted. На самом деле — я возьму известный туториал — Twisted finger и допишу шаг №12: «Как создать пакет для finger как приложение Twisted для twistd» (aka «Пропущенный шаг»).

Step 12: How to package the finger service as an installable Twisted application plugin for twistd

Создайте структуру каталогов, как показано ниже

  1. finger
  2. finger/__init__.py
  3. finger/finger.py
  4. MANIFEST.in
  5. setup.py
  6. twisted
  7. twisted/plugins
  8. twisted/plugins/finger_plugin.py

finger/finger.py — 
приложение finger отсюда.

twisted/plugins — структура каталогов, содержит файл finger_plugin.py, который будет описан ниже. Обратите внимание — никаких файлов __init__.py в каталогах twisted и twisted/plugins — это важно!

finger_plugin.py реализует интерфейсы IServiceMaker и IPlugin.

  1. # ==== twisted/plugins/finger_plugin.py ====
  2. # - Zope modules -
  3. from zope.interface import implements
  4.  
  5. # - Twisted modules -
  6. from twisted.python import usage
  7. from twisted.application.service import IServiceMaker
  8. from twisted.plugin import IPlugin
  9.  
  10. # - Finger modules -
  11. from finger import finger
  12.  
  13. class Options(usage.Options):
  14. synopsis = "[options]"
  15. longdesc = "Make a finger server."
  16. optParameters = [
  17. ['file', 'f', '/etc/users'],
  18. ['templates', 't', '/usr/share/finger/templates'],
  19. ['ircnick', 'n', 'fingerbot'],
  20. ['ircserver', None, 'irc.freenode.net'],
  21. ['pbport', 'p', 8889],
  22. ]
  23.  
  24. optFlags = [['ssl', 's']]
  25.  
  26. class MyServiceMaker(object):
  27. implements(IServiceMaker, IPlugin)
  28.  
  29. tapname = "finger"
  30. description = "Finger server."
  31. options = Options
  32.  
  33. def makeService(self, config):
  34. return finger.makeService(config)
  35.  
  36. serviceMaker = MyServiceMaker()

setup.py стандартный файл установщика. Обратите внимание на аргументы «packages» и «package_data» в функции setup() и функцию refresh_plugin_cache(), которая вызывается после того, как полностью отработает setup()s. Последняя вручную сбросит кэш плагинов Twisted (twisted/plugins/dropin.cache).

  1. # ==== twisted/plugins/finger_plugin.py ====
  2. '''setup.py for finger.
  3.  
  4. This is an extension of the Twisted finger tutorial demonstrating how
  5. to package the Twisted application as an installable Python package and
  6. twistd plugin (consider it "Step 12" if you like).
  7.  
  8. Uses twisted.python.dist.setup() to make this package installable as
  9. a Twisted Application Plugin.
  10.  
  11. After installation the application should be manageable as a twistd
  12. command.
  13.  
  14. For example, to start it in the foreground enter:
  15. $ twistd -n finger
  16.  
  17. To view the options for finger enter:
  18. $ twistd finger --help
  19. '''
  20.  
  21. __author__ = 'Chris Miles'
  22.  
  23.  
  24. import sys
  25.  
  26. try:
  27. import twisted
  28. except ImportError:
  29. raise SystemExit("twisted not found. Make sure you "
  30. "have installed the Twisted core package.")
  31.  
  32. from distutils.core import setup
  33.  
  34. def refresh_plugin_cache():
  35. from twisted.plugin import IPlugin, getPlugins
  36. list(getPlugins(IPlugin))
  37.  
  38. if __name__ == '__main__':
  39.  
  40. if sys.version_info[:2] >= (2, 4):
  41. extraMeta = dict(
  42. classifiers=[
  43. "Development Status :: 4 - Beta",
  44. "Environment :: No Input/Output (Daemon)",
  45. "Programming Language :: Python",
  46. ])
  47. else:
  48. extraMeta = {}
  49.  
  50. setup(
  51. name="finger",
  52. version='0.1',
  53. description="Finger server.",
  54. author=__author__,
  55. author_email="you@email.address",
  56. url="http://twistedmatrix.com/projects/core/documentation/howto/tutorial/index.html",
  57. packages=[
  58. "finger",
  59. "twisted.plugins",
  60. ],
  61. package_data={
  62. 'twisted': ['plugins/finger_plugin.py'],
  63. },
  64. **extraMeta)
  65.  
  66. refresh_plugin_cache()
  67.  

MANIFEST.in содержит одну строчуц, которая, как я полагаю, указывает distutils изменить существующий пакет Twisted (для установки
twisted/plugin/finger_plugin.py) и нечто наподобие.

graft twisted

Это все для того, чтобы можно было начать установку пакета обычным способом:

$ python setup.py install

После этого нужно запустить twistd — чтобы убедится, чтто приложение установилось нормально и доступно. Посмотрите на опции twistd:

  1. $ twistd --help
  2. Usage: twistd [options]
  3. ...
  4. Commands:
  5. athena-widget Create a service which starts a NevowSite with a single
  6. page with a single widget.
  7. ftp An FTP server.
  8. telnet A simple, telnet-based remote debugging service.
  9. socks A SOCKSv4 proxy service.
  10. manhole-old An interactive remote debugger service.
  11. portforward A simple port-forwarder.
  12. web A general-purpose web server which can serve from a
  13. filesystem or application resource.
  14. inetd An inetd(8) replacement.
  15. vencoderd Locayta Media Farm vencoderd video encoding server.
  16. news A news server.
  17. words A modern words server
  18. toc An AIM TOC service.
  19. finger Finger server.
  20. dns A domain name server.
  21. mail An email service
  22. manhole An interactive remote debugger service accessible via
  23. telnet and ssh and providing syntax coloring and basic
  24. line editing functionality.
  25. conch A Conch SSH service.

Посмотрим опции нашего сервера finger в плагине:

  1. $ twistd finger --help
  2. Usage: twistd [options] finger [options]
  3. Options:
  4. -s, --ssl
  5. -f, --file= [default: /etc/users]
  6. -t, --templates= [default: /usr/share/finger/templates]
  7. -n, --ircnick= [default: fingerbot]
  8. --ircserver= [default: irc.freenode.net]
  9. -p, --pbport= [default: 8889]
  10. --version
  11. --help Display this help and exit.
  12.  
  13. Make a finger server.

Запустим сервер finger в консоли:

  1. $ sudo twistd -n finger --file=users
  2. 2007/12/23 22:12 +1100 [-] Log opened.
  3. 2007/12/23 22:12 +1100 [-] twistd 2.5.0 (/Library/Frameworks/Python.framework/
  4. Versions/2.5/Resources/Python.app/Contents/MacOS/Python 2.5.0) starting up
  5. 2007/12/23 22:12 +1100 [-] reactor class: <class twisted.internet.selectreactor.selectreactor'="">
  6. 2007/12/23 22:12 +1100 [-] finger.finger.FingerFactoryFromService starting on 79
  7. 2007/12/23 22:12 +1100 [-] Starting factory <finger.finger.fingerfactoryfromservice instance="" at="" 0x1d0a4e0="">
  8. 2007/12/23 22:12 +1100 [-] twisted.web.server.Site starting on 8000
  9. 2007/12/23 22:12 +1100 [-] Starting factory <twisted.web.server.site instance="" at="" 0x1d0a558="">
  10. 2007/12/23 22:12 +1100 [-] twisted.spread.pb.PBServerFactory starting on 8889
  11. 2007/12/23 22:12 +1100 [-] Starting factory <twisted.spread.pb.pbserverfactory instance="" at="" 0x1d0a670="">
  12. 2007/12/23 22:12 +1100 [-] Starting factory <finger.finger.ircclientfactoryfromservice instance="" at="" 0x1d0a5f8="">
  13. </finger.finger.ircclientfactoryfromservice></twisted.spread.pb.pbserverfactory></twisted.web.server.site></finger.finger.fingerfactoryfromservice></class>

twistd предоставляет многочисленные полезные возможности — такие как запуск демона, указания расположения лог и pid файлов и т.д…

К сожалению, Twisted и setuptools не очень хорошо взаимодействуют вместе, так что я не смог упаковать мое приложение Twisted как egg, нужно повозится с системой разрешения зависимостей setuptools, или установить используя easy_install.

Ссылки:



— 
Источник

0
No votes yet
Your rating: None

Комментарии

Отправить комментарий