I'm building an API, using Flask and flask-restful and flask-swagger-ui. I have now modified the project structure and now I can no longer access the project's swagger.json file.
Based on the package documentation flask-swagger-ui, you would only need to change the parameter API_URL to the correct path. But even when entering relative path or full path, I can no longer access the file.
My Code:
from flask import Flask, jsonify
from flask_migrate import Migrate
from flask_restful import Api
from flask_swagger_ui import get_swaggerui_blueprint
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
api = Api(app, prefix="/api/v1")
'''swagger specific'''
SWAGGER_URL = '/api/v1/docs'
# API_URL = 'templates/swagger.json'
API_URL = 'app/templates/docs/swagger.json'
SWAGGERUI_BLUEPRINT = get_swaggerui_blueprint(
SWAGGER_URL,
API_URL,
config={
'app_name': "My Rest App"
}
)
app.register_blueprint(SWAGGERUI_BLUEPRINT, url_prefix=SWAGGER_URL)
db.init_app(app)
Migrate(app, db)
return app
My Tree Structure:
├── API
│ ├── app
│ │ ├── __init__.py
│ │ ├── models
│ │ │ ├── __init__.py
│ │ │ ├── db.py
│ │ │ └── db2.py
│ │ ├── routes
│ │ │ ├── __init__.py
│ │ │ ├── resources.py
│ │ └── templates
│ │ └── docs
│ │ └── swagger.json
│ ├── app.db
│ ├── config.py
│ ├── main.py
│ ├── migrations
│ ├── requeriments
│ └── tests
└── README.md
I need help, to understand the problem of the path to the file and thus correct the problem.
By default, Swagger UI is accessible at /q/swagger-ui . The value / is not allowed as it blocks the application from serving anything else. A value prefixed with '/' makes it absolute and not relative. Once your application is started, you can go to http://localhost:8080/q/swagger-ui and play with your API.
I believe that its a restriction on flask's end, but it seems like you must place static files in a folder explicitly named static/
at the root of your flask app.
Try changing
API_URL = 'app/templates/docs/swagger.json'
to
API_URL = '/static/swagger.json'
Then create a static/
folder in API/app/
, and move your json into it. Like so: API/app/static/swagger.json
If that doesn't work, make sure you have the static/
folder in the correct directory, try print(app.root_path)
after defining your flask app variable in order to see what flask considered the root path to be.
We can't provide any custom file path for swagger.json.
But there is one catch which we can do if you require. I was facing the same issue where I need to provide different prefix for swagger URL and swagger.json. If we just want to serve swagger.json file from a different prefix instead of '/static/swagger.json':
Then make changes as below:
APP = Flask(__name__, static_url_path = '/my-prefix/static')
API_URL = '/my-prefix/static/swagger.json'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With