@@ -5,13 +5,14 @@ views, create a subclass for the desired controller as well as a subclass for
55its corresponding serializer. Here\' s an example :
66
77!!! info
8- if you are interested in Asynchronous version of the class, checkout ` AsyncNinjaJWTDefaultController ` and ` AsyncNinjaJWTSlidingController `
8+ if you are interested in Asynchronous version of the class, use ` AsyncNinjaJWTDefaultController ` and ` AsyncNinjaJWTSlidingController ` .
9+ Also note, it's only available for Django versions that supports asynchronous actions.
910
1011``` python
11- from ninja_jwt.schema import TokenObtainPairSerializer
12+ from ninja_jwt.schema import TokenObtainPairInputSchema
1213from ninja_jwt.controller import TokenObtainPairController
1314from ninja_extra import api_controller, route
14- from ninja_schema import Schema
15+ from ninja import Schema
1516
1617
1718class UserSchema (Schema ):
@@ -25,12 +26,13 @@ class MyTokenObtainPairOutSchema(Schema):
2526 user: UserSchema
2627
2728
28- class MyTokenObtainPairSchema (TokenObtainPairSerializer ):
29+ class MyTokenObtainPairSchema (TokenObtainPairInputSchema ):
2930 def output_schema (self ):
3031 out_dict = self .dict(exclude = {" password" })
3132 out_dict.update(user = UserSchema.from_orm(self ._user))
3233 return MyTokenObtainPairOutSchema(** out_dict)
3334
35+
3436@api_controller (' /token' , tags = [' Auth' ])
3537class MyTokenObtainPairController (TokenObtainPairController ):
3638 @route.post (
@@ -49,7 +51,6 @@ Here is an example
4951
5052``` python
5153from ninja import router
52- from ninja_schema import Schema
5354
5455router = router(' /token' )
5556
@@ -67,3 +68,67 @@ from ninja import NinjaAPI
6768api = NinjaAPI()
6869api.add_router(' ' , tags = [' Auth' ], router = router)
6970```
71+
72+
73+ ### Controller Schema Swapping
74+
75+ You can now swap controller schema in ` NINJA_JWT ` settings without having to inherit or override Ninja JWT controller function.
76+
77+ All controller input schema must inherit from ` ninja_jwt.schema.InputSchemaMixin ` and token generating schema should inherit
78+ from ` ninja_jwt.schema.TokenObtainInputSchemaBase ` or ` ninja_jwt.schema.TokenInputSchemaMixin ` if you want to have more control.
79+
80+ Using the example above:
81+
82+ ``` python
83+ # project/schema.py
84+ from typing import Type, Dict
85+ from ninja_jwt.schema import TokenObtainInputSchemaBase
86+ from ninja import Schema
87+ from ninja_jwt.tokens import RefreshToken
88+
89+ class UserSchema (Schema ):
90+ first_name: str
91+ email: str
92+
93+
94+ class MyTokenObtainPairOutSchema (Schema ):
95+ refresh: str
96+ access: str
97+ user: UserSchema
98+
99+
100+ class MyTokenObtainPairInputSchema (TokenObtainInputSchemaBase ):
101+ @ classmethod
102+ def get_response_schema (cls ) -> Type[Schema]:
103+ return MyTokenObtainPairOutSchema
104+
105+ @ classmethod
106+ def get_token (cls , user ) -> Dict:
107+ values = {}
108+ refresh = RefreshToken.for_user(user)
109+ values[" refresh" ] = str (refresh)
110+ values[" access" ] = str (refresh.access_token)
111+ values.update(user = UserSchema.from_orm(user)) # this will be needed when creating output schema
112+ return values
113+ ```
114+
115+ In the ` MyTokenObtainPairInputSchema ` we override ` get_token ` to define our token and some data needed for our output schema.
116+ We also override ` get_response_schema ` to define our output schema ` MyTokenObtainPairOutSchema ` .
117+
118+ Next, we apply the ` MyTokenObtainPairInputSchema ` schema to controller. This is simply done in ` NINJA_JWT ` settings.
119+
120+ ``` python
121+ # project/settings.py
122+
123+ NINJA_JWT = {
124+ ' TOKEN_OBTAIN_PAIR_INPUT_SCHEMA' : ' project.schema.MyTokenObtainPairInputSchema' ,
125+ }
126+ ```
127+ Other swappable schemas can be found in [ settings] ( ../settings )
128+
129+ ![ token_customization_git] ( ./img/token_customize.gif )
130+
131+ !!! Note
132+ ` Controller Schema Swapping ` is only available from ** v5.2.4**
133+
134+
0 commit comments