Skip to content

Commit 60d5463

Browse files
committed
add swageer to UserResource
1 parent ea38659 commit 60d5463

File tree

5 files changed

+101
-11
lines changed

5 files changed

+101
-11
lines changed

api/__init__.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,43 @@
88
from flask_httpauth import HTTPBasicAuth
99
from flask_httpauth import HTTPTokenAuth
1010
from flask_httpauth import MultiAuth
11+
from flasgger import Swagger
12+
from apispec import APISpec
13+
from apispec.ext.marshmallow import MarshmallowPlugin
14+
from flask_apispec.extension import FlaskApiSpec
1115

1216

1317
app = Flask(__name__)
1418
app.config.from_object(Config)
1519

20+
security_definitions = {
21+
"basicAuth": {
22+
"type": "basic"
23+
}
24+
}
25+
app.config.update({
26+
'APISPEC_SPEC': APISpec(
27+
title='Notes Project',
28+
version='v1',
29+
plugins=[MarshmallowPlugin()],
30+
securityDefinitions=security_definitions,
31+
securitu=[],
32+
openapi_version='2.0.0'
33+
),
34+
'APISPEC_SWAGGER_URL': '/swagger', # URI API Doc JSON
35+
'APISPEC_SWAGGER_UI_URL': '/swagger-ui'# URI UI of API Doc
36+
})
37+
38+
1639
api = Api(app)
1740
db = SQLAlchemy(app)
1841
migrate = Migrate(app, db)
1942
ma = Marshmallow(app)
2043
basic_auth = HTTPBasicAuth()
2144
token_auth = HTTPTokenAuth('Bearer')
2245
auth = MultiAuth(basic_auth, token_auth)
23-
46+
swagger = Swagger(app)
47+
docs = FlaskApiSpec(app)
2448

2549
@token_auth.verify_token
2650
def verify_token(token):

api/resources/user.py

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,55 @@
11
from api import Resource, abort, reqparse, auth, db
22
from api.models.user import UserModel
3-
from api.schemas.user import user_schema, users_schema
3+
from api.schemas.user import user_schema, users_schema
4+
from api.schemas.user import UserSchema, UserRequestSchema
5+
from flask_apispec.views import MethodResource
6+
from flask_apispec import marshal_with, use_kwargs, doc
47

58

6-
class UserResource(Resource):
9+
@doc(description='Api for notes.', tags=['Users'])
10+
class UserResource(MethodResource):
11+
@marshal_with(UserSchema, code=200)
712
def get(self, user_id):
13+
# language=YAML
14+
"""
15+
Get User by id
16+
---
17+
tags:
18+
- User
19+
"""
820
user = UserModel.query.get(user_id)
921
if user is None:
1022
abort(404, error=f"User with id={user_id} not found")
1123
return user_schema.dump(user), 200
1224

1325
@auth.login_required(role="admin")
1426
def put(self, user_id):
27+
# language = YAML
28+
"""
29+
Get User by id
30+
---
31+
tags:
32+
- Users
33+
parameters:
34+
- in: path
35+
name: user_id
36+
type: integer
37+
required: true
38+
default: 1
39+
responses:
40+
200:
41+
description: A single user item
42+
schema:
43+
id: User
44+
properties:
45+
id:
46+
type: integer
47+
username:
48+
type: string
49+
is_staff:
50+
type: boolean
51+
52+
"""
1553
parser = reqparse.RequestParser()
1654
parser.add_argument("username", required=True)
1755
user_data = parser.parse_args()
@@ -31,17 +69,19 @@ def delete(self, user_id):
3169
return "", 204
3270

3371

34-
class UsersListResource(Resource):
72+
class UsersListResource(MethodResource):
73+
@marshal_with(UserSchema(many=True), code=200)
3574
def get(self):
3675
users = UserModel.query.all()
3776
return users_schema.dump(users), 200
3877

39-
def post(self):
40-
parser = reqparse.RequestParser()
41-
parser.add_argument("username", required=True)
42-
parser.add_argument("password", required=True)
43-
user_data = parser.parse_args()
44-
user = UserModel(**user_data)
78+
@use_kwargs(UserRequestSchema, location='json')
79+
def post(self, **kwargs):
80+
# parser = reqparse.RequestParser()
81+
# parser.add_argument("username", required=True)
82+
# parser.add_argument("password", required=True)
83+
# user_data = parser.parse_args()
84+
user = UserModel(**kwargs)
4585
user.save()
4686
if not user.id:
4787
abort(400, error=f"User with username:{user.username} already exist")

api/schemas/user.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,13 @@ class Meta:
1313
fields = ('id', 'username', "is_staff")
1414

1515

16+
class UserRequestSchema(ma.SQLAlchemySchema):
17+
class Meta:
18+
model = UserModel
19+
20+
username = ma.Str()
21+
password = ma.Str()
22+
23+
1624
user_schema = UserSchema()
1725
users_schema = UserSchema(many=True)

app.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
from api import api, app
1+
from api import api, app, docs
22
from api.resources.note import NoteResource, NotesListResource
33
from api.resources.user import UserResource, UsersListResource
44
from api.resources.auth import TokenResource
55
from config import Config
66

7+
8+
79
# CRUD
810

911
# Create --> POST
@@ -24,6 +26,8 @@
2426
api.add_resource(NoteResource,
2527
'/notes/<int:note_id>', # GET, PUT, DELETE
2628
)
29+
docs.register(UserResource)
30+
docs.register(UsersListResource)
2731

2832
if __name__ == '__main__':
2933
app.run(debug=Config.DEBUG, port=Config.PORT)

requirements.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
alembic==1.8.1
22
aniso8601==9.0.1
3+
apispec==5.2.2
34
asttokens==2.0.8
5+
attrs==22.1.0
46
backcall==0.2.0
57
click==8.1.3
68
decorator==5.1.1
79
executing==1.0.0
10+
flasgger==0.9.5
811
Flask==2.2.2
12+
flask-apispec==0.11.4
913
Flask-HTTPAuth==4.7.0
1014
flask-marshmallow==0.14.0
1115
Flask-Migrate==3.1.0
@@ -14,31 +18,41 @@ Flask-SQLAlchemy==2.5.1
1418
greenlet==1.1.3
1519
gunicorn==20.1.0
1620
importlib-metadata==4.12.0
21+
iniconfig==1.1.1
1722
ipython==8.1.0
1823
itsdangerous==2.1.2
1924
jedi==0.18.1
2025
Jinja2==3.1.2
26+
jsonschema==4.16.0
2127
Mako==1.2.2
2228
MarkupSafe==2.1.1
2329
marshmallow==3.18.0
2430
marshmallow-sqlalchemy==0.24.2
2531
matplotlib-inline==0.1.6
32+
mistune==2.0.4
2633
packaging==21.3
2734
parso==0.8.3
2835
passlib==1.7.4
2936
pexpect==4.8.0
3037
pickleshare==0.7.5
38+
pluggy==1.0.0
3139
prompt-toolkit==3.0.31
3240
psycopg2-binary==2.9.3
3341
ptyprocess==0.7.0
3442
pure-eval==0.2.2
43+
py==1.11.0
3544
Pygments==2.13.0
3645
pyparsing==3.0.9
46+
pyrsistent==0.18.1
47+
pytest==7.1.3
3748
pytz==2022.2.1
49+
PyYAML==6.0
3850
six==1.16.0
3951
SQLAlchemy==1.4.41
4052
stack-data==0.5.0
53+
tomli==2.0.1
4154
traitlets==5.4.0
4255
wcwidth==0.2.5
56+
webargs==8.2.0
4357
Werkzeug==2.2.2
4458
zipp==3.8.1

0 commit comments

Comments
 (0)