I have 3 apps and one is called 'cv' but for this app I use a config.json file but it keeps giving me a 404-error when loading the page.
My project is called "project_1" and my urls.py is defined as:
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
can be reached, but when I open
http://127.0.0.1:8000
It gives me the error.
In the cv-directory, I have my urls.py defined as:
urlpatterns = [
path("", views.index, name="cv_index"),
]
And my cv/views.py as:
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)
Where my json configuration is located in the cv directory under static>configuration>configuration.json
When I change my index function in cv/views.py to just render the request and give back my index.html file, it goes fine. So I expect it has something to do with this piece of code:
BASEURL = request.build_absolute_uri()
url = BASEURL "/static/configuration/configuration.json"
response = urllib.request.urlopen(url)
configuration = json.loads(response.read())
My traceback looks like this:
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
CodePudding user response:
In your settings.py, what does your static files configuration look like? More specifically, have you defined the STATIC_ROOT and STATIC_URL variables?
You should be accessing static assets via the STATIC_URL.
Additionally, I would highly advise against sending a urllib.request inside a view function to access a static asset. Instead (assuming you are using a modern version of Django), access the file in your view function like so:
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)
However, have you ran python manage.py collecstatic, and verified that the configuration.json is collected and placed in your static directory defined under the STATIC_ROOT variable in settings.py? I would suggest starting here.
Another potential issue could be your app namespacing. What does the directory structure of your STATIC-ROOT directory look like? I highly recommend installing the Django Extensions plugin for development; the added python manage.py show_urls command is incredibly useful for debugging errors such as these.
I don't have enough rep yet to comment on other answers, but @Marco: json.loads() will deserialize a valid json instance to a Python object (dict), so passing configuration in his render statement should be fine, assuming the json is valid. The issue right now is accessing the file itself-- OP's solution of sending a GET request to his /static/ path is returning a 404.
CodePudding user response:
Django documentation for render says:
render(request, template_name, context=None, content_type=None, status=None, using=None)
So, you should pass those configuration probably as context if it's an dictionary:
return render(request, "index.html", context=configuration)
context: A dictionary of values to add to the template context. By default, this is an empty dictionary. If a value in the dictionary is callable, the view will call it just before rendering the template.
