【问题标题】:OSError at /app/ Why does such a strange error happen?/app/ 处的 OSError 为什么会发生这种奇怪的错误?
【发布时间】:2018-03-06 03:47:45
【问题描述】:

我遇到了一个错误:

/app/ 处的 OSError

[Errno 63] 文件名太长:"/Users/xxx/testapp/templates/jinja2/{'items': [{'---': '---', 'A': 'a' , 'B': 'b', 'C: 'c', 'D': 'd'}]​​}

我想将 json_parse 方法的结果的 json_dict 嵌入到 views.pyindex.html。我写在views.pylike

from django.shortcuts import render
import json

def index(request):
    f = open('./data/data.json', 'r')
    json_dict = json.load(f)
    return render('./index.html',json_dict)

我在 index.html 中写过

<html>
 <head>
 <script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/chosen/1.8.2/chosen.jquery.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/chosen/1.4.2/chosen.jquery.js"></script>
 <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/chosen/1.4.2/chosen.css">
 </head>
 <body>
    <select id="mainDD" data-placeholder="Choose" class="chzn-select" style="width:600px;">
    {% for k, v in json_dict.items %}
            <option>{{ v }}</option>
    {% endfor %}
    </select>
  </body>
</html>

json_dict{'items': [{'---': '---' ~~~ 的字典。我真的不明白为什么我不能将json_dict 发送到index.html。使用渲染方法我错了吗?我该如何解决这个问题?

app(子应用)的urls.py有views.py&index.html是

from django.conf.urls import url
from . import views


urlpatterns = [
    url(r'^$', views.index, name='index'),
]

父应用的urls.py是

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^app/', include('app.urls')),
]

追溯是

Traceback:

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/xxx/testapp/app/views.py" in index
  8.     return render('./index.html',json_dict)

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/shortcuts.py" in render
  30.     content = loader.render_to_string(template_name, context, request, using=using)

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/template/loader.py" in render_to_string
  67.         template = get_template(template_name, using=using)

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/template/loader.py" in get_template
  21.             return engine.get_template(template_name)

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/template/backends/django.py" in get_template
  39.             return Template(self.engine.get_template(template_name), self)

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/template/engine.py" in get_template
  162.         template, origin = self.find_template(template_name)

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/template/engine.py" in find_template
  136.                         name, template_dirs=dirs, skip=skip,

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/template/loaders/base.py" in get_template
  38.                 contents = self.get_contents(origin)

File "/Users/xxx/myenv/lib/python3.5/site-packages/django/template/loaders/filesystem.py" in get_contents
  28.             with io.open(origin.name, encoding=self.engine.file_charset) as fp:

Exception Type: OSError at /app/
Exception Value: [Errno 63] File name too long: "/Users/xxx/testapp/templates/jinja2/{'items': [{'---': '---', ‘A’: ‘a’, ‘B’: ‘b’, ‘C: ‘c’, ‘D’: ‘d’}]}

通过答案编辑后,我在 /app/ 处收到错误 TypeError init() 得到了一个意外的关键字参数 'match_extension' 。 追溯 说 追溯:

getitem 中的文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/template/utils.py” 65. return self._engines[别名]

在处理上述异常('django')的过程中,发生了另一个异常:

内部文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/core/handlers/exception.py” 41. response = get_response(request)

_get_response 中的文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/core/handlers/base.py” 187. response = self.process_exception_by_middleware(e, request)

_get_response 中的文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/core/handlers/base.py” 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)

索引中的文件“/Users/xxx/testapp/app/views.py” 13. 返回渲染(request, 'jinja2/index.html', {'json_dict': json_dict})

渲染中的文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/shortcuts.py” 30. content = loader.render_to_string(template_name, context, request, using=using)

render_to_string 中的文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/template/loader.py” 67. template = get_template(template_name, using=using)

get_template 中的文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/template/loader.py” 18. 引擎 = _engine_list(使用)

_engine_list 中的文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/template/loader.py” 72. 返回engines.all() if using is None else [engines[using]]

文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/template/utils.py”全部 89. return [self[alias] for alias in self]

文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/template/utils.py”在 89. return [self[alias] for alias in self]

getitem 中的文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/template/utils.py” 80. 引擎 = engine_cls(参数)

init 中的文件“/Users/xxx/myenv/lib/python3.5/site-packages/django/template/backends/django.py” 32. self.engine = Engine(self.dirs, self.app_dirs, **options)

异常类型:/app/ 处的 TypeError 异常值:init() 得到了一个意外的关键字参数“match_extension”

【问题讨论】:

  • 渲染一切正常。错误提示您在templates/jinja2/... 中的文件名太长。检查并重命名。
  • @Vladyslav 我的json文件名是“data.json”。我不认为这个文件名太错误了。我认为其他点是错误的。
  • 添加您的 urls.py 文件。也许其中有错误,因为在视图和模板中都可以。并为 templates/jinja2 目录添加所有文件名的文件树
  • 这不是给出该错误的代码。请显示实际代码和完整的回溯。
  • @Vladyslav 我添加了 urls.py。如果你知道什么请帮助我

标签: python django jinja2


【解决方案1】:

您对render() 的调用是错误的,试试这个:

def index(request):
    with open('./data/data.json', 'r') as f:
        json_dict = json.loads(f.read())
    return render(request, 'index.html', {'json_dict': json_dict})

一切都在文档中:

https://docs.djangoproject.com/en/1.11/topics/http/shortcuts/#render

【讨论】:

  • 可能不应该在路径中使用./;模板与模板目录设置相关。
  • 谢谢你的回答。我尝试了你的代码,但首先我得到了错误 TypeError: JSON object must be str, not TextIOWrapper。所以我将`json.loads(f)`更改为json.load(f),但是下一个我收到一个错误 No module named 'match_extension' 。我应该怎么做才能解决这个问题?
  • 我尝试了你的新代码,但是 /app/ __init__() 的 TypeError 发生了意外的关键字参数“match_extension”错误。我应该怎么做才能解决这个问题?
  • 我认为这是因为您的模板目录包含一个jinja2 文件夹。将 index.html 移动到其父文件夹 (templates),或编辑您的 render() 调用:return render(request, 'jinja2/index.html', {'json_dict': json_dict})
  • @Loïc 我试过你的代码,但同样的错误发生了。你觉得其他问题如何?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
相关资源
最近更新 更多