# APIForTornado **Repository Path**: vzfearless/APIForTornado ## Basic Information - **Project Name**: APIForTornado - **Description**: No description available - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-08 - **Last Updated**: 2021-03-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # APIForTornado使用文档 ### interceptor > ```interceptor```用于在访问某个api之前做的一些拦截处理,例如登录拦截、权限拦截、表单校验拦截等。 **1.interceptor配置** 使用拦截器之前,需要在根目录是setting.py文件中配置拦截器,如下示例代码。 ``` Python settings = { "inters" : [ { "handle":[ ], "clear":[ r"/aaa/q", r"/bbb/d", r"/ccc/.*" ], "inter":AuthInterceptor }, { "handle":[ r"/user.*", ], "clear":[], "inter":LoginInterceptor } ] # 其他配置 } ``` 所有拦截器配置一于setting的inters字段中,每一个拦截器都有handle、clear、inter。 ```handle```:需要拦截的请求路径,为空时默认**拦截所有**,支持正则表达式 ```clear```:需要清除拦截的请求路径,支持正则表达式 ```inter```:拦截器类 > 注意:handle和clear只能选其中之一,同时配置的情况下只生效handle **2.interceptor的使用** * 拦截器类需要编写在```/interceptor/拦截模块1/.../拦截模块n/XxxInterceptor```中 * 需要导入```from interceptor.BaseInterceptor import BaseInterceptor```基本拦截器类 * ```XxxInterceptor```需要继承```BaseInterceptor```类,并重写```def invoke(self,req:tornado.web.RequestHandler)```方法,该方法需要一个布尔值的返回。如果返回``True``表示放行此次请求,如果返回```False```表示结束此次请求,不再执行后续的函数。 * **invoke**函数中的**req**对象是tornado的请求处理器,可以用来给用户写入数据,例如: ```req.write({"state":"needLogin","msg":"未登录"})```,请注意不要主动地调用``req.finish()``方法来结束请求,在invoke内返回False即可。 **3.interceptor模板使用示例代码** ``` Python #coding=utf-8 import tornado.web.RequestHandler as RequestHandler from interceptor.BaseInterceptor import BaseInterceptor # 继承BaseInterceptor类 class LoginInterceptor(BaseInterceptor): # 重写invoke函数 def invoke(self,req:RequestHandler): # 放行返回True,结束请求返回False return True ``` ### handler > handler用于处理并响应用户的请求 **1.handler的配置** 使用handler之前需要在setting.py文件中进行urls的配置,表示将指定的url交给指定的hanlder来处理,url支持正则表达式匹配。如下示例代码: ``` Python from handler.IndexHandler import IndexHandler from handler.UserHandler import UserInfo urls = [ (r"/", IndexHandler), (r"/user.*", UserInfo), ] ``` **2.handler的使用** * handler类需要编写在```/handler/业务模块1/.../业务模块n/XxxHandler```中 * 需要导入```from handler.BaseHandler import BaseHandler```基本处理器类 * 同时重写```get```或```post```方法,与tornado框架用法一致 **3.模板使用示例代码** ``` python #coding=utf-8 from handler.BaseHandler import BaseHandler # 继承BaseHandler class UserInfo(BaseHandler): # 重写get函数 def get(self): self.finish("this is my info by get") # 重写post函数 def post(self): self.finish("this is my info by post") ``` ### model > model是Python对象与数据库表的一种映射,本框架中整合了SQLAlchemy。 **1.数据库连接的配置** 使用SQLAlchemy来访问数据库之前需要在setting.py文件中进行数据库连接的配置,如果要连接mysql数据库需要安装pymysql类库,配置代码如下: ``` dbsetting = { # 这里以sqllite为例 "sqlurl":'sqlite:///foo.db', # 连接池、超时时间、数据库账号密码等其他配置 } engine = create_engine(dbsetting['sqlurl']) # 创建好engine之后,将该对象加载至tornado全局配置中 settings = { "engine":engine, } ``` **2.操作数据库的方法** * 在handler的get或post方法中,使用```self.session```来获取到SQLAlchemy的session对象,用于操作数据库。 * 操作相应的数据表时需要导入相应的Python类 * 如果进行了非查询的操作**需要**手动调用```session.commit()```方法来提交事务 * 请求完成之后**不需要**手动调用```session.close()```方法(需要在basehandler中的onfinish配置) **3.示例代码** 访问示例代码 ``` #coding=utf-8 from handler.BaseHandler import BaseHandler from models.UserModel import User class UserInfo(BaseHandler): def get(self): res = self.session.query(User).first() print(res.__dict__) self.write("Hello, UserInfo,{}".format(res.__dict__)) ``` model类代码 ``` from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(20)) fullname = Column(String(32)) password = Column(String(32)) ``` > 关于SQLAlchemy的使用方法需要自行参考SQLAlchemy的官方文档 ---