未找到参数“(“”,)”的“wagtailadmin_explore”的反面

2024-06-16 08:57:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试重建我的Wagtail网站,作为一个docker容器,在Fargate上运行。出于种种原因,我从零开始,重建了所有依赖项。pip安装完所有东西后,使用venv,站点在本地运行良好

但是,在Docker容器中启动时,我会遇到奇怪的错误。有人能帮我找到解决办法吗

我在/admin处收到以下错误:

Error during template rendering
In template /usr/local/lib/python3.8/site-packages/wagtail/admin/templates/wagtailadmin/home/site_summary_pages.html, error at line 4

Reverse for 'wagtailadmin_explore' with arguments '('',)' not found. 1 pattern(s) tried: ['admin/pages/(?P<parent_page_id>[0-9]+)/$']
1   {% load i18n wagtailadmin_tags %}
2   
3   <li class="icon icon-doc-empty-inverse">
4       <a href="{% url 'wagtailadmin_explore' root_page.pk %}">
5           {% blocktrans count counter=total_pages with total_pages|intcomma as total %}
6               <span>{{ total }}</span> Page <span class="visuallyhidden">created in {{ site_name }}</span>
7           {% plural %}
8               <span>{{ total }}</span> Pages <span class="visuallyhidden">created in {{ site_name }}</span>
9           {% endblocktrans %}
10      </a>
11  </li>
12  

我对Docker的基本印象是Python 3.8。我对本地和Docker的pip冻结有所不同,包的版本是相同的。所有迁移都在docker和本地服务器上运行

在下面的评论中进行讨论后,问题似乎可能与我的Docker文件有关。我正在为Wagtail部署一个Python3.8容器,为数据库部署一个postgres容器。当我删除并在postgres容器上重新创建DB时,错误消失了。所以,当站点部署时,迁移出现了一些问题,但我不知道这可能是什么

我的docker文件如下:

# pull official base image
FROM python:3.8.0-alpine

# set work directory
WORKDIR /usr/src/app

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# install psycopg2 dependencies
RUN apk update \
    && apk add postgresql-dev gcc python3-dev \
    musl-dev bash libffi-dev zlib zlib-dev make jpeg jpeg-dev

# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt

# copy entrypoint.sh
COPY ./entrypoint.sh /usr/src/app/entrypoint.sh

# copy project
COPY . /usr/src/app/

# run entrypoint.sh
ENTRYPOINT ["/usr/src/app/entrypoint.sh"]

和我的入口点文件:

#!/bin/sh

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

python manage.py flush --no-input
python manage.py migrate
python manage.py collectstatic --no-input --clear
python manage.py runserver 0.0.0.0:8000

exec "$@"

和我的docker组合文件:

version: '3.7'

services: 
  web:
    build: ./
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./:/usr/src/app/
    ports: 
      - 8000:8000
    env_file: 
      - ./.env.dev

  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=blog_project

volumes:
  postgres_data:

Tags: pipdockerpydevsrcappmanageusr
1条回答
网友
1楼 · 发布于 2024-06-16 08:57:44

这可能是因为迁移后删除了数据库(或其中的一部分)。wagtailcore_page表在不应该为空时可能为空

使用wagtail,当您运行python manage.py migrate时,迁移不仅会创建所需的表,还将使用您构建站点结构的初始根页面填充它。删除此页时,将出现指定的错误

{% url 'wagtailadmin_explore' root_page.pk %}是这里的罪魁祸首。Wagtail尝试使用root_page.pk反转wagtailadmin_exploreurl,但在您的情况下root_page为无

简单地再次运行python manage.py migrate将不起作用,因为Wagtail将假定其迁移已经运行,并且不会再次创建根页面。 要解决此问题,请完全删除数据库并运行python manage.py migrate,或者将正确的数据库传递到Docker容器中

最好使用wagtail界面删除、重组或更改页面。我在过去遇到过很多问题,我的摇尾装置坏了

编辑:

我认为您应该删除entrypoint.sh中的python manage.py flush no-input。每次运行容器时都会执行此文件,这意味着每次调用docker rundocker-compose up时都会刷新数据库

flush将清除所有数据,但保留实际表。如果再次运行migrate,然后再运行flush,然后再运行migrate,它将发现没有要应用的迁移(因为它们已经应用),因此创建根页面的迁移也不会运行

我不太清楚为什么每次都要刷新数据库,尤其不是在Docker容器中。如果您想从一个新的数据库开始,最好将其作为一次性命令运行,最好通过psql删除所有表

相关问题 更多 >