/demo.py

https://github.com/madkote/fastapi-plugins · Python · 335 lines · 222 code · 50 blank · 63 comment · 21 complexity · b0ce8b369b5c3691b60fc05640ad3342 MD5 · raw file

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # demo
  4. '''
  5. :author: madkote
  6. :contact: madkote(at)bluewin.ch
  7. :copyright: Copyright 2021, madkote
  8. demo
  9. ----
  10. Demo
  11. '''
  12. from __future__ import absolute_import
  13. import asyncio
  14. import logging
  15. import os
  16. import time
  17. import fastapi
  18. import pydantic
  19. import fastapi_plugins
  20. __all__ = []
  21. __author__ = 'madkote <madkote(at)bluewin.ch>'
  22. __version__ = '.'.join(str(x) for x in fastapi_plugins.VERSION)
  23. __copyright__ = 'Copyright 2021, madkote'
  24. class OtherSettings(pydantic.BaseSettings):
  25. other: str = 'other'
  26. class AppSettings(
  27. OtherSettings,
  28. fastapi_plugins.LoggingSettings,
  29. fastapi_plugins.RedisSettings,
  30. fastapi_plugins.SchedulerSettings
  31. ):
  32. api_name: str = str(__name__)
  33. logging_level: int = logging.INFO
  34. async def test_redis():
  35. print('--- do redis test')
  36. app = fastapi_plugins.register_middleware(fastapi.FastAPI())
  37. config = fastapi_plugins.RedisSettings()
  38. config = None
  39. config = AppSettings(redis_host='127.0.0.1')
  40. config = AppSettings()
  41. await fastapi_plugins.redis_plugin.init_app(app=app, config=config)
  42. await fastapi_plugins.redis_plugin.init()
  43. c = await fastapi_plugins.redis_plugin()
  44. print(await c.get('x'))
  45. print(await c.set('x', str(time.time())))
  46. print(await c.get('x'))
  47. await fastapi_plugins.redis_plugin.terminate()
  48. print('---test redis done')
  49. async def test_scheduler():
  50. async def coro(name, timeout):
  51. try:
  52. print('> sleep', name, timeout)
  53. await asyncio.sleep(timeout)
  54. print('---> sleep done', name, timeout)
  55. except asyncio.CancelledError as e:
  56. print('coro cancelled', name)
  57. raise e
  58. print('--- do schedule test')
  59. app = fastapi_plugins.register_middleware(fastapi.FastAPI())
  60. config = fastapi_plugins.SchedulerSettings()
  61. config = None
  62. config = AppSettings(aiojobs_limit=100)
  63. config = AppSettings()
  64. # config = AppSettings(aiojobs_limit=1)
  65. await fastapi_plugins.scheduler_plugin.init_app(app=app, config=config)
  66. await fastapi_plugins.scheduler_plugin.init()
  67. try:
  68. print('- play')
  69. s = await fastapi_plugins.scheduler_plugin()
  70. # import random
  71. for i in range(10):
  72. await s.spawn(coro(str(i), i/10))
  73. # await s.spawn(coro(str(i), i/10 + random.choice([0.1, 0.2, 0.3, 0.4, 0.5]))) # nosec B311
  74. # print('----------')
  75. print('- sleep', 5)
  76. await asyncio.sleep(5.0)
  77. print('- terminate')
  78. finally:
  79. await fastapi_plugins.scheduler_plugin.terminate()
  80. print('---test schedule done')
  81. # async def test_scheduler_enable_cancel():
  82. # async def coro(name, timeout):
  83. # try:
  84. # print('> sleep', name, timeout)
  85. # await asyncio.sleep(timeout)
  86. # print('---> sleep done', name, timeout)
  87. # except asyncio.CancelledError as e:
  88. # print('coro cancelled', name)
  89. # raise e
  90. #
  91. # print('--- do schedule test')
  92. # app = fastapi.FastAPI()
  93. # config = fastapi_plugins.SchedulerSettings()
  94. # config = None
  95. # config = AppSettings(aiojobs_limit=100)
  96. # config = AppSettings(aiojobs_enable_cancel=True)
  97. #
  98. # await fastapi_plugins.scheduler_plugin.init_app(app=app, config=config)
  99. # await fastapi_plugins.scheduler_plugin.init()
  100. # try:
  101. # print('- play')
  102. # s = await fastapi_plugins.scheduler_plugin()
  103. # jobs = []
  104. # for i in range(2):
  105. # job = await s.spawn(coro(str(i), 12.75))
  106. # jobs.append(job.id)
  107. # print('- sleep', 2)
  108. # await asyncio.sleep(2.0)
  109. # print('- cancel')
  110. # for job_id in jobs:
  111. # await s.cancel_job(job_id)
  112. # print('- terminate')
  113. # finally:
  114. # await fastapi_plugins.scheduler_plugin.terminate()
  115. # print('---test schedule done')
  116. async def test_demo():
  117. async def coro(con, name, timeout):
  118. try:
  119. await con.set(name, '...')
  120. print('> sleep', name, timeout)
  121. await asyncio.sleep(timeout)
  122. await con.set(name, 'done')
  123. print('---> sleep done', name, timeout)
  124. except asyncio.CancelledError as e:
  125. print('coro cancelled', name)
  126. raise e
  127. print('--- do demo')
  128. app = fastapi_plugins.register_middleware(fastapi.FastAPI())
  129. config = AppSettings(logging_style=fastapi_plugins.LoggingStyle.logfmt)
  130. await fastapi_plugins.log_plugin.init_app(app, config, name=__name__)
  131. await fastapi_plugins.log_plugin.init()
  132. await fastapi_plugins.redis_plugin.init_app(app=app, config=config)
  133. await fastapi_plugins.redis_plugin.init()
  134. await fastapi_plugins.scheduler_plugin.init_app(app=app, config=config)
  135. await fastapi_plugins.scheduler_plugin.init()
  136. try:
  137. num_jobs = 10
  138. num_sleep = 0.25
  139. print('- play')
  140. l = await fastapi_plugins.log_plugin()
  141. c = await fastapi_plugins.redis_plugin()
  142. s = await fastapi_plugins.scheduler_plugin()
  143. for i in range(num_jobs):
  144. await s.spawn(coro(c, str(i), i/10))
  145. l.info('- sleep %s' % num_sleep)
  146. # print('- sleep', num_sleep)
  147. await asyncio.sleep(num_sleep)
  148. l.info('- check')
  149. # print('- check')
  150. for i in range(num_jobs):
  151. l.info('%s == %s' % (i, await c.get(str(i))))
  152. # print(i, '==', await c.get(str(i)))
  153. finally:
  154. print('- terminate')
  155. await fastapi_plugins.scheduler_plugin.terminate()
  156. await fastapi_plugins.redis_plugin.terminate()
  157. await fastapi_plugins.log_plugin.terminate()
  158. print('---demo done')
  159. async def test_demo_custom_log():
  160. async def coro(con, name, timeout):
  161. try:
  162. await con.set(name, '...')
  163. print('> sleep', name, timeout)
  164. await asyncio.sleep(timeout)
  165. await con.set(name, 'done')
  166. print('---> sleep done', name, timeout)
  167. except asyncio.CancelledError as e:
  168. print('coro cancelled', name)
  169. raise e
  170. class CustomLoggingSettings(fastapi_plugins.LoggingSettings):
  171. another_format: str = '%(asctime)s %(levelname)-8s %(name)-15s %(message)s'
  172. class CustomLoggingPlugin(fastapi_plugins.LoggingPlugin):
  173. def _create_logger(
  174. self,
  175. name:str,
  176. config:pydantic.BaseSettings=None
  177. ) -> logging.Logger:
  178. import sys
  179. handler = logging.StreamHandler(stream=sys.stderr)
  180. formatter = logging.Formatter(config.another_format)
  181. logger = logging.getLogger(name)
  182. #
  183. logger.setLevel(config.logging_level)
  184. handler.setLevel(config.logging_level)
  185. handler.setFormatter(formatter)
  186. logger.addHandler(handler)
  187. return logger
  188. class AppSettings(
  189. OtherSettings,
  190. fastapi_plugins.RedisSettings,
  191. fastapi_plugins.SchedulerSettings,
  192. CustomLoggingSettings
  193. ):
  194. api_name: str = str(__name__)
  195. logging_level: int = logging.INFO
  196. print('--- do demo')
  197. app = fastapi_plugins.register_middleware(fastapi.FastAPI())
  198. config = AppSettings(logging_style=fastapi_plugins.LoggingStyle.logfmt)
  199. mylog_plugin = CustomLoggingPlugin()
  200. await mylog_plugin.init_app(app, config, name=__name__)
  201. await mylog_plugin.init()
  202. await fastapi_plugins.redis_plugin.init_app(app=app, config=config)
  203. await fastapi_plugins.redis_plugin.init()
  204. await fastapi_plugins.scheduler_plugin.init_app(app=app, config=config)
  205. await fastapi_plugins.scheduler_plugin.init()
  206. try:
  207. num_jobs = 10
  208. num_sleep = 0.25
  209. print('- play')
  210. l = await mylog_plugin()
  211. c = await fastapi_plugins.redis_plugin()
  212. s = await fastapi_plugins.scheduler_plugin()
  213. for i in range(num_jobs):
  214. await s.spawn(coro(c, str(i), i/10))
  215. l.info('- sleep %s' % num_sleep)
  216. # print('- sleep', num_sleep)
  217. await asyncio.sleep(num_sleep)
  218. l.info('- check')
  219. # print('- check')
  220. for i in range(num_jobs):
  221. l.info('%s == %s' % (i, await c.get(str(i))))
  222. # print(i, '==', await c.get(str(i)))
  223. finally:
  224. print('- terminate')
  225. await fastapi_plugins.scheduler_plugin.terminate()
  226. await fastapi_plugins.redis_plugin.terminate()
  227. await mylog_plugin.terminate()
  228. print('---demo done')
  229. async def test_memcached():
  230. print('---test memcached')
  231. from fastapi_plugins.memcached import MemcachedSettings
  232. from fastapi_plugins.memcached import memcached_plugin
  233. class MoreSettings(AppSettings, MemcachedSettings):
  234. memcached_prestart_tries = 5
  235. memcached_prestart_wait = 1
  236. app = fastapi_plugins.register_middleware(fastapi.FastAPI())
  237. config = MoreSettings()
  238. await memcached_plugin.init_app(app=app, config=config)
  239. await memcached_plugin.init()
  240. c = await memcached_plugin()
  241. print(await c.get(b'x'))
  242. print(await c.set(b'x', str(time.time()).encode()))
  243. print(await c.get(b'x'))
  244. await memcached_plugin.terminate()
  245. print('---test memcached done')
  246. # =============================================================================
  247. # ---
  248. # =============================================================================
  249. def main_memcached():
  250. print(os.linesep * 3)
  251. print('=' * 50)
  252. loop = asyncio.get_event_loop()
  253. loop.run_until_complete(test_memcached())
  254. def main_redis():
  255. print(os.linesep * 3)
  256. print('=' * 50)
  257. loop = asyncio.get_event_loop()
  258. loop.run_until_complete(test_redis())
  259. def main_scheduler():
  260. print(os.linesep * 3)
  261. print('=' * 50)
  262. loop = asyncio.get_event_loop()
  263. loop.run_until_complete(test_scheduler())
  264. # loop.run_until_complete(test_scheduler_enable_cancel())
  265. def main_demo():
  266. print(os.linesep * 3)
  267. print('=' * 50)
  268. loop = asyncio.get_event_loop()
  269. loop.run_until_complete(test_demo())
  270. def main_demo_custom_log():
  271. print(os.linesep * 3)
  272. print('=' * 50)
  273. loop = asyncio.get_event_loop()
  274. loop.run_until_complete(test_demo_custom_log())
  275. if __name__ == '__main__':
  276. main_redis()
  277. main_scheduler()
  278. main_demo()
  279. main_demo_custom_log()
  280. #
  281. try:
  282. main_memcached()
  283. except Exception as e:
  284. print(type(e), e)