当前位置:网站首页>Routing decorator of tornado project
Routing decorator of tornado project
2022-07-04 07:15:00 【youhebuke225】
With The current project As an example , Code
- When we start the project , The first thing you need is to register routes , So we can define a method , This method is called
get_handlers
, To get the route of the whole project - But how to represent a class as a route ? This is the time , We used decorators
open_handler
, The class decorated by this decorator , Then he is a route , thereforeopen_handler
There are at least two parameterspath
routeindex
Used for routing sorting
Decorator
We're in the catalog tornado project core\decorators\open_handler
Write down a decorator , Class as decorator Click on
class HandlerDecorate:
""" Route decorator 1. In essence, the route decorator just adds __url_path__ Properties of 2. When we initialize, we pass __url_path__ This attribute determines whether the current class is the routing processor 3. __url_path_index__ Used to sort routes """
def __init__(self, path, index=None) -> None:
self.__url_path__ = path
self.__url_path_index__ = index
def __call__(self, cls):
cls.__url_path__ = self.__url_path__
cls.__url_path_index__ = self.__url_path_index__
return cls
We are __init__.py
Expose this decorator
from core.decorators.open_handler.index import HandlerDecorate
open_handler = HandlerDecorate
Just go through @open_hander
Modified class , Will contain __url_paht__
attribute , Such as
@open_handler(path="/api/(.*)", index=1)
class openApiHandlerService(RequestHandler):
def get(self, *args, **kwargs):
self.write("hello world")
self.finish()
that ,openApiHandlerService Will contain __url_paht__
The attribute is /api/(.*)
Collection of routes
Definition get_handlers
Method , To get the class decorated by the decorator
Traverse the project file
We need to define a function to traverse the project file , The current function is used to find the items that are
open_handler
Modified class
We are core\utils\module_utils.py
Next , Create a new function , Used to traverse to get all the module
import importlib
import pkgutil
import os
def get_all_modules(path, file_name):
""" Get all under the path file_name Of module """
# Get the configuration of the directory ( The directory must be a package , Just can have __path__ attribute )
_app = importlib.import_module(path)
def get_all_moudules_name(package_path, prefix=""):
# For deep traversal of folders
for loader, name, is_package in pkgutil.iter_modules([package_path]):
if is_package:
# If it's still a bag , Then traverse again , And prefix it when traversing
for _name in get_all_moudules_name(os.path.join(package_path, name), prefix=f"{
name}."):
yield prefix + _name
else:
yield prefix + name
return [
importlib.import_module(f"{
path}.{
module_name}")
for module_name in get_all_moudules_name(_app.__path__[0])
if module_name.split(".")[-1][:len(file_name)] == file_name
]
- import_module Click on , Get the function in the module 、 Properties, etc
- iter_modules Click on , Get module
To regulate , All the classes defined by our route are handlers
In the file of
Get all routes under the project
We are core\decorators\open_handler
So let's make a new one OpenHandler
Class , And define a get_handlers
Method is used to get all routes
class OpenHandler:
""" Routing container 1. Get the container class and tool class of the route during initialization 2. return tornado The routing list """
def __init__(self, source_libs) -> None:
self.source_libs = source_libs # Pass the directory name , Used to get all classes using decorators in the directory
self.handler_libs = [] # Container for storing routes
def get_handlers(self):
self._handler_libs_ = []
_modules = [] # All the moudule Containers
for _path in self.source_libs:
_modules += get_all_modules(_path, "handler")
for _module in _modules:
self.handler_libs += [
dict(
path=_member.__url_path__,
handler=f"{
_member.__module__}.{
_member.__name__}",
index = _member.__url_path_index__
)
for _name,_member in inspect.getmembers(_module, inspect.isclass)
if hasattr(_member, "__url_path__")
]
# Sort
self.handler_libs.sort(key=lambda x: x['index'])
# Generate tornado The routing object of
_result = []
for _handler_lib in self.handler_libs:
# Traversal generation tornado The routing object of
_path = _handler_lib.get("path")
_result.append(
url(_path, import_object(_handler_lib.get("handler"))))
# All routing lists
return _result
Registered routing
Generally, we need to register the route when starting the project
obtain handler All routes under
For the purpose of project specification, we have registered all routes under the name
handler
Under folder , When starting the environment , We usually callEnvironment
Class , We areEnvironment
Next , Write a get handler Routing method under
class Environment:
...
def get_all_handlers(self):
open_handler = OpenHandler(["core"])
return open_handler.get_handlers()
What he said is to get core
All routes under the folder , Then we register the route
class Application(Application):
def __init__(self):
# Initialize database 、redis etc. , When the project starts , Do not introduce model classes
# Registered routing
handlers = environment.get_all_handlers()
# Add dynamic routing
super().__init__(handlers, **config.settings)
test
- Start project , We type in
http://localhost:8888/api/
, We will find that we can access the registered route
边栏推荐
- Centos8 install mysql 7 unable to start up
- MySQL storage engine
- Tar source code analysis Part 10
- Introduction to spark core components
- Chain ide -- the infrastructure of the metauniverse
- Cell reports: Wei Fuwen group of the Institute of zoology, Chinese Academy of Sciences analyzes the function of seasonal changes in the intestinal flora of giant pandas
- [Valentine's day] - you can change your love and write down your lover's name
- Selection (023) - what are the three stages of event propagation?
- MySQL 45 lecture learning notes (XIII) delete half of the table data, and the table file size remains the same
- The final week, I split
猜你喜欢
两年前美国芯片扭捏着不卖芯片,如今芯片堆积如山祈求中国帮忙
Introduction to deep learning Ann neural network parameter optimization problem (SGD, momentum, adagrad, rmsprop, Adam)
leetcode825. Age appropriate friends
Computer connects raspberry pie remotely through putty
How notepad++ counts words
Valentine's Day is coming! Without 50W bride price, my girlfriend was forcibly dragged away...
Chain ide -- the infrastructure of the metauniverse
Status of the thread
用于压缩视频感知增强的多目标网络自适应时空融合
[web security] nodejs prototype chain pollution analysis
随机推荐
Download address of the official website of national economic industry classification gb/t 4754-2017
Status of the thread
notepad++如何统计单词数量
Selection (021) - what is the output of the following code?
2022-021ARTS:下半年開始
Zhanrui tankbang | jointly build, cooperate and win-win zhanrui core ecology
Boosting the Performance of Video Compression Artifact Reduction with Reference Frame Proposals and
Cell reports: Wei Fuwen group of the Institute of zoology, Chinese Academy of Sciences analyzes the function of seasonal changes in the intestinal flora of giant pandas
响应式移动Web测试题
About how idea sets up shortcut key sets
[FreeRTOS] FreeRTOS learning notes (7) - handwritten FreeRTOS two-way linked list / source code analysis
Design of test cases
The number of patent applications in China has again surpassed that of the United States and Japan, ranking first in the world for 11 consecutive years
What is the use of cloud redis? How to use cloud redis?
Summary of MySQL common judgment functions!! Have you used it
Tar source code analysis Part 10
Paddleocr prompt error: can not import AVX core while this file exists: xxx\paddle\fluid\core_ avx
果果带你写链表,小学生看了都说好
Knowledge payment applet dream vending machine V2
两年前美国芯片扭捏着不卖芯片,如今芯片堆积如山祈求中国帮忙