繁体   English   中英

Django表单不在生产服务器上呈现 - 使用testserver在本地工作正常,并且单元测试在生产服务器上传递

[英]Django forms not rendering on production server - work fine locally with testserver, and unit tests pass on production server

这可能是我作为开发人员在短时间内遇到的最奇怪的错误。 我有一个在我的本地机器上完美呈现的表单,但完全相同的代码无法在服务器上呈现。

我有一个表单,看起来像这样:

表格的工作版本

没什么好看的,只有几个输入字段和一个提交按钮。

我是如何创建它的? 首先,有一个表格:

from django import forms
from django.forms.extras.widgets import SelectDateWidget
from blog.models import BlogPost

EMPTY_FIELD_ERROR = "You cannot submit a blog post with no %s"


class DateInput(forms.DateInput):
    input_type = 'date'



class PlainTextarea(forms.Textarea):

    def build_attrs(self, extra_attrs=None, **kwargs):
        attrs = super(PlainTextarea, self).build_attrs(extra_attrs, **kwargs)
        if "cols" in attrs: del attrs["cols"]
        if "rows" in attrs: del attrs["rows"]
        return attrs



class BlogPostForm(forms.models.ModelForm):


    class Meta:
        model = BlogPost
        fields = ("title", "date", "body", "visible")
        widgets = {
         "title": forms.fields.TextInput(attrs={
          "class": "pure-u-1-1 pure-u-md-19-24"
         }),
         "date": DateInput(),
         "body": PlainTextarea(attrs={
          "class": "pure-u-1-1 pure-u-md-19-24"
         }),
         "visible": forms.CheckboxInput(attrs={
          "class": "pure-u-1-24"
         })
        }
        error_messages = {
         "title": {"required": EMPTY_FIELD_ERROR % "title"},
         "date": {"required": EMPTY_FIELD_ERROR % "date"},
         "body": {"required": EMPTY_FIELD_ERROR % "body"}
        }

在new_post视图中,如果它检测到请求是GET请求,我只需创建此表单的实例,并将其传递给new_post模板:

def new_post_page(request):
    if request.method == "POST":
        form = BlogPostForm(request.POST)
        if form.is_valid():
            BlogPost.objects.create(
             title=request.POST["title"].strip(),
             date=datetime.datetime.strptime(
              request.POST["date"], "%Y-%m-%d"
             ).date(),
             body=request.POST["body"].strip(),
             visible=request.POST.get("visible") is not None
            )
            return redirect("/")
        else:
            return render(request, "new_post.html", {"form": form})
    form = BlogPostForm()
    return render(request, "new_post.html", {"form": form})

这是模板的一部分:

<form method="POST" class="pure-form pure-form-aligned">
  <div class="pure-g">
    <div class="pure-u-1-1 formrow">
      <label for="{{ form.title.id_for_label }}" class="pure-u-1-1 pure-u-md-4-24">Title:</label>
      {{ form.title }}
      {% if form.title.errors %}
      <div class="error">
        {{ form.title.errors }}
      </div>
      {% endif %}
    </div>
    <div class="pure-u-1-1 formrow">
      <label for="{{ form.date.id_for_label }}" class="pure-u-1-1 pure-u-md-4-24">Date:</label>
      {{ form.date }}
      {% if form.date.errors %}
      <div class="error">
        {{ form.date.errors }}
      </div>
      {% endif %}
    </div>

这一切都可以在我自己的机器上运行(MacBook,El Capitain,Python3,Django 1.8.4),但是当我将代码部署到服务器时,我得到了这个:

不工作!

检查HTML显示{{form.title}}标记未呈现。 但一切都是一样的! 好吧一切都好。 显然,服务器上的某些设置是不同的,例如Debug被设置为False。 我还在服务器上使用postgres数据库,在本地使用SQLite数据库。

为了让事情变得更加令人抓狂,我进行了单元测试,包括new_page视图渲染表单的测试 - 并且它们在服务器上传递! 我甚至在服务器上启动了一个Django shell,手动将请求传递给new_page视图,打印HTML, 输入HTML就在那里

一些可能有用的信息:

  • 服务器使用nginx,它向gunicorn发送请求。 操作系统是Ubuntu 14.04。
  • 在将它连接到Django表单之前,表单在完全是HTML时完全呈现
  • 我已经应用了所有迁移 - 没有新的迁移,但每次部署时都会自动进行迁移。

请帮助这个Django新手?

UPDATE

我尝试使用django测试服务器代替gunicorn,这使得表单正确,所以它可能是gunicorn的问题?

如果另一个可怜的灵魂在这里结束。 检查您的软件包(pip freeze)在本地和服务器上是否相同。 我在本地有django-filter == 0.15.0,在服务器上有django-filter == 0.10.0导致这个问题没有引发错误。

所以,我已经解决了这个问题。 不幸的是,我不完全确定如何。

正如我在更新中提到的那样,关闭gunicorn并使用django测试服务器来修复问题。 我关闭了测试服务器并再次启动了gunicorn,并且...表单仍然正确呈现。

我怀疑是需要重新启动gunicorn。 我不知道为什么,或者如果那肯定是什么修复它。 那好吧。

当我将django项目部署到AWS EC2时,我遇到了同样的问题。

如果您已经关注过Nginx gunicorn和Django教程,那么您最好的选择是重新启动EC2然后重新启动gunicorn服务器。 这解决了我的问题。

您应该在每次部署时重新启动Web服务器 - 这将确保您运行应用程序的最新代码。 这是非常具有欺骗性的,因为它会正确地拉出html模板,但不会运行为模板呈现内容的代码(这就是为什么你看到你的标签是硬编码但不是动态渲染的文本输入)。

我在Ubuntu上使用Apache,这让我每隔一段时间就会整夜调试一下......总是在部署新代码时重新启动服务器:

sudo service apache2 restart

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM