Django HTTP Ошибка 404: Not Found: Использование файла config.json в моих представлениях
У меня есть 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/blog
может быть достигнут, но когда я открываю
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 в директории cv под static>configuration>configuration.json
Когда я изменяю свою функцию index в 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
В вашем 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
собирается и помещается в ваш статический каталог, определенный переменной STATIC_ROOT
в settings.py
? Я бы предложил начать отсюда.
Другой потенциальной проблемой может быть пространство имен вашего приложения. Как выглядит структура каталогов вашей директории STATIC-ROOT
? Я настоятельно рекомендую установить плагин Django Extensions для разработки; добавленная команда python manage.py show_urls
невероятно полезна для отладки ошибок, подобных этим.
У меня пока недостаточно репутации, чтобы комментировать другие ответы, но @Marco: json.loads()
будет десериализовать действительный экземпляр json в объект Python (dict
), поэтому передача configuration
в его операторе рендеринга должна быть в порядке, при условии, что json действителен. Сейчас проблема заключается в доступе к самому файлу - решение ОП, посылающее GET запрос к его /static/ пути, возвращает 404.
В документации Django для render говорится:
render(request, template_name, context=None, content_type=None, status=None, using=None)
Итак, вы должны передать эти конфигурации, вероятно, как контекст, если это словарь:
return render(request, "index.html", context=configuration)
context: Словарь значений для добавления в контекст шаблона. По умолчанию это пустой словарь. Если значение в словаре является вызываемым, представление будет вызывать его непосредственно перед отрисовкой шаблона.