Skip to content

Commit 25378b4

Browse files
committed
feat(jwt): add lecture on how JWTs are used
1 parent 59025cb commit 25378b4

File tree

371 files changed

+220
-172
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

371 files changed

+220
-172
lines changed
Lines changed: 72 additions & 0 deletions

docs/docs/08_flask_jwt_extended/05_registering_users_rest_api/README.md renamed to docs/docs/08_flask_jwt_extended/06_registering_users_rest_api/README.md

Lines changed: 2 additions & 4 deletions

docs/docs/08_flask_jwt_extended/05_registering_users_rest_api/end/resources/user.py renamed to docs/docs/08_flask_jwt_extended/06_registering_users_rest_api/end/resources/user.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,12 @@ class User(MethodView):
3636
when we are manipulating data regarding the users.
3737
"""
3838

39-
@classmethod
4039
@blp.response(200, UserSchema)
41-
def get(cls, user_id: int):
40+
def get(self, user_id):
4241
user = UserModel.query.get_or_404(user_id)
4342
return user
4443

45-
@classmethod
46-
def delete(cls, user_id: int):
44+
def delete(self, user_id):
4745
user = UserModel.query.get_or_404(user_id)
4846
db.session.delete(user)
4947
db.session.commit()
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,12 @@ class User(MethodView):
5252
when we are manipulating data regarding the users.
5353
"""
5454

55-
@classmethod
5655
@blp.response(200, UserSchema)
57-
def get(cls, user_id: int):
56+
def get(self, user_id):
5857
user = UserModel.query.get_or_404(user_id)
5958
return user
6059

61-
@classmethod
62-
def delete(cls, user_id: int):
60+
def delete(self, user_id):
6361
user = UserModel.query.get_or_404(user_id)
6462
db.session.delete(user)
6563
db.session.commit()

docs/docs/08_flask_jwt_extended/06_login_users_rest_api/start/resources/user.py renamed to docs/docs/08_flask_jwt_extended/07_login_users_rest_api/start/resources/user.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,12 @@ class User(MethodView):
3636
when we are manipulating data regarding the users.
3737
"""
3838

39-
@classmethod
4039
@blp.response(200, UserSchema)
41-
def get(cls, user_id: int):
40+
def get(self, user_id):
4241
user = UserModel.query.get_or_404(user_id)
4342
return user
4443

45-
@classmethod
46-
def delete(cls, user_id: int):
44+
def delete(self, user_id):
4745
user = UserModel.query.get_or_404(user_id)
4846
db.session.delete(user)
4947
db.session.commit()

docs/docs/08_flask_jwt_extended/08_jwt_claims_and_authorization/start/resources/user.py

Lines changed: 0 additions & 66 deletions
This file was deleted.

docs/docs/08_flask_jwt_extended/07_protect_resources_with_jwt_required/start/resources/user.py renamed to docs/docs/08_flask_jwt_extended/08_protect_resources_with_jwt_required/end/resources/user.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,12 @@ class User(MethodView):
5252
when we are manipulating data regarding the users.
5353
"""
5454

55-
@classmethod
5655
@blp.response(200, UserSchema)
57-
def get(cls, user_id: int):
56+
def get(self, user_id):
5857
user = UserModel.query.get_or_404(user_id)
5958
return user
6059

61-
@classmethod
62-
def delete(cls, user_id: int):
60+
def delete(self, user_id):
6361
user = UserModel.query.get_or_404(user_id)
6462
db.session.delete(user)
6563
db.session.commit()

docs/docs/08_flask_jwt_extended/06_login_users_rest_api/end/resources/user.py renamed to docs/docs/08_flask_jwt_extended/08_protect_resources_with_jwt_required/start/resources/user.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,12 @@ class User(MethodView):
5252
when we are manipulating data regarding the users.
5353
"""
5454

55-
@classmethod
5655
@blp.response(200, UserSchema)
57-
def get(cls, user_id: int):
56+
def get(self, user_id):
5857
user = UserModel.query.get_or_404(user_id)
5958
return user
6059

61-
@classmethod
62-
def delete(cls, user_id: int):
60+
def delete(self, user_id):
6361
user = UserModel.query.get_or_404(user_id)
6462
db.session.delete(user)
6563
db.session.commit()

docs/docs/08_flask_jwt_extended/08_jwt_claims_and_authorization/end/resources/user.py renamed to docs/docs/08_flask_jwt_extended/09_jwt_claims_and_authorization/end/resources/user.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,12 @@ class User(MethodView):
5252
when we are manipulating data regarding the users.
5353
"""
5454

55-
@classmethod
5655
@blp.response(200, UserSchema)
57-
def get(cls, user_id: int):
56+
def get(self, user_id):
5857
user = UserModel.query.get_or_404(user_id)
5958
return user
6059

61-
@classmethod
62-
def delete(cls, user_id: int):
60+
def delete(self, user_id):
6361
user = UserModel.query.get_or_404(user_id)
6462
db.session.delete(user)
6563
db.session.commit()
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from flask.views import MethodView
2+
from flask_smorest import Blueprint, abort
3+
from flask_jwt_extended import create_access_token
4+
from passlib.hash import pbkdf2_sha256
5+
6+
from db import db
7+
from models import UserModel
8+
from schemas import UserSchema
9+
10+
11+
blp = Blueprint("Users", "users", description="Operations on users")
12+
13+
14+
@blp.route("/register")
15+
class UserRegister(MethodView):
16+
@blp.arguments(UserSchema)
17+
def post(self, user_data):
18+
if UserModel.query.filter(UserModel.username == user_data["username"]).first():
19+
abort(409, message="A user with that username already exists.")
20+
21+
user = UserModel(
22+
username=user_data["username"],
23+
password=pbkdf2_sha256.hash(user_data["password"]),
24+
)
25+
db.session.add(user)
26+
db.session.commit()
27+
28+
return {"message": "User created successfully."}, 201
29+
30+
31+
@blp.route("/login")
32+
class UserLogin(MethodView):
33+
@blp.arguments(UserSchema)
34+
def post(self, user_data):
35+
user = UserModel.query.filter(
36+
UserModel.username == user_data["username"]
37+
).first()
38+
39+
if user and pbkdf2_sha256.verify(user_data["password"], user.password):
40+
access_token = create_access_token(identity=user.id)
41+
return {"access_token": access_token}, 200
42+
43+
abort(401, message="Invalid credentials.")
44+
45+
46+
@blp.route("/user/<int:user_id>")
47+
class User(MethodView):
48+
"""
49+
This resource can be useful when testing our Flask app.
50+
We may not want to expose it to public users, but for the
51+
sake of demonstration in this course, it can be useful
52+
when we are manipulating data regarding the users.
53+
"""
54+
55+
@blp.response(200, UserSchema)
56+
def get(self, user_id):
57+
user = UserModel.query.get_or_404(user_id)
58+
return user
59+
60+
def delete(self, user_id):
61+
user = UserModel.query.get_or_404(user_id)
62+
db.session.delete(user)
63+
db.session.commit()
64+
return {"message": "User deleted."}, 200

docs/docs/08_flask_jwt_extended/09_logout_users_rest_api/start/resources/user.py

Lines changed: 0 additions & 66 deletions
This file was deleted.

0 commit comments

Comments
 (0)