LoginSignup

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【DRF】新規登録機能とログイン機能のurl.py

解決したいこと

ルーティングを設定するにあたり、
希望通りのルーティングが作成できていないのでご相談させてください。

マッピングさせたいurl
{
userinfo: "http://localhost:8000/api/userinfo/",
login: "http://localhost:8000/api/login/"
}

ソースコード

試したこと1.まず、view.pyにquerysetを登録

url.py
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers

from sayhellotobikeAPI.views import UserInfoViewSet, LoginViewSet

# DefaultRouter クラスのインスタンスを代入
defaultRouter = routers.DefaultRouter()

# userInfo/ に UserInfoViewSet をルーティングする
defaultRouter.register('register', UserInfoViewSet)
defaultRouter.register('login', LoginViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    # defaultRouter を include する
    path('api/', include(defaultRouter.urls)),
]
view.py
# 新規登録機能
class UserInfoViewSet(viewsets.ModelViewSet):
    queryset = UserInfo.objects.all()
    serializer_class = UserInfoSerializer

    def perform_create(self, serializer):
        # ユーザ情報を保存する前に、新しいUserレコードを作成して保存
        user_data = self.request.data.get('user')  # もしくは request.data.get('user')
        user_serializer = UserSerializer(data=user_data)
        if user_serializer.is_valid():
            user = user_serializer.save()
            serializer.save(user=user)  # UserInfoにUserを関連付けて保存
        else:
            # もしくはバリデーションエラーを処理
            pass
# ログインビューの作成
class LoginViewSet(viewsets.ViewSet):
    queryset = UserInfo.objects.all()
    def login(self, request):
        serializer = LoginSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({'token': token.key})

→結果
{
userinfo: "http://localhost:8000/api/userinfo/",
login: "http://localhost:8000/api/userinfo/"
}
同じURLになる

試したこと2.まず、url.pyにルーティングを登録

uri.py
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers

from sayhellotobikeAPI.views import UserInfoViewSet, LoginViewSet

# DefaultRouter クラスのインスタンスを代入
defaultRouter = routers.DefaultRouter()

# userInfo/ に UserInfoViewSet をルーティングする
defaultRouter.register('register', UserInfoViewSet, basename='register')
defaultRouter.register('login', LoginViewSet, basename='login')

urlpatterns = [
    path('admin/', admin.site.urls),
    # defaultRouter を include する
    path('api/', include(defaultRouter.urls)),

結果

{
userinfo: "http://localhost:8000/api/userinfo/"
}
なぜかloginが存在しないという状況です。
ここでの解決策をご教示いただけたら幸いです
ちなみに
basenameのパラメータを入れないとサーバーエラーを返します

宜しくお願い致します。

0

No Answers yet.

Your answer might help someone💌