GeekBrains
РОСБАНК [CPS] RU
Dfsport
↑↑

↓↓
Флаг России Флаг Англии
🏠 | 💻 PC | Django |

Создать сайт на Django

Содержание статьи
GeekBrains Подготовка
Домен
Docker
Python
Запуск проекта
Ошибки

Подготовка</h2>

инструкция Beget

Домен

На хостинге создаём сайт и прикрепляем к нему домен.

Docker

Сначала необходимо подключиться к серверу по SSH:

deniawin@deniawin-Satellite-C850-D2K:~$ ssh denia0d3@matrix.beget.com

Для перехода в виртуальное окружение Docker нужно выполнить следующую команду:

$ ssh localhost -p222

После чего ещё раз ввести пароль для доступа к аккаунту.

denia0d3@localhost's password:

Welcome to Ubuntu 12.04.5 LTS (GNU/Linux 4.0.5-5-beget-acl x86_64)

* Documentation: https://help.ubuntu.com/
(docker) denia0d3@matrix:~ [0] $

Python

Установка Python

Подробнее про установку программ в Linux с помощью configure_make_make-install читайте здесь

(docker) login@server:~ [0] $ mkdir -p .beget/tmp &&

cd .beget/tmp &&

wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz &&

tar -xf libffi-3.2.1.tar.gz &&

cd libffi-3.2.1 &&

./configure --prefix=$HOME/.local &&

make -j $(($(nproc)/3)) &&

make install &&

mkdir ~/.local/include &&

cp x86_64-unknown-linux-gnu/include/ffi.h ~/.local/include/ &&

cp x86_64-unknown-linux-gnu/include/ffitarget.h ~/.local/include/ (docker) login@server:~ [0] $ cd ~/.beget/tmp &&

wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz &&

tar -xf Python-3.7.0.tgz &&

cd Python-3.7.0 &&

./configure --prefix=$HOME/.local &&

make -j $(($(nproc)/3)) &&

make install

Затем нужно в .bashrc данного аккаунта прописать $PATH до директории ~/.local/bin/ или алиас для python3,

(docker) andreyolegovich.ru@server:~ [0] $ vi .bashrc

Проверим путь до python3

andreyolegovich.ru@server:~ [0] $ which python3

/home/a/andreyolegovichru/.local/bin//python3

Этот путь нам и нужно прописать в PATH. Отбросим только /python3

PATH=/home/a/andreyolegovichru/.local/bin/:$PATH

И перезапустить .bashrc

source ~/.bashrc

(docker) andreyolegovich.ru@server:~/HelloDjango [0] $ python3 -m django

Type 'python -m django help ' for help on a specific subcommand.

Available subcommands:

[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
runserver
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.).

(docker) andreyolegovich.ru@server:~/HelloDjango [0] $ ls
HelloDjango manage.py

(docker) andreyolegovich.ru@server:~/HelloDjango [0] $ python3 manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

February 03, 2019 - 18:50:29
Django version 2.1.5, using settings 'HelloDjango.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

python3 manage.py migrate

Структура директорий для Django изображение
с сайта www.andreyolegovich.ru

Запуск первого проекта в Django</h2>

Запуск Django

Переходим в директорию в которой нужно создать проект. Например в public_html.

Выполняем команду

django-admin startproject Project_Name

После удачного выполнения этой команды создаётся директория Project_Name , внутри которой будет находится файл manage.py и ещё одна директория с таким же именем - Project_Name.

Внутри вложенной директории Project_Name находятся файлы

__init__.py

settings.py

urls.py

wsgi.py

WSGI расшифровывается как Web Server Gateway Interface.

Это стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером например Apache

Запуск сервера

Из той же директории в которой находится скрипт manage.py вводим командую

python3 manage.py runserver

Performing system checks...

System check identified no issues (0 silenced).
February 06, 2019 - 20:54:38
Django version 2.1.5, using settings 'Project_Name.settings'
Starting development server at http://127.0.0.1:8000/

В каждом проекте (project) обычно используется одно или несколько приложений (application)

Когда все приложения и конфигурации объединены они составляют веб-приложение.

applications + configurations = web application

Создаём первое приложение

python3 manage.py startapp first_app

Появится директория first_app в которой будут следующие файлы

admin.py

apps.py

__init__.py

migrations

models.py

tests.py

views.py

Создаём view и связываем с url

Переходим в директорию Project_Name/Project_Name

Редактируем файл Project_Name/Project_Name/settings.py

Нужно добавить в список установленных приложений наше новое приложение first_app

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'first_app', ]

Перезапускаем сервер

python3 manage.py runserver

Если перезапуск осуществляется с помощью скрипта выполняем (насколько я знаю, это актуально для хостингов beget и dreamhost)

(docker) andreyolegovich@server:~/andreyolegovich.ru [0] $ touch tmp/restart.txt

Переходим в директорию с приложением Project_Name/first_app и редактируем views.py , чтобы создать наш первый view.

Каждый view должен возвращать какойто HttpResponse объект.

Добавляем следущий код в файл Project_Name/first_app/views.py:

from django.http import HttpResponse def index(request):    return HttpResponse("Hello World!")

Теперь нужно привязать этот view к какой-то url

Добавляем следующий код в файл urls.py

from first_app import views.index urlpatterns = [ path('', views.index, name='index'), ]

Добавляем домен, на котором Вы разворачиваете сайт в ALLOWED_HOSTS файла (из проекта) settings.py

ALLOWED_HOSTS = ['http://www.andreyolegovich.ru','127.0.0.1','localhost','andreyolegovich.ru','www.andreyolegovich.ru']

Файлы Django</caption>
Project_Name</th>
Project_Namefirst_apptemplates
__init.py__

__pycache__


settings.py

connection to first_app by
INSTALLED_APPS = ['first_app', ]
connection to templates by
TEMPLATES_DIR = os.path.join( BASE_DIR, "templates")


urls.py

wsgi.py
admin.py

apps.py

__init.py__

migrations

models.py

__pycache__

test.py

urls.py

views.py
first_app

Ошибки

Список известных мне ошибок
Python не находит Django
Disallowed host
Не работает runserver
Web application could not be started

Python не находит Django

(docker) andreyolegovich.ru@server:~/HelloDjango [0] $ python3 manage.py runserver
Traceback (most recent call last):
File "manage.py", line 8, in <module>
from django.core.management import execute_from_command_line

ModuleNotFoundError: No module named 'django'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "manage.py", line 14, in <module>
) from exc
ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?

Причина в том, что в PATH не прописан путь до python. Вернитесь к шагу PATH

Disallowed host

Вы можете запустить django с помощью

python3 manage.py runserver

И прописали в settings.py свои хосты, например так

ALLOWED_HOSTS = ['http://www.andreyolegovich.ru','127.0.0.1','localhost','andreyolegovich.ru','www.andreyolegovich.ru']

Но при обращении к домену в браузере появляется ошибка DisallowedHost

DisallowedHost at /
Invalid HTTP_HOST header: 'www.andreyolegovich.ru'. You may need to add 'www.andreyolegovich.ru' to ALLOWED_HOSTS.
Request Method: GET
Request URL: http://www.andreyolegovich.ru/
Django Version: 2.1.5
Exception Type: DisallowedHost
Exception Value:
Invalid HTTP_HOST header: 'www.andreyolegovich.ru'. You may need to add 'www.andreyolegovich.ru' to ALLOWED_HOSTS.
Exception Location: /home/a/andreyolegovichru/.local/lib/python3.7/site-packages/django/http/request.py in get_host, line 106
Python Executable: /home/a/andreyolegovichru/.local/bin/python3.7
Python Version: 3.7.0
Python Path:
['/home/a/andreyolegovichru/andreyolegovich.ru/public_html/HelloDjango',
'/home/a/andreyolegovichru/.local/lib/python3.7/site-packages',
'/home/a/andreyolegovichru/andreyolegovich.ru',
'/opt/passenger40/helper-scripts',
'/home/a/andreyolegovichru/.local/lib/python37.zip',
'/home/a/andreyolegovichru/.local/lib/python3.7',
'/home/a/andreyolegovichru/.local/lib/python3.7/lib-dynload',
'/home/a/andreyolegovichru/.local/lib/python3.7/site-packages']
Server time: Sun, 3 Feb 2019 20:07:57 +0000

Проверьте, всё ли правильно прописали в settings.py ALLOWED_HOSTS.

Выключите Django, закройте все консоли подключенные к хостингу или все консоли на локальной машине.

Очистите кэш браузера или откройте url другим браузером.

Не работает runserver Django

Если Вы выполняете команду

python3 manage.py runserver

И ничего не происходит, или например, у Вас работал самый первый проект, а запустить второй не получается - скорее всего дело в хостинге. На нём может быть закрыта возможность слушать порты и выбор рабочего проекта происходит с помощью какого-то скрипта.

Если Вы, как и я, пользуетесь хостингом beget , тот этот скипт будет называться passenger_wsgi.py и лежать будет на одном уровне с директорией public_html.

Пропишите в нём

os.environ['DJANGO_SETTINGS_MODULE'] = 'Название_нового_прокта.settings'

Web application could not be started

Если Вы хотите переключиться между проектами и уже обновили скрипе passenger_wsgi.py но получили ошибку

Web application could not be started

Скорее всего Вы забыли пересоздать файл tmp/restart.txt

(docker) andreyolegovich@server:~/andreyolegovich.ru [0] $ touch tmp/restart.txt

Также советую перепроверить не забыли ли Вы поменть системный путь на нужный Вам проект.

При смене проекта обычно нужно делать два изменения в файле passenger_wsgi.py

# -*- coding: utf-8 -*-
import os, sys
sys.path.insert(0, '/home/a/andreyolegovich/andreyolegovich.ru/public_html/Project_1')
#sys.path.insert(0, '/home/a/andreyolegovich/andreyolegovich.ru/public_html/Project_2')
sys.path.insert(1, '/home/a/andreyolegovich/.local/lib/python3.7/site-packages')
os.environ['DJANGO_SETTINGS_MODULE'] = 'Project_1.settings'
#os.environ['DJANGO_SETTINGS_MODULE'] = 'Project_2.settings'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Ещё одна возможная причина - незаданные переменные в файле manage.py

Видеоуроки</h2>

Если сайт не помог, извиняемся за потраченное время - хочу заверить, что мы стараемся не попадать в нерелевантные запросы, но тем не менее не всегда успеваем обновлять ключевые слова. Ну и контролировать поисковую выдачу, конечно, невозможно.

Например: у нас есть статья про аэропорт Хельсинки и про аэропорт Риги но в выдаче по Риге всё равно статья про Хельсинки.

Если статья Вам помогла, нажимайте ДА. Так мы поймём, что переделывать её не нужно.

Занятно наблюдать в вебвизоре, как люди копируют текст, например вежливого отказа в трудоустройстве на английском но игнорируют кнопку ДА.

Сделаем поиск лучше!

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: