Хостинг Django из каталога
Моя структура каталогов выглядит следующим образом:
C:\htdocs # web root
|_ django-container
+- django-project
| +- core # startproject
| |_ myapp1 # startapp
+- public
+- static # STATIC_ROOT, collectstatic
| +- css
| +- images
| |_ js
|_ media # MEDIA_ROOT
Nginx config:
http {
# ...
upstream wsgi-server {
server 127.0.0.1:8080;
}
server {
# ...
location /mysite/ {
proxy_pass http://wsgi-server/;
}
location /mysite/public/media/ {
alias C:/htdocs/django-container/public/media/;
autoindex off;
}
location /mysite/public/static/ {
alias C:/htdocs/django-container/public/static/;
autoindex off;
}
}
}
Я запускаю waitress
WSGI-сервер в качестве службы на порту 8000, который работает core.wsgi.application
. Мои settings.MEDIA_URL
и settings.STATIC_URL
являются public/media/
и public/static/
соответственно.
Когда я делаю редиректы в приложении или создаю урлы в шаблонах, в них нет сегмента mysite
, из-за чего все ссылки не работают. Даже ссылки public/static/
и public/media/
. Для последних двух я могу добавить сегмент в settings.STATIC_URL
и settings.MEDIA_URL
, но мне нужен общий способ добавления сегмента mysite
во всех местах, желательно автоматически, если это возможно.
Согласно документации по Django, нужно было просто установить FORCE_SCRIPT_NAME = '/mysite'
в core.settings
. Это сработало для всех редиректов, URL, статических и медиа файлов одним выстрелом, никаких других изменений в Django не потребовалось.
Но теперь у меня возникла другая проблема из-за добавления этого. python manage.py runserver
теперь не работает Page Not Found - Request URL: http://localhost:8000/mysite/mysite/account/
, когда в адресе браузера есть только http://localhost:8000/mysite/account/
.
В качестве быстрого решения я поместил FORCE_SCRIPT_NAME в yaml-файл, который читается в settings.py
. Я управляю этим yaml, когда хочу запустить его с помощью runserver
или под управлением отдельного WSGI-сервера. Если у кого-то есть лучшее решение, которое работает для обоих вариантов, пожалуйста, добавьте свой ответ.