Ein weiterer Rahmen ...

Grundkonzept der Arbeit
Grundkonzept der Arbeit

Gestern habe ich mein erstes Python-Framework veröffentlicht. Nein, nicht noch einer. Dies ist in der Welt - eine andere. Und für mich bisher das erste. Und ich gebe zu, dass er der erste seiner Art ist. Es ist ein Framework zum Erstellen benutzerdefinierter Server. Und sie werden über die Konfiguration erstellt. Wow, lass uns jetzt kreieren ...






Am Anfang gab es eine Konfiguration

Also, config. Da haben wir das Framework zu diesem Zeitpunkt bereits installiert. Und wenn nicht, dann ist es einfach und unkompliziert mit dem Befehl:





pip3 install idewavecore==0.0.1
      
      



Dies setzt voraus, dass Sie über Python 3.6+, Internet und Computer verfügen .





Die Konfiguration selbst sieht ungefähr so ​​aus:





# 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 ...





Und jetzt möchte ich mich bei allen bedanken, die meinen Beitrag bis zum Ende gelesen haben. Für konstruktive Kommentare wäre ich dankbar. Auch wenn mein Framework nicht das erste seiner Art ist, möchte ich es so nah wie möglich an diese Bar bringen.





Mach mit .








All Articles