Объекты модели из админки django не связаны с объектами модели бэкенда
Итак, я использую $5 digital ocean droplet, используя ubuntu и nginix для размещения сайта django, я следовал этому this tutorial и this guide. Часть руководства гласила запустить gunicorn --bind 0.0.0.0:8000 myproject.wsgi из виртуальной среды, это сработало, и в качестве теста я создал объект Highlights, чтобы посмотреть, появится ли он, он появился, и вот как это выглядело:
После этого я добавил сокет gunicorn и дочитал статью до того момента, когда она сказала мне запустить sudo ufw allow 'Nginx Full', однако после того, как я запустил ее, во-первых, css для страницы администратора исчез, но более важным было то, что после того, как я добавил несколько дополнительных объектов из панели администратора, изменения, похоже, не были замечены моим views.py, так как когда я отобразил содержимое Highlights.objects.all(), он показал только то, что было написано выше. Но страница администратора показывает, что объекты были успешно добавлены. Также в папке media на github repo не было ни одного нового изображения, включая то, которое было загружено из gunicorn --bind 0.0.0.0:8000 myproject.wsgi, там были только те изображения, которые я загрузил во время локальной разработки
Однако, когда я ls зашел в папку media из моего виртуального env под управлением nginix, там были все медиа файлы из изображений, которые я загрузил в локальном режиме, а также все новые.
У меня есть 2 модели, и эта проблема, кажется, преобладает для обеих, я пробовал миграции, перезапуск сервера ngnix, и вытаскивание и выталкивание на github, ничего не помогло до сих пор. Также новые изображения, похоже, существуют в требуемых url
Вот мой models.py:
from django.db import models
class Highlights(models.Model):
img = models.ImageField(upload_to='highlights/')
class Gallery(models.Model):
img = models.ImageField()
и вот мой views.py:
from django.shortcuts import render,get_object_or_404
from django.core.mail import send_mail
from .models import Gallery,Highlights
h_images = Highlights.objects.all()
g_images = Gallery.objects.all()
cnt = 1
rows = []
row = []
# Dividing the images into rows of 3 images per row as the maximum and creating a list of those rows
for image in g_images:
if cnt < 3:
row.append(image)
else:
row.append(image)
cnt = 0
rows.append(row)
row = []
cnt += 1
if row:
rows.append(row)
# Seperating the rows into multiple pages to insure faster loading and better optimization
max_rows_per_page = 1
home_page = rows[:max_rows_per_page]
divided_rows_list = []
first = max_rows_per_page
last = max_rows_per_page + max_rows_per_page
curr_page = 1
for i in range(max_rows_per_page, len(rows), max_rows_per_page):
divided_rows_list.append(rows[first:last])
first = last
last += max_rows_per_page
def home(request):
return render(request, 'index.html',{'images':h_images})
def gallery(request):
return render(request, 'gallery.html', {'rows':home_page,'nxt':1,'prev':len(divided_rows_list)})
# return render(request,'gallery.html',{'rows':rows})
def nxt_pg(request,num):
if num > len(divided_rows_list) or num == 0:
return gallery(request)
elif num < 0:
num = len(divided_rows_list)
return render(request, 'gallery.html', {'rows': divided_rows_list[num - 1], 'nxt': num + 1, 'prev': num - 1})
Сначала проблема со статическими файлами: вы назвали папку статических файлов как staticfiles, но URL остался static, поэтому конфигурация nginx нуждается в корректировке:
location /static/ {
alias /home/apple/sanskar_handicrafts/staticfiles;
}
Директива root применяет часть location, а alias - нет. Перезапустите nginx для применения новой конфигурации.
Давайте рассмотрим проблему запроса. Когда мы импортируем файл Python, интерпретатор выполняет его содержимое. Поэтому, когда вы импортируете views.py во время запуска gunicorn, он сразу же выполняет части Highlights.objects.all() и т.д., сохраняет результат в переменной h_images и переходит к следующей строке.
Когда вы открываете главную страницу сайта, вызывающую функцию home view, она будет использовать переменную h_images, которая была выполнена ранее, вместо создания нового запроса. Поэтому она не покажет вновь добавленные элементы.
Исправить это легко: просто переместите все внутрь функции представления или отдельной функции, которая вызывается функцией представления. Не помещайте ничего динамического в глобальную область видимости, потому что оно будет выполнено только один раз при запуске или перезапуске app-сервера.
После этого, а также после каждого изменения кода/settings.py/etc не забудьте перезапустить gunicorn app-server, вызвав:
sudo systemctl restart gunicorn.service
На локальном dev-окружении вы запускаете Django bultin runserver в режиме отладки, который автоматически перезапускается при изменении кода. Но в производственной среде вы должны перезапустить сервер приложений вручную.



