Skip to content

Commit adba9a2

Browse files
author
Vladimir Volkov
committed
apidocs html render
1 parent 43a1b6d commit adba9a2

File tree

5 files changed

+84
-8
lines changed

5 files changed

+84
-8
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,4 @@ if __name__ == '__main__':
121121
uvicorn.run(app, port=8080)
122122
```
123123

124-
Open [http://localhost:8080/apidocs.json](http://localhost:8080/apidocs.json) to view generated openapi schema.
124+
Open [http://localhost:8080/apidocs](http://localhost:8080/apidocs) to view generated openapi schema.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def get_packages(package):
3030
'apispec<4',
3131
'python-multipart'
3232
],
33-
version='0.0.16',
33+
version='0.0.17',
3434
url='https://github.com/slv0/start_resty',
3535
license='BSD',
3636
description='The web framework',

star_resty/apidocs/setup.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
from apispec.ext.marshmallow import MarshmallowPlugin
66
from starlette.applications import Starlette
77
from starlette.requests import Request
8-
from starlette.responses import JSONResponse
8+
from starlette.responses import JSONResponse, HTMLResponse
99

1010
from .route import setup_routes
11-
from .utils import resolve_schema_name
11+
from .utils import resolve_schema_name, apispec_json_to_html
1212

1313
logger = logging.getLogger(__name__)
1414

@@ -20,8 +20,9 @@ def setup_spec(app: Starlette, title: str,
2020
openapi_version='2.0',
2121
schemes=None,
2222
base_path='/',
23-
route: str = '/apidocs.json',
23+
route: str = '/apidocs',
2424
add_head_methods: bool = False,
25+
render_to_html: bool = True,
2526
options: Optional[Mapping] = None,
2627
**kwargs):
2728
if options is None:
@@ -46,8 +47,10 @@ def generate_api_docs(_: Request):
4647
setup_routes(app.routes, spec, version=get_open_api_version(openapi_version)
4748
, add_head_methods=add_head_methods)
4849
api_spec = spec.to_dict()
49-
50-
return JSONResponse(api_spec)
50+
if render_to_html:
51+
return HTMLResponse(apispec_json_to_html(api_spec))
52+
else:
53+
return JSONResponse(api_spec)
5154

5255

5356
def get_open_api_version(version: str) -> int:

star_resty/apidocs/template.html

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<!--<script src="https://gist.github.com/oseiskar/dbd51a3727fc96dcf5ed189fca491fb3.js"></script>-->
2+
<!DOCTYPE html>
3+
<html lang="en">
4+
<head>
5+
<meta charset="UTF-8">
6+
<title>Swagger UI</title>
7+
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700" rel="stylesheet">
8+
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.24.2/swagger-ui.css" >
9+
<style>
10+
html
11+
{
12+
box-sizing: border-box;
13+
overflow: -moz-scrollbars-vertical;
14+
overflow-y: scroll;
15+
}
16+
*,
17+
*:before,
18+
*:after
19+
{
20+
box-sizing: inherit;
21+
}
22+
23+
body {
24+
margin:0;
25+
background: #fafafa;
26+
}
27+
</style>
28+
</head>
29+
<body>
30+
31+
<div id="swagger-ui"></div>
32+
33+
<script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.24.2/swagger-ui-bundle.js"> </script>
34+
<script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.24.2/swagger-ui-standalone-preset.js"> </script>
35+
<script>
36+
window.onload = function() {
37+
38+
var spec = %s;
39+
40+
// Build a system
41+
const ui = SwaggerUIBundle({
42+
spec: spec,
43+
dom_id: '#swagger-ui',
44+
deepLinking: true,
45+
presets: [
46+
SwaggerUIBundle.presets.apis,
47+
SwaggerUIStandalonePreset
48+
],
49+
plugins: [
50+
SwaggerUIBundle.plugins.DownloadUrl
51+
],
52+
layout: "StandaloneLayout"
53+
})
54+
55+
window.ui = ui
56+
var elements = document.getElementsByClassName("download-url-wrapper");
57+
while(elements.length > 0){
58+
elements[0].parentNode.removeChild(elements[0]);
59+
}
60+
61+
}
62+
</script>
63+
</body>
64+
65+
</html>

star_resty/apidocs/utils.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import inspect
2+
import os
23
import re
4+
import json
35
from typing import Any
46

5-
__all__ = ('resolve_schema_name', 'convert_path')
7+
__all__ = ('resolve_schema_name', 'convert_path', 'apispec_json_to_html')
68

79

810
def resolve_schema_name(schema: Any) -> str:
@@ -17,3 +19,9 @@ def resolve_schema_name(schema: Any) -> str:
1719

1820
def convert_path(path: str) -> str:
1921
return re.sub(r'{([^:]+).*}', r'{\1}', path)
22+
23+
24+
def apispec_json_to_html(apispec_json: dict) -> str:
25+
template_path = os.path.join(os.path.dirname(__file__), 'template.html')
26+
template = open(template_path, 'r').read()
27+
return template % json.dumps(apispec_json)

0 commit comments

Comments
 (0)