![](/img/trans.png)
[英]How to call a Django Rest API with authentication from a Django View
[英]Django - Have a user logged in authentication check on every REST API call
我在 Django 中有 2 個視圖的代碼。您會注意到每個 REST API 調用都有一個 verify_login() function 調用,確保請求包含經過驗證的 JWT 令牌。 我想知道是否有更好的方法來實現這一點,這樣我就不必在每個 REST 端點中專門設置這些行
verify_response = verify_login(request)
if verify_response not None:
return verify_response
我正在嘗試遵循 D.R.Y。 (Do Not Repeat Yourself) 編碼原則。 如果有一種更簡潔的方式來表示這一點,那就太好了。 我考慮過可能創建一個擴展 APIView 的模塊,它自動擁有這個,然后我所有的視圖都擴展那個,但是遇到了必須調用 super().API_REQUEST() 然后必須執行相同的 if 語句檢查才能看到的問題是否為 None。
class PostView(APIView):
"""
View for Post object
* requires token authentication
"""
# Create post
@swagger_auto_schema(
request_body=PostSerializer,
operation_description="Create a post object"
)
def post(self, request):
verify_response = verify_login(request)
if verify_response not None:
return verify_response
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# get all posts
@swagger_auto_schema(
operation_description="Get all posts from the DB"
)
def get(self, request):
verify_response = verify_login(request)
if verify_response not None:
return verify_response
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
您可以將身份驗證類與權限類一起使用。 如果您希望對應用程序的所有 API 進行身份驗證檢查,請將您的類放在 settings.REST_FRAMEWORK 中。 如果你想要它用於特定的 APIView,請將它們放在 permission_classes & authentication_classes class 變量中。 查看文檔以獲取更多詳細信息。
例子,
class JWTAuthenticataion(BaseAuthentication):
def authenticate(self, request):
... # write your JWT implementation here
# settings.py:
REST_FRAMEWORK = {
...
"DEFAULT_AUTHENTICATION_CLASSES": (
"path.to.JWTAuthentication",
),
"DEFAULT_PERMISSION_CLASSES": (
"rest_framework.permissions.IsAuthenticated",
)
}
# or
# api.py
class YourAPIView(APIView):
permission_classes = (IsAuthenticated, )
authentication_classes = (JWTAuthentication, )
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.