无法在 Django 1.8 中解析静态 JSON 文件

Posted

技术标签:

【中文标题】无法在 Django 1.8 中解析静态 JSON 文件【英文标题】:Can't parse a static JSON file in Django 1.8 【发布时间】:2018-06-05 23:34:36 【问题描述】:

我有以下树:

myDjangoSite/
    ...
    myApp/
        ...
        static/
            ...
            myApp/
                myData.json

我有这个 view.py 文件:

import json
from django.shortcuts import render
from django.contrib.staticfiles.templatetags.staticfiles import static


url = static('myApp/myData.json')

json_data = open(url)

def helloWorld(request):

    return render(request, 'myApp/index.html')

...当我访问网页时,浏览器会显示以下消息:

IOError 在 / [Errno 2] 没有这样的文件或目录:'/static/myApp/myData.json'

我不明白为什么它说“没有这样的文件或目录”,如果文件确实存在以及如何解决它。

【问题讨论】:

您是否按照Django docs 中的说明配置了静态文件? @alp, static 不适用于此。你知道的。 @danihp 是否有任何 django 文档建议不要使用服务器端的静态引用?或者它只能用于客户端?我会很感激任何参考,因为我不记得读过任何参考。谢谢。 static创建一个 URL 路径,从 STATIC_URL 开始。它不会创建需要从 STATIC_ROOT 开始的文件路径。 @DanielRoseman,我完成了我的回答(如下)以涵盖collectstatic 案例,我想是对的。感谢即将向 alp 解释我的评论。 【参考方案1】:

当您在 1.8 上创建新项目时,会创建 BASE_DIR var:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

将此变量用作文件路径的基础:

>>> from django.conf import settings
>>> import os
>>> f=os.path.join( settings.BASE_DIR, 'myApp/static/myApp/myData.json' )
>>> f
'/home/dani/tmp/ppdpd/p/myApp/myData.json'
>>> json_data = open(f)

通知static 旨在从导航器端、远程、互联网获取开箱即用客户端的路径。而不是来自您的服务器端 django 应用程序。

注意可能是您在部署应用程序时调用collectstatic,那么正确的路径将是settings.STATIC_ROOT 类似:

>>> f=os.path.join( settings.STATIC_ROOT, 'myApp/myData.json' )

【讨论】:

以上是关于无法在 Django 1.8 中解析静态 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

text Django 1.8静态提示

模板语法错误无法解析剩余部分:来自“静态(“images/logo.png”)”的“(“images/logo.png”)”。在 django-jinja 模板中?

TemplateSyntaxError 无法解析余数

Django Elasticbeanstalk:当 Debug = False 时无法访问静态文件

django rest api:JSON 解析错误 - 无法解码 JSON 对象

Django 视图无法在 ajax 成功时返回 json?