Un autre cadre ...

Concept de base du travail
Concept de base du travail

Hier, j'ai publié mon premier framework Python. Non, pas un autre. C'est dans le monde - un autre. Et pour moi jusqu'ici le premier. Et j'avoue qu'il est le premier du genre. C'est un cadre pour créer des serveurs personnalisés. Et ils seront créés via le fichier config. Wow, créons maintenant ...






Au début il y avait une config

Alors, config. Puisque nous avons déjà installé le cadre à ce stade. Et sinon, c'est facile et simple à faire avec la commande:





pip3 install idewavecore==0.0.1
      
      



Cela suppose que vous disposez de Python 3.6+, d' Internet et d'un ordinateur .





La configuration elle-même ressemble à ceci:





# settings.yml
settings:
  servers: !inject config_dir/servers.yml
  db_connections:
    sqlite:
      host: ~
      username: ~
      password: ~
      # default mysql 3306, postgresql 5432, sqlite don't need port
      port: ~
      # currently allowed: mysql, postgresql, sqlite
      dialect: sqlite
      # supported drivers:
      # mysql: mysqlconnector, pymysql, pyodbc
      # postgresql: psycopg2, pg8000, pygresql
      driver: ~
      # to use with sqlite this should be absolute db path
      # can be empty to keep db in memory (sqlite only)
      db_name: ~
      charset: ~
      
      



!inject



- yaml . , yaml- -.





# servers.yml
sample_server:
  connection:
    host: 1.2.3.4
    port: 1234
    # possible values: tcp, websocket
    connection_type: tcp
  # optional
  proxy:
    host: ~
    port: ~
    # possible values: tcp, websocket
    connection_type: tcp
  options:
    server_name: Sample Server
    is_debug: false
  middlewares: !pipe
    - !fn native.test.mock_middleware
    - !fn native.test.mock_middleware
    - !infinite_loop
        - !fn native.test.mock_middleware
        - !fn native.test.mock_middleware
        - !fn native.test.mock_middleware
        - !router
            ROUTE_1: !fn native.test.mock_middleware
            ROUTE_2: !fn native.test.mock_middleware
            ROUTE_3:
              - !fn native.test.mock_middleware
              - !fn native.test.mock_middleware
              - !fn native.test.mock_middleware
  # optional
  db_connection: sqlite
      
      



.





!pipe



- , . , middlewares ( - ), . - .





!infinite_loop



- , . (, websocket).





!router



- , . , , (route).





, , !fn



- , ( - middleware) . , - - middlewares - . , , :





!fn <__>.<_>







. (middlewares) - . (! !), native



, :





!fn native.test.mock_middleware







, .





Middle where

- , . , - . .





, - , ( - ). :





from idewavecore.session import Storage, ItemFlag


async def sample_middleware(**kwargs):
    global_storage: Storage = kwargs.pop('global_storage')
    server_storage: Storage = kwargs.pop('server_storage')
    session_storage: Storage = kwargs.pop('session_storage')

    session_storage.set_items([
        {
            'key1': {
                'value': 'some_tmp_value'
            }
        },
        {
            'key2': {
                'value': 'some_persistent_value',
                'flags': ItemFlag.PERSISTENT
            }
        },
        {
            'key3': {
                'value': 'some_persistent_constant_value',
                'flags': ItemFlag.PERSISTENT | ItemFlag.FROZEN
            }
        },
        {
            'key4': {
                'value': 'some_constant_value',
                'flags': ItemFlag.FROZEN
            }
        }
    ])

    value_of_key3 = session_storage.get_value('key3')
      
      



(storage). : (global storage), (server storage) (session storage).





, .





.





.





.





( , . . , -. - , .)





...

, - Assembler. , . :





# run.py
import asyncio

from idewavecore import Assembler
from idewavecore.session import Storage

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    global_storage = Storage()

    assembler = Assembler(
        global_storage=global_storage,
        #    
        config_path='settings.yml'
    )

    servers = assembler.assemble()
    for server in servers:
        server.start()

    loop.run_until_complete(
        asyncio.gather(*[server.get() for server in servers])
    )

    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        loop.close()
      
      



- ( , ) , . - , curl, mmo rpg ...





Et maintenant, je veux dire merci à tous ceux qui ont lu mon message jusqu'au bout. Je vous serais reconnaissant pour tout commentaire constructif. Même si mon framework n'est pas le premier du genre, je souhaite le rapprocher le plus possible de ce bar.





Rejoignez-nous .








All Articles