最近由於項目須要,本着先後端分離,統一應用接口的構思,須要開發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
現將梳理的內容整理以下:服務器
咱們改變一下,這個參數來看一下結果:restful
swaggerui,提示找到到swagger.json文件了,而後咱們看看文件是否是真的存在:app
能夠看到文件是存在的,能夠得出結論:前後端分離
Api的構造參數: api_spce_url ,它指定了swagger.json文件的生成位置。函數
咱們來看一下,修改構造參數pre_fix後的結果是怎麼樣的:ui
也是提示找不到swagger.json文件了,我看再看一下,swagger.json文件是否是存在:
能夠看到結果,swagger.json文件是存在的,只不過受prefix的引響,路徑變成了prefix/api/swagger.json,那麼能夠出結論:
safrs中Api的構造參數,prefix是會引響api_spec_url的值,而且是疊加在api_spec_url以前。
咱們來改變一下base_url的值,看看結果會怎樣?
請求index的資源文件都不見,base_url改變了,index資源文件的的請求位置,咱們看看資源文件是否是還在?
能夠看到資源文件其實仍是存在的,只不過存在於/api路徑下,而不是/xxx/api路徑下,沒有資源文件,導到swaggerui沒法正常工做了,能夠得出結論:
get_swaggerui_blueprint的base_url參數,決定了,swaggerui請求資源文件的位置。
咱們來看看,變api_url後會出現什麼樣的結果?
咱們能夠看到,api_url參數修改後,swaggerui的請求swagger.json的路徑改變了,咱們再看看swagger.json文件是否是存在。
能夠看到swagger.json文件是存在的,只是swaggerui請求的路徑不對而已。那麼咱們能夠得出結論:
get_swagger_blueprint(base_url,api_url)中的api_url,決定了swaggerui,請求swagger.json文件的路徑。
咱們來看看,改成url_prefix後會帶來什麼樣的結果:
/api路由下變成了404,那咱們看看,是否是真的到了/xxx/api下:
由此來看,確實swaggerui也到了xxx/api下,只是由於資源路徑沒有改,因此不能正常工做。因此獲得結果:
url_prefix會改變swaggerui的工做路徑。
咱們看看改成expose_object函數中的url_prefix會帶來什麼樣的結果:
能夠看看,此次改變了api的路由,由原來的/api/v1/Books/變成了/xxx/api/v1/Books/。以此看出:
expose_object函數中的url_prefix會決定api的路由
總結一下: