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).
, .
.
.
.
( , . . , -. - , .)
...
# 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 .