【问题标题】:Different django rest approach for urls.py, INSTALLED_APPS, apps.pyurls.py、INSTALLED_APPS、apps.py 的不同 django rest 方法
【发布时间】:2021-09-01 18:37:31
【问题描述】:

在 stackoverflow 和https://docs.djangoproject.com/en/3.2/ref/applications/#configuring-applications 中阅读了一些类似的主题,我仍然面临着理解正确处理 url 方法的问题。我正在关注两个 REST API 教程,它们在 urls.py、settings.py、apps.py 文件方面彼此不同。

结构如下:


├───my_project
│   └───api
│       ├───apps.py
|       └───urls.py
│   └───my_project
|       ├───urls.py
|       └───settings.py
|   └───manage.py

教程 #1

my_project\api\apps.py



    from django.apps import AppConfig
    
    
    class ApiConfig(AppConfig):
        default_auto_field = "django.db.models.BigAutoField"
        name = "api"                     ########### DIFF
    

my_project\api\urls.py



    from django.urls import include, path
    from rest_framework import routers
    from . import views
    
    router = routers.DefaultRouter()
    router.register(prefix="symbols", viewset=views.SymbolsViewSet)
    
    urlpatterns = [                      ########### DIFF
        path("", include(router.urls)),  ########### DIFF
    ]                                    ########### DIFF

my_project\my_project\urls.py



    from django.contrib import admin
    from django.urls import path, include
    
    
    urlpatterns = [
        path("admin/", admin.site.urls),
        path("api/", include("api.urls")),   ########### DIFF
    ]

my_project\my_project\settings.py



    INSTALLED_APPS = [
        "django.contrib.admin",
        "django.contrib.auth",
        "django.contrib.contenttypes",
        "django.contrib.sessions",
        "django.contrib.messages",
        "django.contrib.staticfiles",
        "rest_framework",
        "api",                               ########### DIFF
    
    ]

教程#2

my_project\api\apps.py



    from django.apps import AppConfig
    
    
    class ApiConfig(AppConfig):
        default_auto_field = "django.db.models.BigAutoField"
        name = "my_project.my_project.api"     ########### DIFF

my_project\api\urls.py



    from rest_framework import routers
    from . import views
    
    router = routers.DefaultRouter()
    router.register(prefix="symbols", viewset=views.SymbolsViewSet)
    ########### DIFF Lack of 3 lines

my_project\my_project\urls.py



    from django.contrib import admin
    from django.urls import path, include
    
    from my_project.my_project.api.urls import router
    
    urlpatterns = [
        path("admin/", admin.site.urls),
        path("api/", include(router.urls)),     ########### DIFF
    ]

my_project\my_project\settings.py



    INSTALLED_APPS = [
        "django.contrib.admin",
        "django.contrib.auth",
        "django.contrib.contenttypes",
        "django.contrib.sessions",
        "django.contrib.messages",
        "django.contrib.staticfiles",
        "rest_framework",
        "my_project.my_project.api",
    
    ]

我放了

########### 差异 其中文件是不同的粗体文本。

所以主要有趣的区别在于文件 my_project\my_project\urls.py

  1. 为什么有时有 api,有时有完整路径 my_project.my_project.api?
  2. 我应该始终使用完整路径还是短路径?
  3. 为什么在第一个教程中我们在 my_project\api\urls.py 中使用了 urlpatterns 而不是在教程 #2 中?
  4. 本教程中的哪些更接近最佳实践?
  5. 为什么我们有一次

path("api/", include("api.urls")),

path("api/", include(router.urls)),

要从包含的第一个我需要的返回中获得相同的回报:

include("my_project.my_project.api.urls")[0].router.urls[0]

第二个

router.urls[0]

那么为什么“api.urls”有效?

希望有些问题很清楚,感谢您的任何提示和帮助!祝你有美好的一天!

【问题讨论】:

    标签: django django-rest-framework django-views django-urls


    【解决方案1】:

    我们在主目录中使用“include”,我们为应用程序创建了另一个 urls.py。

    我个人更喜欢单独拥有每个应用程序的 urls.py 并将它们包含在主目录中。

    假设您想与某人共享此应用程序或将其发布到 pip 或在另一个项目中重新使用它,将功能齐全的应用程序及其所有 url 和资源放在一个文件夹中是不现实的。

    【讨论】:

      猜你喜欢
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2020-12-20
      • 1970-01-01
      • 2011-12-09
      • 2013-05-16
      • 2016-04-06
      相关资源
      最近更新 更多