urls.py、INSTALLED_APPS、apps.py 的不同 django rest 方法

Different django rest approach for urls.py, INSTALLED_APPS, apps.py

在 Whosebug 和 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



    从 django.apps 导入 AppConfig
    
    
    class API配置(应用配置):
        default_auto_field = "django.db.models.BigAutoField"
        <b>name = "api"</b> ########### 差异
    

my_project\api\urls.py



    来自 django.urls 导入包含,路径
    来自 rest_framework 导入路由器
    从 。导入视图
    
    路由器 = routers.DefaultRouter()
    router.register(前缀="symbols", viewset=views.SymbolsViewSet)
    
    <b>urlpatterns = [</b> ########### 差异
    <b> 路径("", include(router.urls)),</b> ########### 差异
    <b>]</b> ########### 差异

my_project\my_project\urls.py



    来自 django.contrib 导入管理员
    来自 django.urls 导入路径,包括
    
    
    网址模式 = [
        路径("admin/",admin.site.urls),
        <b>path("api/", include("api.urls")),</b> ########### 差异
    ]

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",
        <b>"api",</b> ########### 差异
    
    ]

教程 #2

my_project\api\apps.py



    从 django.apps 导入 AppConfig
    
    
    class API配置(应用配置):
        default_auto_field = "django.db.models.BigAutoField"
        <b>name = "my_project.my_project.api"</b> ########### 差异

my_project\api\urls.py



    来自 rest_framework 导入路由器
    从 。导入视图
    
    路由器 = routers.DefaultRouter()
    router.register(前缀="symbols", viewset=views.SymbolsViewSet)
    <b>########### DIFF 缺少 3 行</b>

my_project\my_project\urls.py



    来自 django.contrib 导入管理员
    来自 django.urls 导入路径,包括
    
    来自 my_project.my_project.api.urls 导入路由器
    
    网址模式 = [
        路径("admin/",admin.site.urls),
        <b>path("api/", include(router.urls)),</b> ########### 差异
    ]

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",
        <b>"my_project.my_project.api",</b>
    
    ]

我已经放了

########### DIFF where files are different and bolded text.

所以主要的有趣区别在于文件 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")),

or

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

要从 include 中获取相同的 return,我需要:

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

第二个

router.urls[0]

为什么“api.urls”有效?

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

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

我个人更喜欢 urls.py 每个应用程序单独包含在主目录中。

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