130 lines
3.2 KiB
Python
130 lines
3.2 KiB
Python
import os
|
|
import re
|
|
import traceback
|
|
|
|
from aiohttp.web_urldispatcher import StaticResource, _WebHandler, PathLike
|
|
from aiohttp.web_urldispatcher import Optional, _ExpectHandler
|
|
from aiohttp.web_urldispatcher import Path
|
|
from aiohttp.web_response import Response, StreamResponse
|
|
from aiohttp.web_exceptions import (
|
|
HTTPException,
|
|
HTTPExpectationFailed,
|
|
HTTPForbidden,
|
|
HTTPMethodNotAllowed,
|
|
HTTPNotFound,
|
|
)
|
|
from aiohttp import web
|
|
from aiohttp.web_fileresponse import FileResponse
|
|
from aiohttp.web_request import Request
|
|
from aiohttp.web_response import Response, StreamResponse
|
|
from aiohttp.web_routedef import AbstractRouteDef
|
|
from aiohttp.web import json_response
|
|
|
|
|
|
from sqlor.crud import CRUD
|
|
|
|
from appPublic.dictObject import multiDict2Dict
|
|
from appPublic.jsonConfig import getConfig
|
|
|
|
from .error import Error,Success
|
|
|
|
DEFAULT_METHODS = ('GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE')
|
|
|
|
class RestEndpoint:
|
|
|
|
def __init__(self):
|
|
self.methods = {}
|
|
|
|
for method_name in DEFAULT_METHODS:
|
|
method = getattr(self, method_name.lower(), None)
|
|
if method:
|
|
self.register_method(method_name, method)
|
|
|
|
def register_method(self, method_name, method):
|
|
self.methods[method_name.upper()] = method
|
|
|
|
async def dispatch(self):
|
|
method = self.methods.get(self.request.method.upper())
|
|
if not method:
|
|
raise HTTPMethodNotAllowed('', DEFAULT_METHODS)
|
|
|
|
return await method()
|
|
|
|
|
|
class DBCrud(RestEndpoint):
|
|
def __init__(self, request,dbname,tablename, id=None):
|
|
super().__init__()
|
|
self.dbname = dbname
|
|
self.tablename = tablename
|
|
self.request = request
|
|
self.id = id
|
|
try:
|
|
self.crud = CRUD(dbname,tablename)
|
|
except Exception as e:
|
|
print('e=',e)
|
|
traceback.print_exc()
|
|
raise HTTPNotFound
|
|
|
|
async def options(self) -> Response:
|
|
try:
|
|
d = await self.crud.I()
|
|
return json_response(Success(d))
|
|
except Exception as e:
|
|
print(e)
|
|
traceback.print_exc()
|
|
return json_response(Error(errno='metaerror',msg='get metadata error'))
|
|
|
|
async def get(self) -> Response:
|
|
"""
|
|
query data
|
|
"""
|
|
try:
|
|
ns = multiDict2Dict(self.request.query)
|
|
if self.id is not None:
|
|
ns['__id'] = self.id
|
|
d = await self.crud.R(NS=ns)
|
|
return json_response(Success(d))
|
|
except Exception as e:
|
|
print(e)
|
|
traceback.print_exc()
|
|
return json_response(Error(errno='search error',msg='search error'))
|
|
|
|
async def post(self):
|
|
"""
|
|
insert data
|
|
"""
|
|
try:
|
|
ns = multiDict2Dict(await self.request.post())
|
|
d = await self.crud.C(ns)
|
|
return json_response(Success(d))
|
|
except Exception as e:
|
|
print(e)
|
|
traceback.print_exc()
|
|
return json_response(Error(errno='add error',msg='add error'))
|
|
|
|
async def put(self):
|
|
"""
|
|
update data
|
|
"""
|
|
try:
|
|
ns = multiDict2Dict(await self.request.post())
|
|
d = await self.crud.U(ns)
|
|
return json_response(Success(''))
|
|
except Exception as e:
|
|
print(e)
|
|
traceback.print_exc()
|
|
return json_response(Error(errno='update error',msg='update error'))
|
|
|
|
async def delete(self, request: Request, instance_id):
|
|
"""
|
|
delete data
|
|
"""
|
|
try:
|
|
ns = multiDict2Dict(self.request.query)
|
|
d = await self.crud.D(ns)
|
|
return json_response(Success(d))
|
|
except Exception as e:
|
|
print(e)
|
|
traceback.print_exc()
|
|
return json_response(Error(erron='delete error',msg='error'))
|