昨日、最初のPythonフレームワークをリリースしました。いいえ、別のものではありません。これは世界にあります-別のものです。そして私にとってこれまでのところ最初のもの。そして、私は彼がその種の最初のものであることを認めます。これは、カスタムサーバーを構築するためのフレームワークです。そして、それらは設定を通じて作成されます。うわー、今作成しましょう...
最初は設定がありました
だから、設定。この時点ですでにフレームワークをインストールしているので。そうでない場合は、次のコマンドを使用して簡単に実行できます。
pip3 install idewavecore==0.0.1
これは、Python 3.6以降、インターネット、およびコンピューターがあることを前提としています。
構成自体は次のようになります。
# 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 ...
そして今、私の投稿を最後まで読んでくださった皆さんに感謝します。建設的なコメントをいただければ幸いです。私のフレームワークはその種の最初のものではありませんが、このバーにできるだけ近づけたいと思います。