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_ROOT
和 STATIC_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.py
中STATIC_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 详细信息:“未找到”