Python-Flask自动化路由设计思路

作者: 光速度 | 来源:发表于2016-12-16 23:44 被阅读172次

Flask路由,相信大家都会了,官方文档快速入门说得很详细,但这不是本文讲的主题,今天跟大家谈谈如何让路由自动化。
也许大家对Flask的印象就是一个Path路径绑定一个方法,当一个项目有很多Path,绑定N个方法的时候,在一个py文件里堆积太多的方法,很难管理,这时我们希望可以把这些方法分散到多个py文件中,你是不是感觉不知从哪里下手,下面我来跟大家谈一下我的做法。
我们创建一个项目Test
在Test目录下创建一个目录viewcontrol目录,里面创建大量项目需要的视图控制器,比如我创建一个控制器 person.py, 我希望自动化路由可以自动遍历viewcontrol目录,读出所有控制器,并获得所有方法,基于路径来自动创建路由,是不是感觉很难懂,请原谅我的表达能力不好,还是举例吧。

person.py

class person(): 
    def save(self):        
        return "save"

viewcontrol/person.py文件创建了一个类person,名称和文件名相同,这很重要,后面解释为什么要同名

下面我要创建一个自动化路由的类

import os
import importlib
import inspect 
from stat import *
class Route():
    def __init__(self,flask_app,DIR,appName):
        self.__app = flask_app
        self.__Dir = DIR
        self.__appName = appName
        self.viewControlDir = DIR+"/app/" + appName + "/viewcontrol/"
    def build(self):
        self.__make(self.viewControlDir)
    def __make(self,top):
        for f in os.listdir(top):
            pathname = os.path.join(top, f)
            try:
                mode = os.stat(pathname).st_mode
            except PermissionError:
                continue
            else: 
               if S_ISDIR(mode): 
                   try:
                        self.__make(pathname) 
                   except PermissionError:
                        continue
                elif S_ISREG(mode):
                    self.url(pathname,f.replace(".py",""))
                else:
                    pass
    def url(self,pathname,name):
        moduleStr = pathname.replace(self.__Dir+"/","").replace(".py","").replace("/",".")
        moduleObj = importlib.import_module(moduleStr)
        for classStr in dir(moduleObj):
            if not classStr.startswith("__") and classStr.lower()==name.lower():
                classObj = getattr(moduleObj, classStr)
                # load= getattr(obj, "Load")
                # inspect.getargspec(load) #获得方法参数
                obj = classObj()
                urlPath = pathname.replace(self.__Dir,"").replace("/app/"+self.__appName+"/viewcontrol","").replace(".py","").lower()
                for methodName in dir(classObj):
                    if not methodName.startswith("__"):
                        self.__app.add_url_rule(urlPath+"/"+methodName.lower(), endpoint=urlPath.replace("/","-")+"-"+methodName, view_func=getattr(obj, methodName),methods=["GET","POST"])

大概思路是遍历viewcontrol目录,根据目录文件,自动生成路由,关键是 url方法,动态加载模块,动态获得类方法,最后通过 add_url_urle方法创建路由。
在入口程序中,调用

Route(application,Dir,"e2").build()

即可自动遍历viewcontrol目录的所有类方法,绑定一个对应的path路径,如person的save方法,好可绑定了路径 http://ip:port/person/save

这样我就可以根据业务在viewcontrol里创建不同的py文件,根据功能创建不同的方法,而不需要考虑增加一个功能需要在入口程序再手工增加对应方法这么麻烦了。

相关文章

  • Python-Flask自动化路由设计思路

    Flask路由,相信大家都会了,官方文档快速入门说得很详细,但这不是本文讲的主题,今天跟大家谈谈如何让路由自动化。...

  • Python学习

    python-flask框架学习(二) 1、回顾Flask 2、Flask route路由 2.1、静态路由 ap...

  • 手撸博客3 文章列表及文章

    1 设计思路 1.1 路由设计 /article路由到文章列表页面/article/aid路由到具体的文章页面 1...

  • iOS组件化-路由设计思路

    https://xiaozhuanlan.com/topic/1537824960 iOS开发路由设计思路

  • iOS路由设计思路

    前言 iOS解耦方案大部分是通过路由,由此出现了各种不同的路由设计。在看过一些路由设计后,笔者对路由引发了一些思考...

  • Python-Flask① | 路由规划

    简单的一阶程度拆分: 注解:Manager启动会导入create_app,导入会进行创建初始化app,初始化时会导...

  • URLRoute ->Protocol-class -&g

    经过上面的分析,可以发现,路由的设计思路是从URLRoute ->Protocol-class ->Target-...

  • Python selenium:模型(框架)

    自动化测试模型 自动化测试模型可以看作自动化测试框架与工具的设计思路,自动化不仅仅是单纯的写脚本运行就可以了,还需...

  • IOS框架设计思路:路由

    原创:知识点总结性文章创作不易,请珍惜,之后会持续更新,不断完善个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈...

  • Koa实战-鉴权

    课程目标 @掌握Koa基本用法 @理解Koa设计思路 @路由 @静态文件服务 @模板引擎 koa 概述:ko...

网友评论

    本文标题:Python-Flask自动化路由设计思路

    本文链接:https://www.haomeiwen.com/subject/licomttx.html