關於使用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的路由。
相關文章
相關標籤/搜索