v0.1 fastapi: route + model + orm
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
class RouterMeta(type):
|
||||
"""元类:自动收集被 @route 标记的方法"""
|
||||
def __new__(mcs, name, bases, namespace):
|
||||
routes = {}
|
||||
for key, value in namespace.items():
|
||||
if hasattr(value, "_route_path"):
|
||||
routes[value._route_path] = (value._http_method, key)
|
||||
namespace["_routes"] = routes
|
||||
return super().__new__(mcs, name, bases, namespace)
|
||||
|
||||
|
||||
def route(path, method="GET"):
|
||||
"""装饰器:给方法打上路由标记"""
|
||||
def decorator(func):
|
||||
func._route_path = path
|
||||
func._http_method = method
|
||||
return func
|
||||
return decorator
|
||||
|
||||
|
||||
class Controller(metaclass=RouterMeta):
|
||||
"""所有控制器的基类"""
|
||||
|
||||
@classmethod
|
||||
def dispatch(cls, path, method):
|
||||
if path not in cls._routes:
|
||||
return 404, "Not Found"
|
||||
http_method, func_name = cls._routes[path]
|
||||
if http_method != method:
|
||||
return 405, "Method Not Allowed"
|
||||
return 200, getattr(cls(), func_name)()
|
||||
|
||||
|
||||
# ===== 使用 =====
|
||||
class UserController(Controller):
|
||||
@route("/users", "GET")
|
||||
def list_users(self):
|
||||
return [{"id": 1, "name": "Alice"}]
|
||||
|
||||
@route("/users/create", "POST")
|
||||
def create_user(self):
|
||||
return {"status": "created"}
|
||||
|
||||
|
||||
print(UserController._routes)
|
||||
# {'/users': ('GET', 'list_users'), '/users/create': ('POST', 'create_user')}
|
||||
|
||||
print(UserController.dispatch("/users", "GET"))
|
||||
# (200, [{'id': 1, 'name': 'Alice'}])
|
||||
|
||||
print(UserController.dispatch("/users", "POST"))
|
||||
# (405, 'Method Not Allowed')
|
||||
|
||||
print(UserController.dispatch("/unknown", "GET"))
|
||||
# (404, 'Not Found')
|
||||
Reference in New Issue
Block a user