【发布时间】: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
- 为什么有时有 api,有时有完整路径 my_project.my_project.api?
- 我应该始终使用完整路径还是短路径?
- 为什么在第一个教程中我们在 my_project\api\urls.py 中使用了 urlpatterns 而不是在教程 #2 中?
- 本教程中的哪些更接近最佳实践?
- 为什么我们有一次
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