Создание простого приложения на Django 2

👁 82 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Цикл минималистичных статей для запоминания и быстрой разработки простого блога на Django 2.x / Python 3.x.

Это не полноценный гайд, чтобы с нуля разобраться в Django тут не описаны такие вещи, как установка Python, установка виртуальных сред и т.п.

  1. Установка Django и создание первого приложения
  2. Маршрутизация и генерация ответа пользователю
  3. Шаблоны и наследование шаблонов в Django
  4. Создание модели ORM, вывод из базы данных в шаблоны Django
  5. Облако тегов через связь ManyToMany и принцип DRY в Django
  6. Виды в виде классов(Class Based Views) и использование миксинов
  7. Работа с формами Form, ModelForm и валидация данных в Django

Введение в Django Channels

👁 113 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Добро пожаловать в Django Channels! Каналы меняют Django, чтобы сплести под ним асинхронный код через синхронное ядро, позволяя проектам на Django обрабатывать не только HTTP, но и протоколы, которые требуют подключения соединения на длительное время — WebSockets, MQTT, чатботы, пользовательское радио и многое другое.

Это происходит в то время, когда Django остается синхронным и простым в использовании, позволяя нам выбрать то, как написать наш код: синхронно в стиле Django Views или смешав с асинхронным. Помимо этого он предоставляет интеграцию с такими модулями Django, как система авторизации, система сессий и др., что упрощает, как никогда, расширение нашего проекта, имея только HTTP-протокол, до других протоколов.

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

Черепахи всегда идут вниз

Channels оперируют по принципу «первый вошел — первым вышел». У нас есть единая идея или картина того, что есть приложения в виде Channels и даже самый простой Consumer(эквивалент Views  в Django) является полными работоспособными приложениями ASGI, которые вы можете запускать самостоятельно.

Channels дают вам инструмент, чтобы написать базовые consumers — индивидуальные части, которые могу обрабатывать сообщения чата или уведомления — и связывать их вместе с машрутизацией URL, обнаружением протокола и другими удобными вещами, чтобы создавать полноценное приложением.

Мы рассматриваем HTTP и существующие Django Views, как части большого целого. Традиционно Django Views все также существуют с Channels и все также используемы — мы оборачиваем их в ASGI приложение, называемое channels.http.AsgiHandler . Теперь вы можете написать свой long-polling HTTP — обработчик или приемники WebSocket и бок о бок с существующим кодом Django. URL — маршрутизация и промежуточные модули — это все простые приложения ASGI.

Мы убеждены в том, что вы хотели сохранить возможность использования синхронной техники Django для большинства кода, но иметь опцию прямого асинхронного интерфейса для сложных задач.

Области и события

Channels и ASGI разделяют входящее соединение на 2 компонента: scope(областью) и серия events(событий).

Scope — это набор подробностей о одном входящем соединении — например, путь, по которому веб-запрос был сделан или исходящий IP-адрес WebSocket, или пользовательский обмен сообщениями с чатом — и это сохраняется в течение всего соединения.

Для HTTP протокола scope — это просто один произошедший запрос. Для WebSocket он является жизненным циклом сокета (но изменяется, если сокет закрывается и повторно соединяется).

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

В течение всего срока действия этой Scope(области) происходит ряд Events(событий). Они представляют пользовательское взаимодействие — создание HTTP — запроса, WebSocket — фрейм и т.д.

Наши каналы или приложения ASGI будут создаваться один раз для каждой Scope(области), а затем будут передаваться поток Events(событий), происходящих в этой области, чтобы решить, что делать.

Пример с HTTP:

  • пользователь создает запрос HTTP;
  • мы открываем новую Scope(область) типа http с деталями пути запроса, метода, заголовков, и т.д.
  • мы отправляем событие  http.request с контентом тела HTTP;
  • приложения Channels или ASG обрабатывают это и генерируют событие http.response для обратного ответа браузеру и закрывает соединение;
  • HTTP — request(запрос)/response(ответ) заканчиваются и Scope(область) уничтожается.

Пример с чатом:

  • пользователь отправляет первое сообщение чату;
  • открывается Scope(область), которая содержит пользовательский ник, выбранного имени и пользовательский ID;
  • программа получает Events(событие) chat.received_message с текстом события. Оно не имеет ответ, должен быть один, два или больше в качестве Events(события) chat.send_message если есть в этом потребность;
  • чем больше пользователь отправляет в чат сообщений тем больше генерируются Events(события) <span chat.received_message
  • после таймаута или когда процесс программы возобновляется Scope(область) закрывается.

В течение срока действия Scope(области) — будь то чат, HTTP-запрос, сокет-соединение или что-то еще — у вас будет один экземпляр приложения, обрабатывающий все события из него, и вы также сможете перенести вещи на экземпляр приложения. Вы можете выбрать, если хотите, сырое приложение ASGI, но Channels(каналы) дают вам удобную абстракцию над ними, называемую Consumers(потребителями).

Что такое Consumer?

Consumer — это потребитель событий и является базовой единицей в коде Channels. Мы называем его Consumer(потребитель), так как он потребляет события, но вы можете подумать об этом, как об ихнем маленьком приложении. Когда приходит запрос или новый сокет, Chanells(каналы) будут следовать их таблице маршрутизации — мы рассмотрим немного этот момент — находят там правильного/нужного Consumer(потребителя) для этих входящих соединений и запустит на выполнение его копию.

Это значит, что в отличии от Views(видов) Django, Consumers(потребители) рассчитаны на запуск в долгое время работы. Они также могут быть запущены на короткое время — ведь, HTTP запросы могут быть обработаны и Consumers(потребителями) — но они построены вокруг идеи жизни в короткий промежуток( они живут в течении Scope(области), которых мы описали выше).

Ниже представлен базовый Consumer(потребитель):

class ChatConsumer(WebsocketConsumer):

    def connect(self):
        self.username = "Anonymous"
        self.accept()
        self.send(text_data="[Welcome %s!]" % self.username)

    def receive(self, *, text_data):
        if text_data.startswith("/name"):
            self.username = text_data[5:].strip()
            self.send(text_data="[set your username to %s]" % self.username)
        else:
            self.send(text_data=self.username + ": " + text_data)

    def disconnect(self, message):
        pass<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

Каждый из разных протоколов имеет разный способ появления событий и каждый тип реализован различным методом. Вы пишете код обработки каждого события и Channels(каналы) позаботятся об их расписании выполнения их всех в параллельном режиме.

Внизу, Channels(каналы) запущены в полном асинхронном событийном цикле и если вы пишете код, похожий выше, то он будет вызван в синхронном потоке. Это означает, что вы безопасно выполнять блокирующие операции, такие как вызов Django ORM:

class LogConsumer(WebsocketConsumer):

    def connect(self, message):
        Log.objects.create(
            type="connected",
            client=self.scope["client"],
        )<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

Однако, если вы хотите больше контроля, и вы готовы работать только в асинхронных функциях, вы можете написать полностью асинхронных Consumers(потребителей):

class PingConsumer(AsyncConsumer):
    async def websocket_connect(self, message):
        await self.send({
            "type": "websocket.accept",
        })

    async def websocket_receive(self, message):
        await asyncio.sleep(1)
        await self.send({
            "type": "websocket.send",
            "text": "pong",
        })<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

Вы можете прочесть больше про Customers(потребителей) по ссылке на официальный сайт.

Маршрутизация и мультипротокольность

Вы можете комбинировать несколько Consumers(потребителей), которые являются, если вспомнить, их собственнымиASGI приложениями, в одно большое приложение, которое будет представляет ваш проект с маршрутизацией:

application = URLRouter([
    url(r"^chat/admin/$", AdminChatConsumer),
    url(r"^chat/$", PublicChatConsumer),
])

Channels(каналы) не только построены вокруг мира HTTP и WebSockets, но также позволяют нам построить любой протокол внутри Django среды, создавая сервер, который отображает эти протоколы в один и тот же набор событий. К примеру, вы можете построить бот чата с стиле:

class ChattyBotConsumer(SyncConsumer):
    def telegram_message(self, message):
        """
        Simple echo handler for telegram messages in any chat.
        """
        self.send({
            "type": "telegram.message",
            "text": "You said: %s" % message["text"],
        })

И затем используем другой маршрутизатор, чтобы один проект мог обслуживать как WebSockets, так и чат-запросы:

application = ProtocolTypeRouter({

    "websocket": URLRouter([
        url(r"^chat/admin/$", AdminChatConsumer),
        url(r"^chat/$", PublicChatConsumer),
    ]),

    "telegram": ChattyBotConsumer,
})

Цель Channels(каналов)- это позволить вам построить ваши собственные Django проекты для работы через любой протокол или транспорт, с которыми вы можете столкнуться в современном WEB, позволяя вам работать со знакомыми компонентами и стилем кодирования, к которому вы привыкли.

Больше информации про протоколы и маршрутизацию можно узнать по ссылке.

Кросспроцессная коммуникация

Как стандартный WSGI-сервер, ваш код приложения, обрабатывающий события протокола, выполняется внутри самого процесса сервера — например, код обработки WebSocket выполняется внутри вашего сервера WebSocket.

Каждый сокет или соединение с вашим общим приложением обрабатывается экземпляром приложения на одном из этих серверов. Они получают вызов и могут напрямую отправлять данные клиенту.

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

Вы можете сделать запрос к базе данных, но Channels(каналы) вносят идею канального слоя, низкоуровневую абстракцию вокруг набора транспортов, которые позволяют вам отправлять информацию между различными процессами. Каждая сущность приложения имеет уникальное канальное имя, и может присоединяться к группам, позволяя отправлять сообщения между точками или широковещать на целую группу.

Канальный слой — это дополнение к Channels(каналам) и может быть запрещен, если он не нужен. для этого нужно установить для CHANNEL_LAYERS пустое значение.

Вы также можете отправлять сообщения в выделенный процесс, который прослушивает самостоятельно, фиксированное имя канала:

# In a consumer
self.channel_layer.send(
    "myproject.thumbnail_notifications",
    {
        "type": "thumbnail.generate",
        "id": 90902949,
    },
)

Вы можете почитать еще больше про канальный слой на офф-сайте Channel Layers.

Интеграция с Django

Channels(каналы) поставляются с простой поддержкой обычных функций Django, таких как сеансы и аутентификация. Вы можете объединить аутентификацию с Views(представлениями) WebSocket, просто добавив к ним правильное middleware:

application = ProtocolTypeRouter({
    "websocket": AuthMiddlewareStack(
        URLRouter([
            url(r"^front(end)/$", consumers.AsyncChatConsumer),
        ])
    ),
})

Для дополнительной информации можно почитать Sessions и Authentication.

Установка и настройка Cygwin с Netbeans

👁 178 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

NetBeans позволяет работать с проектами на C++. Это отличное кроссплатформенное решение или хотя бы пойдет для написания мелкой игрушки.

Исходные данные

  • Установленный NetBeans 8.2;
  • Windows 10
  • Стандартный плагин для NetBeans C/C++;
  • Cygwin — UNIX подобное окружение для Windows с установленным в нем GCC, G++, Make, GDB.

Плагин NetBeans C/C++

Плагин ставится очень легче в меню «Tools > Plugins» / «Сервис > Подключаемые модули»

На скриншоте он у меня уже установлен

 

Скачивание и установка Cygwin и его компонентов

Для скачивания идем на официальный сайт в раздел и выбираем либо setup-x86_64.exe либо setup-x86.exe.

Это будет не установщик, а загрузчик компонентов

Основной смысл загрузчика - указать нужные компоненты и загрузить, указав папку Cygwin

На 6-м шаге нужно искать компоненты, которые соответствуют GCC, G++, Make, GDB. После установки нужно добавить пусть C:/Cygwin/bin в переменную PATH Windows, после чего открываем командную строку Windows и проверяем на то, что все компоненты глобально вызываются через консоль:

cygcheck -c cygwin
gcc --version
g++ --version
make --version
gdb --version<br>

 

Конфигурация Cygwin с NetBeans

Для этого открываем диалог параметров «Сервис > Параметры» , кликаем на вкладку «С/C++»

Окно параметров C/C++ в NetBeans
Окно параметров C/C++ в NetBeans

Создаем новый набор средств и задаем базовую папку, как C:/Cygwin/bin и все нужные инструменты автоматически установятся в полях с права, а если не установились, то задаем вручную или проверяем на то, что мы установили правильные компоненты.

Создание проекта С/C++ в NetBeans

В общем, ничего нового, стандартно создаем проект и указываем, что нужно создать:

  • приложение;
  • статическую библиотеку;
  • динамическую библиотеку;
  • и т.п.
Создание нового проекта C/C++ в NetBeans
Создание нового проекта C/C++ в NetBeans

Мы создадим приложение, чтобы потом указать на еще один ньюанс с настройкой построения и запуска проекта. Самая распространенная ошибка после интеграции — неправильно указанная консоль запуска. По умолчанию этот параметр установлен так, что используется стандартная консоль Cygwin,  а не Windows, из-за чего проект иногда может не запускаться из среды NetBeans, ссылаясь на то, что не может найти путь с параметром пути /cygdrive/путь_до_папки_проекта. Решается это легко заменой стандартной консоли Cygwin на консоль Windows или на консоль вывода NetBeans

Окно свойств проекта. Указание терминала запуска
Окно свойств проекта. Указание терминала запуска

 

Установка и настройка домена для сайта Django на VPS

👁 166 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

После того, как проект готов, нужно, чтобы им можно пользоваться через доменное имя второго или третьего уровня project.mydomen.ru или mydomen.ru.

На самом деле, нет разницы какого уровня будет домен. В данном примере условимся, что нам нужен субдомен нашего домена выделить под проект на Django. Если он будет третьего уровня, то надо будет дописать в DNS — редакторе регистратора запись CNAME именем project и www.project со значениями mydomen.ru. 

Пример создания субдомена в DNS в панели регистратора домена
Пример создания субдомена в DNS в панели регистратора домена. Обратите внимание на точку в конце значения.

 

Замечание. Не забываем, что если даже NS — сервера вы добавили к вашему домену регистратора, то это не полностью означает, что этот домен уже будет прикреплен к вашему VPS. Вторым шагом после этого является создание со стороны VPS доменной зоны под этот домен и субдомен. Если домен куплен там же, где VPS, то , в большинстве этот процесс должен быть автоматизирован, но не факт.

Далее у нас может быть несколько случаев развития событий:

  • у нас в системе установлена какая-то готовая панель, на подобие VestaCP, в который уже входит нужный инструментарий;
  • нам нужно ставить все сервисы и пакеты с нуля.

Разберем оба варианта. В случае панели управления покажу как это делать с VestaCP.

Замечание. С установкой Nginx и с работой вспомогательных утилит для стабильной работы проекта Django на продакшн мы уже сталкивались в Деплой проекта Django в продакшн с Nginx + Gunicorn + Supervisor. В данном статье повторим путь с уклоном на понимание процесса прикрепления домена к проекту, если нам не нужен VestaCP.

Установка домена под проект Django, используя VestaCP

VestaCP уже содержит сервер Nginx, который нам будет нужен, чтобы перенаправить все запросы к нашему проекту на Django.

1. Создаем новый WEB- сайт в панели VestaCP

Создание нового WEB-проекта
Создание нового WEB-проекта

2. Редактируем конфигурационный файл Nginx по пути /home/<user>/web/conf/web/project.mydomen.ru.nginx.conf

Меняем содержимое, на подобие ниже и не забываем прописывать данные своего проекта. Порт текущего проекта 8001, если у вас другой — меняем на свой

server {
    #Все обращения на 80-м порту Nginx будет проверять
    #на соответствие нашему субдомену проекта
    listen      IP_ADRESS_OF_MY_VPS:80;
    server_name project.mydomen.ru www.project.mydomen.ru;
    error_log  /var/log/apache2/domains/project.mydomen.ru.error.log error;
	
    #Указываем путь к папке, где будут храниться статические данные сайта
    location /static/ {
        root /home/myprojectenv/project/;#Путь к папке проекта
        expires 30d;
    }
	
    #Указываем IP адрес проекта и порт, на котором он запущен.
    location / {
        proxy_pass      http://IP_ADRESS_OF_MY_VPS:8001;
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    #Обработка ошибок
    location /error/ {
        alias   /home/admin/web/project.mydomen.ru/document_errors/;
    }

    location @fallback {
        proxy_pass      http://IP_ADRESS_OF_MY_VPS:8001;
    }

    location ~ /\.ht    {return 404;}
    location ~ /\.svn/  {return 404;}
    location ~ /\.git/  {return 404;}
    location ~ /\.hg/   {return 404;}
    location ~ /\.bzr/  {return 404;}

    include /home/admin/conf/web/nginx.project.mydomen.ru.conf*;
}

 

3. Перезапускаем сервер Nginx в панели VestaCP

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

Далее заходим по адресу project.mydomen.ru и убеждаемся, что по нему открывается наш проект на Django.

 

Установка домена под проект Django, используя только Nginx.

Ставим Nginx

sudo apt-get install nginx

Теперь идем и настраиваем Nginx по пути в файле

cd /etc/nginx/sites-available/

открываем файлик default

nano default

и перепишем некоторые моменты, как ниже

server {
    listen 80;
    server_name project.mydomen.ru;
    access_log  /var/log/nginx/example.log;

    location /static/ {
        root /home/myprojectenv/project/;
        expires 30d;
    }

    location / {
        proxy_pass http://IP_ADRESS_OF_MY_VPS:8001; 
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

сохраняем и выходим.

Выполняем перезапуск Nginx, чтобы изменения вступили в силу

sudo service nginx restart

Заходим по адресу project.mydomen.ru и проверяем. Если не сработало, то читаем статью, которая тесно с этим пунктом связана.

Основные команды и операции в терминале Linux

👁 55 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Команды

Объединение нескольких команд в одну последовательную операцию

$ cmd1 && cmd2 && cmd3

Установка нескольких пакетов за раз

$ apt-get install package1 package2 package3

Навигации

pwd — («Path Working Directory») абсолютный путь до текущей рабочей папки

ls [-a][-l] — («LiSt»)список всех файлов в текущей папке.

  • [-a] — показать все файлы, даже скрытые;
  • [-l] — показать длинную(полную) информацию о файлах;
  • [-la] — комбинация обеих ключей;

cd — («Change Directory»)смена директории.

  • [TAB] — позволяет автодополнять название папки, если такая имеется, при введени неполного имени

Shift + ~ — переход в домашнюю папку;

../.. — то же самое. Переход в домашнюю папку;

cat [filename] — («CATenate») читает данные из файла или стандартного ввода и выводит их на экран.

clear или Ctrl + L — очищает экран.

Работа с файлами и директориями

touch [fname.txt] — создание нового файла.

  • [{fname1,fname2,fname3}.txt] — создание нескольких файлов за раз. Список пишется без пробелов;

mkdir [dname] — («MaKe DIRectory»)создание директории.

rm [fname] — («ReMove»)удаление файла.

rm [-r][dname] — удаление директории с содержимым.

cp [fname1] [fname2] — («CoPy»)копирование файла.

mv [fname1] [fname2] — («MoVe»)перемещение или переименование файла.

Регулярные выражения POSIX / PERL

grep [-inwo][-rlс][-P][-f] [-A 2] [-B 2] [-C 2] [«pattern»] [«filename»]— («Gloval Regular ExPressions») регулярные выражения для использования в обработке данных и файлов

  • [-i] — («Ignore»)фильтр игнорирует регистр;
  • [-n] — («Number»)фильтр выводит номера строк совпадений
  • [-w] — («Word»)фильтр поиска слова целиком. Т.е., ищет при точном совпадении, а не при вхождении
  • [-o] — («Only»)фильтр вывода только строки вхождения
  • [-r] — («Recursive»)фильтр рекурсивного поиска, если файлов много
  • [-l] — («List»)фильтр вывода списка файлов с совпадениями
  • [-c] — («Count»)фильтр вывода количества совпадений в файле
  • [-P] — («Perl»)перевод регулярного выражения в совместимый с языком Perl/Python
  • [-f] — («File»)фильтр, указывающий, что шаблоны или список шаблонов РВ берутся из файла
  • [-A N] — («After»)контекст посде совпадения на N строк
  • [-B N] — («Before»)контекст перед совпадением на N строк
  • [-C N] — («Context»)контекст перед и до совпадения на N строк
  • [«pattern»] — Строка совпадения или шаблон поиска регулярного выражения
  • [«filename»] — файл(«file.txt») или список файлов в директории(folder/*)

Пример 1: grep -Pno «\d{3}-\d{2}-\d{2}» file.txt > log.text — поиск совпадений шаблона номера в файле и запись результата в текстовый файл
Пример 2: rep -Pnof patterns.txt file.txt > log.text — в данном случае операция соответствует первому примеру, но шаблон(ы) берется(утся) из файла «patterns.txt», в котором шаблон записан в виде «\d{3}-\d{2}-\d{2}»

Алиасы

Примечание. Все алиасы хранятся в файле ~/.bashrc и добавляются конец файла по мере необходимости. После каждого добавления нужно обновить этот файла командой . ~/.bashrc или командой source ~/.bashrc

Пример 1: alias activate=’source bin/activate’ — теперь достаточно зайти в папку виртуальной среды и выполнить команду activate, чтобы теперь активировать виртуальную среду.

Установка и работа с базами данных MySQL и PostgreSQL

База данных бывает полезна для поделок и работы в терминале Linux. В роли реляционной БД можно использовать самые известные: MySQL и PostgreSQL.

Установка MySQL

Установка

$ sudo apt-get install mysql-server mysql-client

в процессе установки система затребует пароль для пользователя по умолчанию БД MySQL root и надо будет ее ввести.

Входим в интерпретатор команд SQL

$ mysql -u root -p<password>

где <password> — пароль, который мы вводили для root. После удачного ввода заходим в консоль MySQL, который начинается с mysql>.

Показ списка существующих баз данных

mysql>show databases;

Создание новой базы данных:

mysql>create database my_db character set utf8 collate utf8_unicode_ci;
  • character set — параметр установки кодировки
  • collate — параметр для указания кодировки, при котором будут сравниваться символы. В данном случае кодировка указана как utf8, а сравнивание будет производиться по той же кодировке utf8. *_ci в конце кодировки сравнивания указывает, что сравнивание будет регистронезависимой.

Удаление базы данных

mysql>drop database my_db;

Выход из консоли

mysql>exit;

 

Установка PostgreSQL

Установка

$ sudo apt-get install postgresql

После того, как сервер баз данных установился, нам нужно будет теперь поменять пароль пользователя

$ sudo -u postgres psql

Данная команда говорит системе, чтобы мы зашли в консоль под пользователя БД Postgres по умолчанию, который именуется, как postgres и могли выполнять операции. Далее мы войдем в консоль, который будет начинаться через postgres=#.

Теперь можно менять пароль. Для этого нужно вводить команды через обратный слэш

postgres=# \password

Далее система затребует новый пароль, который нужно будет подтвердить.

Создаем новую базу данных

postgres=# create database my_db;

 

Вывод списка всех БД

postgres=# \l

Удаление БД

postgres=# drop database db_name

 

Работа с CRON

Cron (Command Run ON) — система для автоматического запуска программ и скриптов на сервере в определённое время. Управлять cron нужно с помощью команды ‘crontab’.

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

$ crontab -l

флаг -l указывает на то, что нужно вывести список(List) всех задач.

Для создания задач необходимо редактировать файл задач и для этого нужно выполнить команду

$ crontab -e

флаг -e указывает на то, что мы будем редактировать(Edit) список задач. После выполнения данной команды система потребует, чтобы вы из списка выбрали номер редатора, которым будете редактировать задания

Selection    Path                Priority   Status
------------------------------------------------------------
  0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    10        manual mode

Чтобы потом изменить редактор для cron нужно задать другое значение для параметра EDITOR

$ export EDITOR=/usr/bin/vim.basic

выбираем и идем дальше.

После вышеизложенной операции система откроет файл задач, там будет некоторый закоментированный текст и свободная часть для добавления новых задач

Пример скриншота, как выглядит файл задач cron
Пример скриншота, как выглядит файл задач cron

Чтобы разобраться, как задать время или интервалы исполнения нужно познакомиться с принципом задания значений cron. Ниже представлено описание параметров в их определенной позиции с лева направо

# ┌───────────── минуты (0 - 59)
# │ ┌───────────── часы (0 - 23)
# │ │ ┌───────────── дни в месяцах (1 - 31)
# │ │ │ ┌───────────── месяц (1 - 12)
# │ │ │ │ ┌───────────── день недели (0 - 6) (с понедельника по субботу;
# │ │ │ │ │                                   7 также воскресенье на некоторых системах)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * команда выполнения

 

Замечение. Есть хорошие валидаторы, которые дадут ясное понимание, как работает cron в UNIX — подобном окружении и одним из таких является сервис https://crontab.guru.

Параметры ввремени cron можно задавать по разному и тут важно отличать периодичность выполнения, единоразовое выполнение и выполнение при каждом цикле:

  • */n — выполнить с периодом 1/n;
  • n — выполнить каждый раз в это время;
  • n0, n1 — выполнить каждый раз в n0 и n1;
  • n0-n1 — выполнить всякий раз в интервале с n0 по n1;
  • * — выполнить всегда, при каждом цикле.

Пример 1.

1 0 * * * printf "" > /var/log/apache/error_log

Данная команда будет очищать журнал ошибок Apache в одну минуту полуночи (00:01) каждый день.

Пример 2.

45 23 * * 6 /home/oracle/scripts/export_dump.sh

Этот пример запускает скрипт shell под названием export_dump.sh в 23:45 в каждую субботу.

Пример 3. 

*/15 20 * * 1-5 /home/oracle/scripts/script.sh

Этот пример запускает скрипт shell под названием script.sh в каждые 15 минут 20 часа вечера в каждый будний день с понедельника по пятницу.

Деплой проекта Django в продакшн с Nginx + Gunicorn + Supervisor

👁 313 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

В данном посте рассмотрим один из современных вариантов деплоя готового проекта Django в готовый режим работы. В посте будет рассмотрены моменты настройки и интеграции с Django таких инструментов, как:

  • Nginx — WEB-сервер;
  • Gunicorn — HTTP-сервер Python WSGI;
  • Supervisor — менеджер процессов.

Исходные данные

Для использования данного поста требуются следующие исходные данные по ПО:

  • готовый удаленный сервер Linux в виде VPS/VDS с выделенным IP;
  • установленный и настроенный Python 3 c виртуальными средами и разрабатываемым проектом на Django;

Исходные данные по неймингу:

  • /home/myprojectenv/ — абсолютный путь к папке виртуальной среды;
  • /home/myprojectenv/myproject/ — абсолютный путь к папке проекта на Django;
  • (myprojectenv)user@host: /myprojectenv/ —  вид строки запроса в консоли под активной виртуальной средой Python;
  • 11.22.33.44IP нашего удаленного сервера VDS/VPS;
  • 8000 — порт, на котором будет подвешен наш проект.

 

Установка и настройка Nginx и Gunicorn

Для начала нужно сделать апгрейд

sudo apt-get update
sudo apt-get upgrade

Ставим Nginx

sudo apt-get install nginx

Теперь заходим под виртуальную среду нашего(или вашего) проекта

cd /home/myprojectenv/
source bin/activate

Под активной виртуальной средой ставим Gunicorn

(myprojectenv)user@host: /home/myprojectenv# pip[pip3] install gunicorn

Замечание. Помните про версии pip. Если Python 2.x, то пишем pip, если Python 3.xpip3. Это по дефолту, если у вас не настроено иначе.

Теперь, перед тем, как идти дальше, протестируем удачную установку Gunicorn и интеграцию с проектом Django и для этого выполняем команду

(myprojectenv)user@host: /home/myprojectenv/myproject# gunicorn myproject.wsgi:application --bind 11.22.33.44:8000

Идем в браузер и запускаем по адресу страницу 11.22.33.44:8000 и убеждаемся, что все ок.

Далее настраиваем папку статических файлов и для этого открываем файл настроек проекта в папке /home/myprojectenv/myproject/myproject/settings.py

nano settings.py

Добавляем в этот файл параметр STATIC_ROOT, если его нет, со следующим значением

...
STATIC_ROOT = '/home/myprojectenv/myproject/static/'
...

Сохраняем, выходим и далее выполняем из папки проекта команду

(myprojectenv)user@host: /home/myprojectenv/myproject# python manage.py collectstatic

После чего в папке проекта появится новая папка с именем static.

Теперь идем и настраиваем Nginx по пути в файле

cd /etc/nginx/sites-available/

открываем файлик default

nano default

и перепишем некоторые моменты, как ниже

server {
    listen 80;
    server_name 11.22.33.44; #либо ip, либо доменное имя
    access_log  /var/log/nginx/example.log;

    location /static/ {
        root /home/myprojectenv/myproject/;
        expires 30d;
    }

    location / {
        proxy_pass http://127.0.0.1:8000; 
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

сохраняем и выходим.

Выполняем перезапуск Nginx, чтобы изменения вступили в силу

sudo service nginx restart

 

Активируем нашу среду и заходим в папку проекта для проверки запуска в связке Gunicon + Nginx

(myprojectenv)user@host: /home/myprojectenv/myproject# gunicorn myproject.wsgi:application

В браузере набираем 11.22.33.44:8000 и убеждаемся, что все ок.

Установка и настройка Supervisor

Чтобы ваше приложение стартовало после любого непредвиденного рестарта системы или сбоя, нам нужно использовать в деле supervisor.

Установим supervisor

apt-get install supervisor

Создадим конфигурационный файл для gunicorn в подпапке проекта (myproject/myproject/) рядом с settings.py

cd /home/myprojectenv/myproject/myproject
touch gunicorn.conf.py
nano gunicorn.conf.py

и записываем туда такие данные, которые означают, что данный проект будет запущен на IP и порте 0.0.0.0:8000, что будет означать внешний адрес нашего VPS. Если у вас сервер локальный, то ставим 127.0.0.1

bind = '0:8000'
workers = 3
user = "nobody"

Теперь создаем конфигурационный файл для supervisor

cd /etc/supervisor/conf.d/
touch myproject.conf
nano myproject.conf

и записываем туда такие данные

[program:myproject]
command=/home/myprojectenv/bin/gunicorn myproject.wsgi:application -c /home/myprojectenv/myproject/myproject/gunicorn.conf.py
directory=/home/myprojectenv/myproject
user=nobody
autorestart=true
redirect_stderr=true

 

Запускаем проект через supervisor

supervisorctl restart myproject

В браузере набираем 11.22.33.44:8000 и убеждаемся, что все ок.

Дополнительный тест. Можно также перезагрузить сервер

shutdown -r now

и убедиться, что наш проекта на Django сам автоматом встал и заработал при помощи supervisor.

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

  • supervisorctl start myproject — запуск процесса;
  • supervisorctl reread — перезапуск системы;
  • supervisorctl update — обновить систему;
  • supervisorctl status myproject — узнать статус процесса;
  • supervisorctl remove myproject — удалить процесс.

 

Возможные ошибки использования Supervisor и Gunicorn

Ошибки в файлах конфигурации

Это с большей вероятностью, потому что конфигурационных файлов 2 и нужно, чтобы они были настроены слажено без ошибок. Напомним, что они у нас находятся по путям:

  • Файл конфигурации Gunicorn в пределах текущего проекта /home/myprojectenv/myproject/myproject/gunicorn.conf.py
  • Файл конфигурации проекта в виде управляемого процесса внутри Supervisor /etc/supervisor/conf.d/myproject.conf

 

Ошибка запуска из-за занятости стандартного порта Supervisor

Обычно, эта ошибка выглядит так, при запуске команды запуска supervisorctl start myproject

cloudApp: ERROR (spawn error)

или так, при запуске команды поиска ошибок supervisord -n

Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord

Для решения этой проблемы сначала убиваем процесс Supervisor, который можно сделать несколькими способами.

Первый. Выводим весь список процессов Supervisor и убиваем нужный по PID(в списке он будет после первого)

ps -ef | grep supervisord
sudo kill -9 PID_OUR_PROJECT

или

ps -ef | grep supervisord
kill -s SIGTERM PID_OUR_PROJECT

 

Второй. Убиваем сам supervisord

sudo pkill supervisord

 

Третий. Удаляем файл supervisor.sock и запускаем supervisor обратно

sudo unlink /run/supervisor.sock
sudo /etc/init.d/supervisor start

Теперь перезапускаем проект

supervisorctl start cloudApp
Ошибка ERROR (no such process) при запуске нового процесса

Данная ошибка появляется, когда мы создали новый проект, но он не обновился в системе Supervisot и для решения этой проблемы нам нужно перезаписать все процессы и перезагрузить supervisorctl

supervisorctl reread
supervisorctl reload

 

Если не удается идентифицировать ошибку

Если проблему трудно найти или идентифицировать, то будет полезной использовать команду

supervisord -n

который выведет весь список ошибок в файлах или сервисах, которые мешают запускаться процессу Supervisor.

 

Использованные материалы:

  1. Django + Python3 + Nginx + Gunicorn + DO;
  2. Setting up Django with Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL

 

Увеличиваем время соединения по протоколу SSH

👁 68 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Иногда необходимо долго ждать установку или выполнение какого-то пакета или скрипта и время таймаута соединения по умолчанию не хватает и соединение может прерваться в середине процессе. Это делается очень просто прописыванием 3-х параметров в файле /etc/ssh/sshd_config

TCPKeepAlive yes
ClientAliveInterval 300
ClientAliveCountMax 60

 

Данные параметры уже есть в данном файле, их, просто, нужно раскоментировать и прописать против них новые значения на увеличение времени таймаута соединения SSH.

TCPKeepAlive — установлен в «yes», значит сервер будет периодически пинговать клиента, проверяя жив ли он.
ClientAliveInterval — задает интервал пинга для проверки состояния клиента (в секундах). Параметр работает только для протокола версии 2 (Protocol 2).
ClientAliveCountMax — количество пингов клиента.
Таким образом в моем примере таймаут сессии будет равен 60*300/60 = 300 минут = 5 часов.
После изменения данных параметров перезапускаем сервис ssh

sudo service ssh restart

Построение проекта Django с БД Postgre SQL и импорт данных из SQLite

👁 214 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Допустим, есть у нас такая ситуация, что проект на Django установлен а использованием локальной БД SQLite и нам необходимо это все экспортировать в реляционную БД на примере PostgreSQL.

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

PostgreSQL или Postgres — это система управления реляционными базами данных, которая обеспечивает реализацию языка запросов SQL. Это популярный выбор для многих небольших и крупных проектов и имеет то преимущество, что он совместим со стандартами и обладает множеством дополнительных функций, таких как надежные транзакции и параллелизм без блокировок чтения.

Установка и настройка PostgreSQL на Ubuntu

Репозитории Ubuntu по умолчанию содержат пакеты Postgres, поэтому их можно установить с помощью apt-системы. Перед этим обновим свой локальный индекс пакета. Затем установим пакет Postgres вместе с пакетом -contrib, который добавит некоторые дополнительные утилиты и функции

sudo apt-get update
sudo apt-get install libpq-dev postgresql postgresql-contrib

Запускаем PostgreeSQL

sudo su - postgres

Командная строка терминала теперь будет начинаться с postgres@yourserver.

Теперь заходим в режим команд SQL и интерфейса PostgreSQL

postgres@yourserver# psql

После команды выше командная строка теперь будет начинаться с postgres=#.

Создаем базу данных для проекта, обратите внимание, что в режиме SQL запрос должен оканчиваться «;»

postgres=# CREATE DATABASE projectdb;

 

Создаем пользователя для БД проекта

postgres=# CREATE USER dbuser WITH PASSWORD 'userpass';

Мы устанавливаем кодировку по умолчанию для UTF-8, которую ожидает Django. Мы также устанавливаем схему изоляции транзакций по умолчанию «read commit», которая блокирует чтение из незафиксированных транзакций. Наконец, мы устанавливаем часовой пояс. По умолчанию наши проекты Django будут настроены на использование UTC

postgres=# ALTER ROLE dbuser SET client_encoding TO 'utf8';
postgres=# ALTER ROLE dbuser SET default_transaction_isolation TO 'read committed';
postgres=# ALTER ROLE dbuser SET timezone TO 'UTC';

 

Теперь все, что нам нужно сделать, это предоставить нашим пользователям права доступа к базе данных, которую мы создали

postgres=# GRANT ALL PRIVILEGES ON DATABASE projectdb TO dbuser;

 

Выходим из режима ввода SQL, чтобы вернуться к сеансу оболочки postgres

\q

Выходим из сеанса оболочки postgres, чтобы вернуться к сеансу оболочки обычного пользователя

exit

Настройка проекта Django на использование

PostgreSQL

Теперь, когда наша база данных настроена, мы можем установить Django. Для большей гибкости мы установим Django и все его зависимости в виртуальной среде Python

Создание и настройка виртуальной среды

Создаем виртуальную среду для хранения зависимостей Python проекта Django, набрав команду

virtualenv myprojectenv

Это установит локальную копию Python и pip[pip3] в каталог myprojectenv

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

source myprojectenv/bin/activate

После этой команды строка запроса будет похожа на (myprojectenv)user@host.

В окружении проекта устанавливаем пакеты Django и psycopg2, который является бэкэндом для PostgreSQL

(myprojectenv)user@host: /myprojectenv# pip[pip3] install django psycopg2

 

Замечение. Тут еще один момент, связанный с psycopg2. Начиная с версии 2.8 данный пакет будет переименован в psycopg2-binary и поэтому нужно дополнительно установить данный пакет с этим названием

(myprojectenv)user@host: /myprojectenv# pip[pip3] install django psycopg2-binary

В противном случае, может возникнуть предупреждение такого рода

/home/websofter/lib/python3.6/site-packages/psycopg2/__init__.py:144: 
UserWarning: The psycopg2 wheel package will be renamed from release 2.8; 
in order to keep installing from binary please use "pip install psycopg2-binary" instead. 
For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.

Дополнительно про это можно узнать по ссылке.

Создание и настройка проекта Django

Теперь мы можем запустить проект Django в нашей директории myprojectenv. Это создаст дочерний каталог с именем проекта myproject , в котором будет еще одна папка с тем же названием для хранения самого кода и создаст сценарий управления в текущем каталоге. Не забудьте добавить точку в конце команды, чтобы она была правильно настроена

(myprojectenv)user@host: /myprojectenv# pip[pip3] django-admin.py startproject myproject .

 

Теперь нам надо отредактировать файл настроек myproject/myproject/settings.py проекта на то, чтобы проект, вместо базы SQLite, который стоит по умолчанию начал работать с базой Postgre, который мы выше настроили и для этого открываем этот файл настроек и ищем там строки

. . .
ALLOWED_HOSTS = []
. . .
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
. . .

и заменяем это все на

. . .
ALLOWED_HOSTS = ['server-domain_or_IP']
. . .
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'projectdb',
        'USER': 'dbuser',
        'PASSWORD': 'userpass',
        'HOST': 'localhost',
        'PORT': '',
    }
}
. . .

Сохраняем и закрываем этот файл.

Миграция баз данных на использование Postgre и запуск проекта

Теперь, когда настройки Django настроены, мы можем перенести наши структуры данных в нашу базу данных и протестировать сервер.

(myprojectenv)user@host: /myprojectenv/myproject# python manage.py makemigrations
(myprojectenv)user@host: /myprojectenv/myproject# python manage.py migrate

После создания структуры базы данных мы можем создать учетную запись администратора проекта, набрав

(myprojectenv)user@host: /myprojectenv/myproject# python manage.py createsuperuser

Вам будет предложено выбрать имя пользователя, указать адрес электронной почты и выбрать и подтвердить пароль для учетной записи

(myprojectenv)user@host: /myprojectenv/myproject# python manage.py runserver 0.0.0.0:8001

На этом интеграция и запуск закончена. Остается любоваться результатом через адрес сервера и порт 8001, на котором запущен наш проект Django с БД Postgree

http://server_domain_or_IP:8000

 

Импорт данных из SQLite в PostgreSQL

в проекте Django

Окей. Выше мы рассмотрели, как интегрировать проект Django с Postgre, но что если в SQLite есть уже данные, которые нужно перенести в Postgre SQL?

Выгружаем существующие данные из SQLite, причем, в настройках settings.py нужно настроить на использование SQLite

(myprojectenv)user@host: /myprojectenv/myproject# python manage.py dumpdata > datadump.json

Изменяем settings.py на использование Postgres backend. Выше мы это уже рассматривали как делать.

Убедитесь, что вы можете подключиться к PostgreSQL. Затем

(myprojectenv)user@host: /myprojectenv/myproject# python manage.py migrate --run-syncdb<br>

 

Использованные источники:

  1. How To Use PostgreSQL with your Django Application on Ubuntu 14.04
  2. How to migrate Django from SQLite to PostgreSQL

Установка Python 3.6 и настройка виртуальных сред на Ubuntu 18

👁 265 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Установка и работа с virtualenv

Обновляем систему

sudo apt-get update

Ставим Python 3.6 из коробки

apt install python3.6

Теперь, если удачно установилось, то можем проверить версию и место утсновки

python3.6 -v
whereis python3.6
which python3.6

Делаем алиас-ссылку, чтобы Python 3.6 запускался через команду python

alias python=python3.6

Замечание. Команда добавления алиаса выше в идеале должна создать равносильную ссылку команды python с python3. Но, вероятно, что он может не сработать и тогда придется вручную править файл .bashrc

nano ~/.bashrc

и добавляем туда линк

alias python=python3

Файл .bashrc предназначен для задания псевдонимов команд и функций, используемых пользователями оболочки bash.

Ставим пакетный менеджер для Python 3

sudo apt-get install python3-pip

Ставим инструмент виртуальных сред

sudo pip3 install virtualenv

 

Замечание. Если вы используете Python 3.3 или выше, то venv модуль уже включен в стандартную библиотеку Python. Он также, как и virtualenv может создавать и управлять виртулаьными средами, но он поддерживается только в версиях Python 3.x

Создаем среду, активируем и работаем

virtualenv myenv
cd myenv
source bin/acivate

Для деактивации и выхода из текущей виртуальной среды выполняем привычную команду

deactivate

 

Можно обойтись одним лишь базовым инструментом virtualenv для работы с виртуальными средами в Python, но помимо его базовых функций есть возможность использовать расширяющий возможности инструмент под названием virtualenvwrapper, с которым познакомимся ниже.

Установка и работа с virtualenvwrapper

virtualenvwrapper — это набор расширений для virtualenv с дополнительным инструментарием. Расширение включают в себя оболочку для создания и удаления виртуальных сред и, в противном случае, управление рабочим процессом разработки, что упрощает работу над несколькими проектами одновременно без введения конфликтов в их зависимости.

Установка virtualenvwrapper

pip install virtualenvwrapper

Смотрим, где находится virtualenvwrapper.sh

which virtualenvwrapper.sh

Данная команда выведет информацию о пути нахождения типа /usr/local/bin/virtualenvwrapper.sh. Теперь нужно добавить некоторую информацию в конце нашего файла ~ / .bashrc

sudo nano ~/.bashrc

Добавляем в конец

# where to store our virtual envs
export WORKON_HOME=$HOME/virtenvs
# where projects will reside
export PROJECT_HOME=$HOME/Projects-Active
# where is the virtualenvwrapper.sh
source /usr/local/bin/virtualenvwrapper.sh

Сохраним изменения

source ~/.bashrc

Проверяем, что все установилось

workon

Это выведет пустую строку, что будет означать успешность работы

Базовые операции virtualenvwrapper

Создаем виртуальную среду

mkvirtualenv myenv

Если нужно создать сразу с рабочей папкой

mkproject myenv

Можем узнать сколько виртуальных окружений

workon

Для переключения просто набираем

workon myenv

Для выхода

deactiavate

Для удаления виртуального окружения

rmvirtualenv

 

Если вы случайно сломали или удалили MySQL в составе VestaCP на Ubuntu

👁 74 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Восстановление MySQL в Vesta CP

Если проблема возникла по неосторожности, то попробуйте так:

apt-get --purge remove mysql-common
apt-get install mysql-server

 

Удаление и замена MySQL на MariaDB

в Vesta CP

Если MySQL не хочет, то можно пробовать использовать MariaDB. Базы данных при этом сохраняются и автоматически импортируются

sudo apt-get remove --purge mysql-server mysql-client mysql-common
sudo apt-get autoremove
sudo apt-get autoclean
sudo apt-get install mariadb-server

 

Восстановление сайтов из Backup-ов

Это крайни и долгий процесс, особенно, если у вас на одном серваке много сайтов