一旦上传到服务器,render() 调用中的 Django TypeError

Posted

技术标签:

【中文标题】一旦上传到服务器,render() 调用中的 Django TypeError【英文标题】:Django TypeError in render() call once uploaded to server 【发布时间】:2017-10-11 04:08:53 【问题描述】:

我有一个网站,我正在更新到最新的 Django,一次发布一个点。现在我在 Django 1.9.13 和 Python 2.7.5 上,我的代码可以在我的本地开发机器上与 manage.py runserver 一起正常工作,但是当我将它运行到我的网络主机(WebFaction)时,它失败了错误:

TypeError at /init() 正好需要 3 个参数(给定 2 个)

这是回溯:

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  149.                     response = self.process_exception_by_middleware(e, request)

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/myuser/webapps/optical_test/cinedex/theoptical/views.py" in frontpage
  38.     return render(request, 'theoptical/frontpage.html', context)

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/shortcuts.py" in render
  67.             template_name, context, request=request, using=using)

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
  96.             template = get_template(template_name, using=using)

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/template/loader.py" in get_template
  32.                 return engine.get_template(template_name, dirs)

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/template/backends/django.py" in get_template
  40.             return Template(self.engine.get_template(template_name, dirs), self)

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/template/engine.py" in get_template
  190.         template, origin = self.find_template(template_name, dirs)

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/template/engine.py" in find_template
  153.         for loader in self.template_loaders:

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/utils/functional.py" in __get__
  33.         res = instance.__dict__[self.name] = self.func(instance)

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/template/engine.py" in template_loaders
  118.         return self.get_template_loaders(self.loaders)

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/template/engine.py" in get_template_loaders
  123.             loader = self.find_template_loader(template_loader)

File "/home/myuser/.virtualenvs/optical_test/lib/python2.7/site-packages/django/template/engine.py" in find_template_loader
  146.             return loader_class(*args)

Exception Type: TypeError at /
Exception Value: __init__() takes exactly 3 arguments (2 given)

这是cinedex/theoptical/views.pyfrontpage

def frontpage(request):
    context = 'title':"The Optical Test New Front Page"

    # Don't return episodes with a pubdate in the future
    now = timezone.now()
    if Episode.objects.filter(pubDate__lt=now):
        latest_episode = get_object_or_404(Episode.objects.filter(pubDate__lt=now).order_by('-pubDate')[:1])
        context.update('latest_episode': latest_episode)

    context.update(masterlinks())
    return render(request, 'theoptical/frontpage.html', context)

对我应该在哪里查找错误有什么建议吗?让我知道提供更多信息是否对我有用。谢谢!

更新

这是我的settings.py 的模板设置

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
        ],
        'OPTIONS': 
            'context_processors': [
                # Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this
                # list if you haven't customized them:
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.debug',
                'django.template.context_processors.i18n',
                'django.template.context_processors.media',
                'django.template.context_processors.static',
                'django.template.context_processors.tz',
                'django.contrib.messages.context_processors.messages',
            ],
            'loaders': [
                'django.template.loaders.cached.Loader',
                'django.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
            ],
            'debug':True,
        ,
    ,
]

【问题讨论】:

可以是这个docs.djangoproject.com/en/1.11/ref/templates/upgrading 吗? 检查您是否在开发和生产服务器上运行相同版本的 Python 和 Django。 塞尔丘克,你知道吗——我不是。我以为我是,但 dev virtualenv 在 python 2.7.10 上。 Igonato,我不这么认为。我已经浏览过该页面几次,而且我的模板设置似乎还可以。以防万一,我会用我的 TEMPLATES 设置更新问题。 你从 django 的调试中得到回溯吗? loader_class 变量中有什么? 【参考方案1】:

查看您的模板设置似乎 django.template.loaders.cached.Loader 应该设置不同 (docs):

TEMPLATES = [
    # ...
    'OPTIONS': 
        'loaders': [
            ('django.template.loaders.cached.Loader', [
                'django.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
            ]),
        ],
    ,
]

【讨论】:

就是这样。现在网站加载。哇!谢谢你。看起来它并没有影响开发 runserver 上的东西,因为那里默认禁用缓存。 @bobtiki 完全正确。顺便说一句,它是在 1.11 中的 DEBUG = False 时自动添加的,因此您可以完全从您的设置中删除加载器 谢谢。一旦我到达 1.11,我会这样做。 :D【参考方案2】:

您的错误发生在这一行

latest_episode = get_object_or_404(Episode.objects.filter(pubDate__lt=now).order_by('-pubDate')[:1])

您缺少一个论点 - 请参阅docs。你应该这样做:

eps = get_object_or_404(Episode, pubDate__lt=now)
latest_episode = eps.order_by('-pubDate')

【讨论】:

很确定这是不正确的,OP的方式很好

以上是关于一旦上传到服务器,render() 调用中的 Django TypeError的主要内容,如果未能解决你的问题,请参考以下文章

Python-Flask中的render_template不起作用

坦克大战DJ。。。我想把这首歌放到QQ空间

上传到服务器后,图像路径从 vuejs 项目中的 localhost 调用

有关使用node-postgres和render page的节点js中的回调的问题

如何从 rmarkdown::render 函数调用 rmdformat 主题?

如何在nodejs中的单个服务调用中上传和下载文件?