Django 3 url - 视图必须是可调用的或在include()中为列表/元组

0 投票
1 回答
15 浏览
提问于 2025-04-14 18:29

我刚开始学习Python和Django,最近把一个项目从2.x版本迁移到了3.x版本。

我有这段代码:

urlpatterns += [
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        }),
    ]

但是这段代码给我返回了一个错误:

url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
  File "/mnt/c/Projekty/GO/.venvs/lib/python3.9/site-packages/django/conf/urls/__init__.py", line 22, in url
    return re_path(regex, view, kwargs, name)
  File "/mnt/c/Projekty/GO/.venvs/lib/python3.9/site-packages/django/urls/conf.py", line 73, in _path
    raise TypeError('view must be a callable or a list/tuple in the case of include().')
TypeError: view must be a callable or a list/tuple in the case of include().

我该怎么修复它呢?请帮帮我。

1 个回答

0

你需要直接操作视图,而不是通过名字来引用它:

from django.views.static import serve

urlpatterns += [
    url(
        '^media/(?P<path>.*)$',
        serve,
        {
            'document_root': settings.MEDIA_ROOT,
        },
    ),
]

不过,这种做法一开始就不是个好主意。这里的作者想要“绕过”Django在生产环境中不提供静态文件或媒体文件的事实(DEBUG = False),但这样做是有原因的:通过Django来提供文件在处理时间和内存使用上可能非常低效,而且它也不太会有效利用缓存,最后,视图本身并不是特别安全。

通常情况下,你需要配置像nginx、apache这样的网络服务器来提供这些文件,想了解更多信息,可以查看从专用服务器提供静态文件部分 [Django-doc]

撰写回答