为什么在Django应用程序中路径变量键被读作值?

gudnpqoy  于 2023-03-13  发布在  Go
关注(0)|答案(1)|浏览(102)

我正在使用Django Rest Framework来构建一个API,这是我第一次使用DRF,但是我有使用Laravel/NestJs的经验,所以路由的概念并不陌生。
在我的DRF应用程序中,我的url配置如下所示:

// urls.py

urlpatterns = [
    path('api/v1/accounts/<str:account_number>/', accounts.AccountsViewSet.as_view()),

    url('api/v1/', include(router.urls)),
]

在Postman中,我将GET请求发送到以下URL:

{{my_host}}/api/v1/accounts/:account_number/

我的观点如下:

// view.py

def get(self, request, account_number=None, *args, **kwargs):
        print(account_number)

        if account_number is not None:
            print('account_number was provided')
        else:
            print('account_number not provided')

当发送一个GET请求到我的端点时,我可以为account_number key提供一个值,假设我使用ABC123作为key值,给定上面的视图,第一个print语句返回ABC123
我还将进入第一个if块,并看到消息account_number was provided一切顺利!
但是,如果我 * 不 * 提供帐号(我将路径变量值留空),我将在日志中获得路径变量本身。例如:

// view.py

def get(self, request, account_number=None, *args, **kwargs):
        print(account_number) // :account_number

        if account_number is not None:
            print('account_number was provided'). <!-- still getting here
        else:
            print('account_number not provided')

正如你所看到的,我正在获取变量,我希望得到一个空字符串'',而不是变量名(键):account_number
我试过设置值来检查空字符串或null(也是字符串),但由于:account_number键被传入...我不确定还能尝试什么。
如何检查:account_number在我的视图中是否为空(未提供)?这是DRF独有的吗?我可以使用Laravel和/或NestJs很容易地进行这些检查。
谢谢您的建议!

ruarlubt

ruarlubt1#

URL路径api/v1/accounts/<str:account_number>/需要名为account_number的URL参数,该参数是字符串类型,如URL路径中的所示。
当您向api/v1/accounts/1223发出GET请求时,Django知道应该将值1223赋给account_number参数,AccountsViewSet视图将接收该值作为参数。
另一方面,当您向api/v1/accounts/发出GET请求时,account_number参数没有提供值,因此Django将无法将此URL与AccountsViewSet视图匹配,该视图需要account_number参数的值,相反,Django将返回404 Not Found响应,表明所请求的URL不存在。
要解决此问题,请再添加一个不带URL参数的路径,该路径指向同一视图

path('api/v1/accounts/', accounts.AccountsViewSet.as_view()),
path('api/v1/accounts/<str:account_number>/', accounts.AccountsViewSet.as_view()),

这应该可以解决问题

相关问题