🏠 | 💻 PC | Django |

Django

Contents
Preparation
Domain
Docker
Python
Virtual environment
Installing Django
Starting a project
wsgi.py
Errors
Other articles about the Python language

Подготовка

инструкция Beget

Желательно иметь представление о Python 3 и Bash

Домен

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

Не забудьте разрешить подключение по FTP и SSH

Docker

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

Для этого понадобится имя пользователя на хостинге - это может быть как администратор, так и специально созданный ftp аккаунт.

ssh username@website_url.com

Вместо username введите имя аккаунта у которо есть доступ к хостингу

Вместо website_url.com - ваш домен либо IP address

После того, как вы зашли на хостинг - нужно активировать виртуальное окружение

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

ssh localhost -p222

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

username@localhost's password:

Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.9.132-0-beget-acl x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage

Python

Проверить, установлены ли python3 и pip можно командами

python3 -V
pip3 -V

Python 3.7.0
pip 20.1 from /home/u/user/.local/lib/python3.7/site-packages/pip (python 3.7)

Проверить где находится python3 можно командой

which pyhton3

/home/u/user/.local/bin/python3

Если 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.9.1/Python-3.9.1.tgz && tar -xf Python-3.9.1.tgz && cd Python-3.9.1 && ./configure --prefix=$HOME/.local && make -j $(($(nproc)/3)) && make install

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

(docker) aredel.com@server:~ [0] $ vi .bashrc

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

aredel.com@server:~ [0] $ which python3

/home/u/user/.local/bin/python3

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

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

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

source ~/.bashrc

Виртуальное окружение

Часто полезно пользоваться виртуальным окружением. Создавать их можно разными способами, например с помощью:

Например

python3 -m venv venv_django
source venv_django/bin/activate

Обычно при активации виртуального окружения в терминале перед именем пользователя появляется называние окружения в круглых скобках.

Например

(venv) andrey@eth1.ru:~/user/

Внутри containerа вы скорее всего уже видите (docker) а название окружения может и не появиться.

To проверить перешли вы в окружение или нет executei

which python3

/home/u/user/venv_django/bin/python3

Как вы можете проверить здесь - до входа в окружение использовался другой Python

Либо перейдите в интерактивный режим

python3

>>>
>>> import sys

Выполните две команды

>>> sys.prefix

и

>>> sys.base_prefix

Они должны показать разный результат

Установка Django

Первым делом советую обновить pip

python3 -m pip install --upgrade pip

Затем непосредственно установить Django

python3 -m pip install django

Проверить установку

python3 -m django --version

3.2.4

или

python3 -m pip list

Package Version ----------------- -------- asgiref 3.3.4 Django 3.2.4 pip 21.1.2 pytz 2021.1 setuptools 39.0.1 sqlparse 0.4.1 typing-extensions 3.10.0.0

(docker) aredel.com@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) aredel.com@server:~/HelloDjango [0] $ ls HelloDjango manage.py (docker) aredel.com@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.aredel.com

Запуск первого проекта в Django

Запуск Django

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

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

django-admin startproject Project_Name

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

ls /home/u/user/site.ru/venv_django/bin/Project_Name

manage.py Project_Name

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

ls /home/u/user/site.ru/venv_django/bin/Project_Name/Project_Name

__init__.py

settings.py

urls.py

wsgi.py

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

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

Пример файла manage.py

#!/usr/bin/env python """Django's command-line utility for administrative tasks.""" import os import sys def main(): """Run administrative tasks.""" os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Project_Name.settings') try: from django.core.management import execute_from_command_line except ImportError as exc: raise 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?" ) from exc execute_from_command_line(sys.argv) if __name__ == '__main__': main()

wsgi.py

Для настройки wsgi.py понадобятся путь до Django и путь до проекта.

Путь до Django можно получить выполнив

python3 -c "import django; print(django.get_version()); print(django.__file__)"

3.2.4
/home/u/user/site.ru/venv_django/lib/python3.7/site-packages/django/__init__.py

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

ls /home/u/user/site.ru/venv_django/bin/Project_Name/Project_Name

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

Из той же директории в которой находится скрипт 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:~/aredel.com [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.aredel.com','127.0.0.1','localhost','aredel.com','www.aredel.com']

Файлы Django
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

Errors

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

Python не находит Django

(docker) aredel.com@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.aredel.com','127.0.0.1','localhost','aredel.com','www.aredel.com']

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

DisallowedHost at / Invalid HTTP_HOST header: 'www.aredel.com'. You may need to add 'www.aredel.com' to ALLOWED_HOSTS. Request Method: GET Request URL: http://www.aredel.com/ Django Version: 2.1.5 Exception Type: DisallowedHost Exception Value: Invalid HTTP_HOST header: 'www.aredel.com'. You may need to add 'www.aredel.com' 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/aredel.com/public_html/HelloDjango', '/home/a/andreyolegovichru/.local/lib/python3.7/site-packages', '/home/a/andreyolegovichru/aredel.com', '/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:~/aredel.com [0] $ touch tmp/restart.txt

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

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

# -*- coding: utf-8 -*-
import os, sys
sys.path.insert(0, '/home/a/andreyolegovich/aredel.com/public_html/Project_1')
#sys.path.insert(0, '/home/a/andreyolegovich/aredel.com/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

Видеоуроки

Статьи о Python
Development на Python
Интерактивный режим
Виртуальное окружение
str: строки
\: перенос строки
Списки
Циклы
Методы
Функции
*args **kwargs
enum
Опеределить тип переменной Python
Тестирование с помощью Python
Работа с REST API на Python
Файлы: записать, прочитать, дописать, контекстный менеджер…
Скачать файл по сети
SQLite3: работа с БД
datetime: Date and Time в Python
Selenium + Python
Сложности при работе с Python
Flask
Скрипт для ZPL принтера
socket :Python Sockets
subprocess: выполнение bash команд из Python
multiprocessing: несколько процессов одновременно
psutil: cистемные ресурсы
sys.argv: аргументы командной строки
PyCharm: IDE
pydantic: валидация данных
paramiko: SSH из Python
enumerate
json.dumps
Share in social media: