关于使用safrs库的生成restful接口的记录

背景信息

最近由于项目须要,本着先后端分离,统一应用接口的构思,须要开发restful接口的api服务器,研究使用的flask开源库safrs在,在处理接口关于URL_PREFIX时遇到了一些问题,通过查看源码,分析验证后对理解进一下整理,方便之后回顾。json

源码我作了一些调整后以下:flask

from safrs import SAFRSJSONEncoder, Api
from flask_swagger_ui import get_swaggerui_blueprint
from app.mods.demo.models import Person, Book, Review, Publisher, User, Role

def init_exts(app,HOST='0.0.0.0',PORT=5000):
    '''
    init asfrs.Api
    Used to support restful api 
    '''
    API_VERSION = 2  
    API_PREFIX = ''
    api  = Api(
            app, 
            api_spec_url = '/api/swagger', #(1)
            host = '{}:{}'.format(HOST,PORT), 
            prefix = API_PREFIX, #(2)
            schemes = [ "http" ], 
            description = description 
        )

    # Set the JSON encoder used for object to json marshalling
    app.json_encoder = SAFRSJSONEncoder
    # Register the API at /api
    swaggerui_blueprint = get_swaggerui_blueprint('/api', '/api/swagger.json')
    app.register_blueprint(swaggerui_blueprint, url_prefix="/api")

    for model in [ Person, Book, Review, Publisher, User, Role] :
        # Create an API endpoint
        api.expose_object(model,url_prefix="/api/v1")



    print ('Starting AIP: http://{}:{}{}'.format(HOST,PORT,API_PREFIX))
    return api

description = '''some description'''

这是如今的样了:后端

     我最初是定义了API_PREFIX,API_VERSION变量,但愿构建成/api/v1/Books这样的API路由,但事与愿违,未能实现目标,也多是我没有太读懂代码,可是通过实验,我经过以上代码,实现了想要的结果,若是用后来的小伙伴们,用更简单的方法,解决了问题,不要忘记告诉我呀!api

现将梳理的内容整理以下:服务器

  1.  Api 的构造参数: api_spce_url ,它指定了swagger.json文件的生成位置。
  2. Api 的构造参数: pre_fix,它指定了api的前缀,会引响swagger.json的位置,而且是叠加在api_spec_url以前。
  3. get_swagger_blueprint(base_url,api_url)中的base_url,决定swaggerui请求资源文件的位置。
  4. get_swagger_blueprint(base_url,api_url)中的api_url,决定了swaggerui请求swagger.json文件的路径。
  5. app.register_blueprint(swaggerui_blueprint,url_prefix)中的url_prefix,会决定swaggerui的工做路径
  6. api.expose_object(model,url_prefix)中的url_prefix会决定api的路由。

 

  •  Api 的构造参数: api_spce_url ,它指定了swagger.json文件的生成位置。

咱们改变一下,这个参数来看一下结果:restful

swaggerui,提示找到到swagger.json文件了,而后咱们看看文件是否是真的存在:app

能够看到文件是存在的,能够得出结论:前后端分离

Api的构造参数: api_spce_url ,它指定了swagger.json文件的生成位置。函数

  •  Api 的构造参数: pre_fix,它指定了api的前缀,会引响swagger.json的位置,而且是叠加在api_spec_url以前。

咱们来看一下,修改构造参数pre_fix后的结果是怎么样的:ui

也是提示找不到swagger.json文件了,我看再看一下,swagger.json文件是否是存在:

能够看到结果,swagger.json文件是存在的,只不过受prefix的引响,路径变成了prefix/api/swagger.json,那么能够出结论:

safrs中Api的构造参数,prefix是会引响api_spec_url的值,而且是叠加在api_spec_url以前。

  • get_swagger_blueprint(base_url,api_url)中的base_url,决定swaggerui请求资源文件的位置。

咱们来改变一下base_url的值,看看结果会怎样?

请求index的资源文件都不见,base_url改变了,index资源文件的的请求位置,咱们看看资源文件是否是还在?

能够看到资源文件其实仍是存在的,只不过存在于/api路径下,而不是/xxx/api路径下,没有资源文件,导到swaggerui没法正常工做了,能够得出结论:

get_swaggerui_blueprint的base_url参数,决定了,swaggerui请求资源文件的位置。

  • get_swagger_blueprint(base_url,api_url)中的api_url,决定了swaggerui,请求swagger.json文件的路径。

咱们来看看,变api_url后会出现什么样的结果?

咱们能够看到,api_url参数修改后,swaggerui的请求swagger.json的路径改变了,咱们再看看swagger.json文件是否是存在。

 

能够看到swagger.json文件是存在的,只是swaggerui请求的路径不对而已。那么咱们能够得出结论:

get_swagger_blueprint(base_url,api_url)中的api_url,决定了swaggerui,请求swagger.json文件的路径。

  • app.register_blueprint(swaggerui_blueprint,url_prefix)中的url_prefix,会决定swaggerui的工做路径

咱们来看看,改成url_prefix后会带来什么样的结果:

/api路由下变成了404,那咱们看看,是否是真的到了/xxx/api下:

由此来看,确实swaggerui也到了xxx/api下,只是由于资源路径没有改,因此不能正常工做。因此获得结果:

url_prefix会改变swaggerui的工做路径。

  • api.expose_object(model,url_prefix)中的url_prefix会决定api的路由。

 咱们看看改成expose_object函数中的url_prefix会带来什么样的结果:

能够看看,此次改变了api的路由,由原来的/api/v1/Books/变成了/xxx/api/v1/Books/。以此看出:

expose_object函数中的url_prefix会决定api的路由

 

总结一下:

  1.  Api 的构造参数: api_spce_url ,它指定了swagger.json文件的生成位置。
  2. Api 的构造参数: pre_fix,它指定了api的前缀,会引响swagger.json的位置,而且是叠加在api_spec_url以前。
  3. get_swagger_blueprint(base_url,api_url)中的base_url,决定swaggerui请求资源文件的位置。
  4. get_swagger_blueprint(base_url,api_url)中的api_url,决定了swaggerui,请求swagger.json文件的路径。
  5. app.register_blueprint(swaggerui_blueprint,url_prefix)中的url_prefix,会决定swaggerui的工做路径
  6. api.expose_object(model,url_prefix)中的url_prefix会决定api的路由。
相关文章
相关标签/搜索