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/admin

http://127.0.0.1:8000/projects и

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: Словарь значений для добавления в контекст шаблона. По умолчанию это пустой словарь. Если значение в словаре является вызываемым, представление будет вызывать его непосредственно перед отрисовкой шаблона.

Вернуться на верх