From 2cbeccc221ba829748e009f274000a87b653566d Mon Sep 17 00:00:00 2001
From: IvanLu <835498692@qq.com>
Date: Wed, 3 Apr 2024 11:11:37 +0800
Subject: [PATCH] update sse
---
bunnypy/bunnypy.py | 47 +++++++++++++++++++++++-----------------------
1 file changed, 24 insertions(+), 23 deletions(-)
diff --git a/bunnypy/bunnypy.py b/bunnypy/bunnypy.py
index 2f48b88..fc866ad 100644
--- a/bunnypy/bunnypy.py
+++ b/bunnypy/bunnypy.py
@@ -8,7 +8,7 @@
from urllib.parse import parse_qs
from wsgiref.simple_server import make_server
-__version__ = "0.3.1"
+__version__ = "0.3.2"
__default_html__ = '''
Welcome to BunnyPy
@@ -32,9 +32,14 @@
'''
-__asset_dir__ = os.path.dirname(os.path.abspath(__file__)) + '/asset/'
-__def_allowed_methods__ = ', '.join(['GET', 'POST', 'PUT', 'DELETE'])
-__def_allowed_headers__ = ', '.join(['Content-Type', 'Authorization'])
+__ASSET_DIR__ = os.path.dirname(os.path.abspath(__file__)) + '/asset/'
+__ALLOWED_METHODS__ = ', '.join(['GET', 'POST', 'PUT', 'DELETE'])
+__ALLOWED_HEADERS__ = ', '.join(['Content-Type', 'Authorization'])
+__MIME_HEADERS__ = {
+ 'html': ('Content-Type', 'text/html;charset=utf-8'),
+ 'json': ('Content-Type', 'application/json;charset=utf-8'),
+ 'sse': ('Content-Type', 'text/event-stream;charset=utf-8'),
+}
class Bunny:
@@ -48,12 +53,12 @@ def handler(self, environ, start_response):
cors_conf = self.__cors__(environ)
else:
cors_conf = {}
- allowed_origin = cors_conf['origins'] if 'origins' in cors_conf else ''
+ allowed_origin = ('Access-Control-Allow-Origin', cors_conf['origins'] if 'origins' in cors_conf else '')
if environ['REQUEST_METHOD'] == 'OPTIONS' and 'HTTP_ACCESS_CONTROL_REQUEST_METHOD' in environ:
start_response('200 OK', [
- ('Access-Control-Allow-Origin', allowed_origin),
- ('Access-Control-Allow-Methods', __def_allowed_methods__),
- ('Access-Control-Allow-Headers', __def_allowed_headers__),
+ allowed_origin,
+ ('Access-Control-Allow-Methods', __ALLOWED_METHODS__),
+ ('Access-Control-Allow-Headers', __ALLOWED_HEADERS__),
('Access-Control-Max-Age', '86400')
])
return []
@@ -64,9 +69,9 @@ def handler(self, environ, start_response):
data = static_file.read()
except FileNotFoundError:
data = self.__render_error('404 Not Found')
- start_response('200 OK', [('Access-Control-Allow-Origin', allowed_origin),
- ('Content-Type', 'text/html;charset=utf-8')])
- return [data]
+ start_response('200 OK', [allowed_origin, __MIME_HEADERS__['html']])
+ yield data
+ return []
url_array = environ['PATH_INFO'].split('/')
if url_array[1] == '':
url_array[1] = 'index'
@@ -78,22 +83,18 @@ def handler(self, environ, start_response):
req = self.Request(environ)
response = self.__call_action__(req, url_array[1], action)
if isinstance(response, dict) or isinstance(response, list):
- start_response('200 OK', [('Access-Control-Allow-Origin', allowed_origin),
- ('Content-Type', 'application/json;charset=utf-8')])
- return [json.dumps(response).encode('utf-8')]
+ start_response('200 OK', [allowed_origin, __MIME_HEADERS__['json']])
+ yield json.dumps(response).encode('utf-8')
elif isinstance(response, types.GeneratorType):
- start_response('200 OK', [('Access-Control-Allow-Origin', allowed_origin),
- ('Content-Type', 'text/event-stream;charset=utf-8')])
+ start_response('200 OK', [allowed_origin, __MIME_HEADERS__['sse']])
for chunk in response:
yield f'data: {chunk}\n\n'.encode('utf-8')
else:
- start_response('200 OK', [('Access-Control-Allow-Origin', allowed_origin),
- ('Content-Type', 'text/html;charset=utf-8')])
- return [response.encode('utf-8')]
+ start_response('200 OK', [allowed_origin, __MIME_HEADERS__['html']])
+ yield response.encode('utf-8')
else:
- start_response('200 OK', [('Access-Control-Allow-Origin', allowed_origin),
- ('Content-Type', 'text/html;charset=utf-8')])
- return [__default_html__.encode('utf-8')]
+ start_response('200 OK', [allowed_origin, __MIME_HEADERS__['html']])
+ yield __default_html__.encode('utf-8')
def __init__(self, host='127.0.0.1', port=8000, database=None, cors=None):
self.__host__ = host
@@ -177,7 +178,7 @@ def render(self, view, context=None):
def __render_error(self, msg, err_trace=None):
return self.TemplateRender('error.html', {
'bunny_error': msg, 'bunny_error_trace': err_trace
- }, __asset_dir__).render()
+ }, __ASSET_DIR__).render()
class Request:
def __init__(self, environ):