Django HTTP 错误 404:未找到:在我的视图中使用 config.json 文件

Posted

技术标签:

【中文标题】Django HTTP 错误 404:未找到:在我的视图中使用 config.json 文件【英文标题】:Django HTTP Error 404: Not Found: Using a config.json file in my views 【发布时间】:2022-01-23 00:13:30 【问题描述】:

我有 3 个应用程序,其中一个名为“cv”,但对于这个应用程序,我使用了一个 config.json 文件,但在加载页面时它一直给我一个 404 错误。

我的项目名为“project_1”,我的 urls.py 定义为:

  urlpatterns = [
  path("", include("cv.urls")),
  path("admin/", admin.site.urls),
  path("projects/", include("projects.urls")),
  path("blog/", include("blog.urls")),
]

http://127.0.0.1:8000/admin

http://127.0.0.1:8000/projects 和

http://127.0.0.1:8000/博客

可以到达,但是当我打开时

http://127.0.0.1:8000

它给了我错误。

在 cv 目录中,我将 urls.py 定义为:

 urlpatterns = [
        path("", views.index, name="cv_index"),
    ]

我的 cv/views.py 为:

def index(request):
    BASEURL = request.build_absolute_uri()
    url = BASEURL + "/static/configuration/configuration.json"
    response = urllib.request.urlopen(url)
    configuration = json.loads(response.read())
    return render(request, "index.html", configuration)

我的json配置位于static>configuration>configuration.json下的cv目录中

当我将 cv/views.py 中的索引函数更改为只呈现请求并返回我的 index.html 文件时,一切正常。所以我希望它与这段代码有关:

BASEURL = request.build_absolute_uri()
url = BASEURL + "/static/configuration/configuration.json"
response = urllib.request.urlopen(url)
configuration = json.loads(response.read())

我的回溯看起来像这样:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/

Django Version: 3.2.6
Python Version: 3.9.9
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'projects',
 'blog',
 'cv']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:\Users\s.pauly\Github\portfolio\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\s.pauly\Github\portfolio\env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\s.pauly\Github\portfolio\cv\views.py", line 8, in index
    response = urllib.request.urlopen(url)
  File "C:\Users\s.pauly\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 214, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\s.pauly\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 523, in open
    response = meth(req, response)
  File "C:\Users\s.pauly\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 632, in http_response
    response = self.parent.error(
  File "C:\Users\s.pauly\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 561, in error
    return self._call_chain(*args)
  File "C:\Users\s.pauly\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 494, in _call_chain
    result = func(*args)
  File "C:\Users\s.pauly\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 641, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)

Exception Type: HTTPError at /
Exception Value: HTTP Error 404: Not Found

【问题讨论】:

【参考方案1】:

在您的settings.py 中,您的静态文件配置是什么样的?更具体地说,您是否定义了 STATIC_ROOTSTATIC_URL 变量?

您应该通过STATIC_URL 访问静态资产。

此外,我强烈建议不要在视图函数中发送urllib.request 来访问静态资产。相反(假设您使用的是现代版本的 Django),请在视图函数中访问该文件,如下所示:

from django.templatetags.static import static

def index(request):
    # use the imported static function to access the file as you would in a template
    config_file = static('configuration/configuration.json')
    
    # parse the json
    config_json = json.loads(config_file)
    
    # return your template and payload
    return render(request, "index.html", configuration)

但是,您是否运行过python manage.py collecstatic,并确认configuration.json 已被收集并放置在settings.pySTATIC_ROOT 变量下定义的静态目录中?我建议从这里开始。

另一个潜在问题可能是您的应用命名空间。 STATIC-ROOT 目录的目录结构是什么样的?我强烈建议安装Django Extensions 插件进行开发;添加的python manage.py show_urls 命令对于调试此类错误非常有用。

我还没有足够的代表来评论其他答案,但是@Marco: json.loads() 将 deserialize a valid json instance to a Python object (dict),所以在他的渲染语句中传递 configuration 应该没问题,假设 json已验证。现在的问题是访问文件本身——OP 向他的 /static/ 路径发送 GET 请求的解决方案返回 404。

【讨论】:

谢谢!我可以通过明确地将路径字符串“./static/configuration/configuration.json”作为我的配置文件来修复它,但我似乎无法使用 static() 函数来获取它。我将我的静态根和 url 分别定义为“cv/static”和“static/”。 ps:你必须在你的索引函数中渲染变量config_json,对吧? @Steven01123581321 通过传递相对路径字符串,它是否是静态文件并不重要。 static() 应该让您可以访问 django 能够使用它的静态文件查找器找到的所有文件——您可能需要调整 settings.py 中的一些静态文件内容。 config_json 就是我命名的变量——它可以被命名为任何名称,只要它是您传递给渲染函数的字典。您遇到的问题可能是由于STATIC_ROOT 和/或STATIC_URL 的配置不正确当您运行python manage.py collectstatic 时会发生什么?【参考方案2】:

render 的 Django 文档说:

render(request, template_name, context=None, content_type=None, status=None, using=None)

因此,如果它是字典,您应该将这些配置作为上下文传递:

return render(request, "index.html", context=configuration)

context:要添加到模板上下文的值字典。默认情况下,这是一个空字典。如果字典中的值是可调用的,视图将在渲染模板之前调用它。

【讨论】:

以上是关于Django HTTP 错误 404:未找到:在我的视图中使用 config.json 文件的主要内容,如果未能解决你的问题,请参考以下文章

Django REST 框架 http 404 详细信息”:“未找到。”

我的 IIS 提示 HTTP 错误 404 - 文件或目录未找到。

我的 IIS 提示 HTTP 错误 404 - 文件或目录未找到。

Django - DRF 删除/检索/补丁返回 404 详细信息:“未找到”

试图在我的系统中安装猫鼬给出错误 404 未找到 mongoose@latest

GetOldTweets3 - HTTP 请求期间发生错误:HTTP 错误 404:未找到