Архив метки: Django

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

В этой статье рассмотрим запуск Django проектов в панели управления VestaCP, в различных конфигурациях. Подразумевается что у вас уже установлена и настроена панель VestaCP, как это сделать можно прочитать здесь. А так же установлен и запущен фреймворк Djang, как это сделать смотрите здесь.

VestaCP Nginx+Apache

если у вас VestaCP установлена в конфигурации nginx-apache, то здесь все просто, достаточно установить mod_wsgi

В Ubuntu

apt-get install libapache2-mod-wsgi

a2enmod wsgi

В CentOS, RedHat

yum install mod_wsgi

Затем добавить в VestaCP новый шаблон.

Для Ubuntu

cd /usr/local/vesta/data/templates/web

wget http://c.vestacp.com/0.9.8/ubuntu/wsgi/apache2.tar.gz

tar -xzvf apache2.tar.gz

rm -f apache2.tar.gz

Для CentOS, RedHat

cd /usr/local/vesta/data/templates/web

wget http://c.vestacp.com/0.9.8/rhel/wsgi/httpd.tar.gz

tar -xzvf httpd.tar.gz

rm -f httpd.tar.gz

Переходим в WEB интерфейс VestaCP, и выбираем WEB Template wsgi. После чего все должно работать.

VestaCP Nginx+php-fpm

Дальнейшие настройки будут проводиться для домена example.com, а пользователь в панели VestaCP admin, поэтому при дальнейших действиях используйте свои логин и домен

Для начала устанавливаем модуль uwsgi и uwsgi-plugin-python2

yum install uwsgi uwsgi-plugin-python2  –y

Проверяем работу модуля uwsgi, для этого запустим его с ключами

uwsgi --chdir /home/admin/web/example.com/public_html/mysite/ --http-socket :8000 --plugin python --wsgi-file /home/admin/web/example.com/publictml/mysite/mysite/wsgi.py

chdir – полный путь к проекту Django

http-socket – порт по которому модуль слушает http запросы, т.к 80  порт у нас занят, то для теста используем 8000

wsgi-file –путь к файлу с настройками окружения, должен создаться автоматически при создании проекта в Django.

После запуска открываем в браузере ссылку

http://<ip адрес сервера>:8000

Мы должны увидеть страницу приветствия.

Или если у вас уже рабочий сайт, то он должен открыться

После установки модуля в каталоге /etc появится основной файл настроек /etc/uwsgi.ini

Посмотрим его

cat  /etc/uwsgi.ini

Сразу у меня он не заработал, поэтому пришлось отредактировать. В итоге рабочий ini-файл получился такой.

[uwsgi]

uid = uwsgi

gid = uwsgi

pidfile = /run/uwsgi/uwsgi.pid

emperor = /etc/uwsgi.d

chmod-socket = 660

eror-tyrant = false

cap = setgid,setuid

Основной параметр в этом файле это emperor = /etc/uwsgi.d, он указывает директорию с конфигурационными файлами для различных сайтов . Т.е модуль запускается в режиме emperor и подгружает конфигурации из каталога /etc/uwsgi.d. Необходимо будет для каждого сайта создать свой ini-файл и поместить его в этот каталог.

Создаем директорию /run/uwsgi/

mkdir /run/uwsgi/

Меняем владельца на uwsgi

chown uwsgi:uwsgi /run/uwsgi/

chown uwsgi:uwsgi /etc/uwsgi.d/

Переходим в директорию /etc/uwsgi.d

cd /etc/uwsgi.d

и создаем файл example.com.ini следующего содержания

[uwsgi]

#Пользователь от которого запускается процесс uwsgi

uid=admin

gid=admin

#Путь к проекту django

chdir  = /home/admin/web/example.com/public_html/mysite/

plugin = python

# Django wsgi файл

wsgi-file = /home/admin/web/example.com/public_html/mysite/mysite/wsgi.py

master  = true

# максимальное количество процессов

processes = 10

# полный путь к файлу сокета

socket = /home/admin/web/example.com/public_html/example.com.sock

chmod-socket = 666

# очищать окружение от служебных файлов uwsgi по завершению

vacuum = true

Для проверки запускаем модуль уже с использованием ini файла

uwsgi --http-socket :8000 --ini /etc/uwsgi.ini

Если вы получите ошибку Permission denied. Попробуйте изменить пользователя в файле /etc/uwsgi.ini

uid=uwsgi

gid=uwsgi

Замените на

uid=admin

gid=admin

А также измените права на папки

chown admin:admin /run/uwsgi/

chown admin:admin /etc/uwsgi.d/

На одном из серверов у меня заработало только после таких манипуляций. Пробуем запустить

uwsgi --http-socket :8000 --ini /etc/uwsgi.ini

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

идем дальше. Добавляем модуль в автозагрузку, для этого, добавляем в файл /etc/uswgi.ini параметр daemonize=/var/log/uwsgi/yourproject.log. В итоге файл должен выглядеть так

прописываем в файл /etc/rc.local в конце строку запуска

/usr/sbin/uwsgi --ini /etc/uwsgi.ini

Настройка Nginx

Добавляем в панель VestaCP новый шаблон django_uwsgi. Для этого переходим в директорию /usr/local/vesta/data/templates/web/nginx/php-fpm/

cd /usr/local/vesta/data/templates/web/nginx/php-fpm/

Здесь создаем два файла django_uwsgi.tpl и django_uwsgi.stpl

django_uwsgi.tpl

upstream django {

     server unix://%home%/%user%/web/%domain%/public_html/%domain%.sock;

    }

server {

    listen      %ip%:%web_port%;

    server_name %domain_idn% %alias_idn%;

    root        %docroot%;

    index       index.php index.html index.htm;

    access_log  /var/log/nginx/domains/%domain%.log combined;

    access_log  /var/log/nginx/domains/%domain%.bytes bytes;

    error_log   /var/log/nginx/domains/%domain%.error.log error;

    location / {                 

        uwsgi_pass  django;      

        include /etc/nginx/uwsgi_params;

    }   

    location /static {

        alias  %home%/%user%/web/%domain%/public_html/static;

          } 

    location /media {

        alias  %home%/%user%/web/%domain%/public_html/media;

          }                        

    error_page  403 /error/404.html;

    error_page  404 /error/404.html;

    error_page  500 502 503 504 /error/50x.html;

    location /error/ {

        alias   %home%/%user%/web/%domain%/document_errors/;

    }

    location ~* "/.(htaccess|htpasswd)$" {

        deny    all;

        return  404;

    }

    location /vstats/ {

        alias   %home%/%user%/web/%domain%/stats/;

        include %home%/%user%/conf/web/%domain%.auth*;

    }

    include     /etc/nginx/conf.d/phpmyadmin.inc*;

    include     /etc/nginx/conf.d/phppgadmin.inc*;

    include     /etc/nginx/conf.d/webmail.inc*;

    include     %home%/%user%/conf/web/nginx.%domain%.conf*;

}

django_uwsgi.stpl

server {

    listen      %ip%:%web_ssl_port%;

    server_name %domain_idn% %alias_idn%;

    root        %sdocroot%;

    index       index.php index.html index.htm;

    access_log  /var/log/nginx/domains/%domain%.log combined;

    access_log  /var/log/nginx/domains/%domain%.bytes bytes;

    error_log   /var/log/nginx/domains/%domain%.error.log error;

    ssl         on;

    ssl_certificate      %ssl_pem%;

    ssl_certificate_key  %ssl_key%;

    location / {                 

        uwsgi_pass  django;      

        include /etc/nginx/uwsgi_params;

    }

     location /static {

         alias  %home%/%user%/web/%domain%/public_html/static;

                }

     location /media {

        alias  %home%/%user%/web/%domain%/public_html/media;

                }                          

    error_page  403 /error/404.html;

    error_page  404 /error/404.html;

    error_page  500 502 503 504 /error/50x.html;

    location /error/ {

        alias   %home%/%user%/web/%domain%/document_errors/;

    }

    location ~* "/.(htaccess|htpasswd)$" {

        deny    all;

        return  404;

    }

    location /vstats/ {

        alias   %home%/%user%/web/%domain%/stats/;

        include %home%/%user%/conf/web/%domain%.auth*;

    }

    include     /etc/nginx/conf.d/phpmyadmin.inc*;

    include     /etc/nginx/conf.d/phppgadmin.inc*;

    include     /etc/nginx/conf.d/webmail.inc*;

    include     %home%/%user%/conf/web/snginx.%domain%.conf*;

}

Обратите внимание, на расположение каталогов static и media проектов django, в моих шаблонах они находятся в корне каталога public_html.

Файл /etc/nginx/uwsgi_params должен был создаться при установки uwsgi, если нет, создайте его.

uwsgi_params

uwsgi_param  QUERY_STRING       $query_string;

uwsgi_param  REQUEST_METHOD     $request_method;

uwsgi_param  CONTENT_TYPE       $content_type;

uwsgi_param  CONTENT_LENGTH     $content_length;



uwsgi_param  REQUEST_URI        $request_uri;

uwsgi_param  PATH_INFO          $document_uri;

uwsgi_param  DOCUMENT_ROOT      $document_root;

uwsgi_param  SERVER_PROTOCOL    $server_protocol;

uwsgi_param  REQUEST_SCHEME     $scheme;

uwsgi_param  HTTPS              $https if_not_empty;



uwsgi_param  REMOTE_ADDR        $remote_addr;

uwsgi_param  REMOTE_PORT        $remote_port;

uwsgi_param  SERVER_PORT        $server_port;

uwsgi_param  SERVER_NAME        $server_name;

Теперь через WEB интерфейс выбираем наш шаблон djago_wsgi

Сохраняем и переходим на сайт example.com, естественно вместо example.com должен быть ваш рабочий домен. Если видим страницу

Или страницу вашего сайта, то значит у нас все работает.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.



2018-11-22T20:31:09
Django

Установка Django на CentOS 7, запуск и тестирование

В данной статье рассмотрим установку и запуск первого проекта в Django на ОС Centos7

Установка Django

Первым делом устанавливаем pip

yum install python-pip –y

Далее устанавливаем само Django. Но просто дать команду

pip install django

Не получится, вы получите ошибку Unsupported Python version

Дело в том,  что в Centos 7 при чистой установке установлен python 2.7. Тут два выхода, можно установить 3-й python, или установить более старую версию Django. Пойдем по пути наименьшего сопротивления и установим версию поддерживаемую python 2.7.  Переходим на сайт https://docs.djangoproject.com/en/2.1/faq/install/. И видим что для нашей версии питон подходит Django 1.11. Вот ее и установим

pip install Django==1.11

Теперь установка должна пройти без ошибок

Запуск проекта

Создадим наш первый проект. Переходим в директорию где у нас будут храниться сайты, например /var/www/html/

cd  /var/www/html/

Даем команду на создание проекта, например проект будет называться mysite, тогда команда будет

django-admin startproject mysite

посмотрим что создала эта команд команда

ls –R

mysite – корневой каталог нашего проекта

manage.py – файл для выполнения различных интерактивных команд для Django. Например запуск внутреннего web сервера. Полный список команд можно посмотреть набрав

python manage.py

В каталоге /mysite/mysite/ содержатся конфигурационные файлы.

Settings.py –файл с основными настройками сайта, такими как задание языка, временной зоны, параметров подключения к базе и т.д.

urls.py – настройки URL

wsgi.py –файл для работы с модулем wsgi, нужен для работы джанго в web серверах apache или nginx.

Тестирование работы Django

Проверим работу нашего приложения, для этого выполните команду

python manage.py runserver 0.0.0.0:8000

После чего наберите в строке браузера

http://<ip адрес вашего сервера>:8000

При первом запуске у вас скорее всего появится ошибка You may need to add u’ip сервера’ to ALLOWED_HOSTS

Поэтому останавливаем сервер ctr^Z. Открываем на редактирование файл settings.py и ищем параметр

ALLOWED_HOSTS = []

Вписываем в квадратные скобки ip адрес сервера, например

ALLOWED_HOSTS = [’10.10.10.10’]

Должно получится так

Снова запускаем сервер

python manage.py runserver 0.0.0.0:8000

И пытаемся подключиться на адрес http://10.10.10.10:8000/ . В итоге вы должны увидеть следующую страницу

Она говорит нам что Django успешно запущено и настроено.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

 



2018-11-22T12:54:07
Django

Сброс пароля на админку в django

Что делать если вы забали пароль от админки к django? Есть как минимум 2 решения проблемы.

Первое решение просто поменять пароль на root или другого суперпользователя, которого вы создали при создании базы данных. Для этого входим в manage.py shell

python manager.py shell

и набираем

>>>from django.contrib.auth.models import User

>>>user = User.objects.get( username='root')

>>>user.set_password(«password»)

>>>user.save()

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

python manage.py createsuperuser

 И вводим новые данные.



2018-09-29T23:09:18
Django

Django. Отображение фотографий на HTML странице (часть 11)

Добавим теперь фотографии домов, для этого расширим модель. В файле models.py напишем:

photo = models.ImageField(«фотография», upload_to=»houses/photos», default=»», blank=True)

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

default =»» — значение по умолчанию, это пустая строка.
blank=True – говорит, что можно добавлять дом без фотографии.
upload_to=»houses/photos» — путь где будут храниться фотографии

Нажмем Ctrl+Alt+R – создадим миграцию

makemigrations houses
migrate houses

Возможно вы получите следующие ошибки

ERRORS:
houses.House.house_photo: (fields.E210) Cannot use ImageField because Pillow is not installed.
HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command:
«pip install Pillow».

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

Выполним:

pip install Pillow

И снова мы можем увидеть следующие ошибки:

pip install pillow failed with error code 1
error for pip install Pillow on Ubuntu virtualenv
failed building wheel for Pillow

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

sudo apt-get install python-dev
sudo apt-get install python3-dev
sudo apt-get install libjpeg8-dev zlib1g-dev

Теперь снова выполним команду и в этот раз должно все получиться:

pip install Pillow

Collecting Pillow
Using cached Pillow-3.2.0.zip
Building wheels for collected packages: Pillow
Running setup.py bdist_wheel for Pillow … done
Stored in directory: /home/vlad/.cache/pip/wheels/88/2d/ce/3ff4ae4e2b8600d1bde1cbde5dfcc6d8770222c38348fe9139
Successfully built Pillow
Installing collected packages: Pillow
Successfully installed Pillow-3.2.0

Снова выполним миграцию:

python manage.py makemigrations houses
python manage.py migrate houses

Теперь перейдем в settings.py и включим поддержку медиафайлов. Тоесть файлы, которые будем добавлять мы или наши клиенты через сайт.

Добавим переменную MEDIA_ROOT, которой присвоим «media»

os.path.join(BASE_DIR, «media»)

, то есть мы будем хранить файлы в папке «media», которая будет находится в папке проекта BASE_DIR

Также добавим переменную MEDIA_URL, которой присвоим строку «/media/»

MEDIA_URL — это адрес по которому пользователь сможет получить доступ к нашим медиа файлам.

Теперь перейдем в файл urls.py и импортируем в него функцию static

from django.conf.urls.static import static

А также импортируем настройки проекта:

from django.conf import settings

После, к urlpatterns прибавим функцию static()
Первым аргументом укажем settings.MEDIA_URL, а вторым именованный document_root=settings.MEDIA_ROOT

urlpatterns = [] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Переходим в админку, выбираем дом бюджет, теперь мы видим, что появилось новое поле Фотография, которое в отличии от других полей не выделено жирным, то есть оно не обязательно для заполнения. Добавим фото и нажмем сохранить. Фотография загрузится на сервер в папку houses/photos

Теперь в папке проекта должна появится папка media, внутри которой houses и photos, в соответствии со структурой upload_to

Выведем теперь фотографию на сайт. Откроем шаблон houses_list.html и напишем:

if, затем нажмем TAB, чтобы быстро создать инструкцию

{% if house.house_photo %}

{% endif %}

А в теле инструкции напишем:

img, затем нажмем TAB, чтобы быстро создать конструкцию

В скобках {{ }} добавим house.house_photo.url и house.house_name

Разберем код:

Мы добавили условие, если у дома есть фотография house.house_photo, то подставить в атрибут src=»» ссылку на неё {{ house.house_photo.url }}, а в атрибут alt=»» имя дома {{ house.house_name }}

Откроем сайт и посмотрим, фотография Бюджетного дома — теперь выводится.

Отлично!

Автор: Vladimir Semenovich

Django. Наполнение страницы данными (часть 10)

Наполним страницу данными, вернемся в views.py и импортируем модуль house

from .models import House

А затем внутри представления напишем:

houses = House.objects.all()

House.objects.all() — этой строкой мы создаем запрос к нашей базе данных с помощью ORM.
objects.all() — запрос на получение всех объектов

Теперь в переменной houses содержаться все дома, которые мы добавили через админку. Мы снова обошлись без SQL запросов к базе данных, что очень упрощает разработку.

Передадим дома в наш шаблон, для этого добавим в функцию render(), третий параметр словарь, в котором напишем {“houses”: houses}, теперь в нашем шаблоне доступны созданные нами объекты.

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

Теперь в houses_list.html нам нужно вывести дома через переменную hoses, которую мы передали в шаблон. Для этого нужно воспользоваться языком шаблонов Django.
Язык шаблонов Django — это такой упрощенный язык, с помощью которого можно обращаться к python объектам внутри html файла, а также реализовывать простейшую логику вроде циклов и условий.

Напишем for и нажмем TAB, Pycharm создаст для нас конструкцию for и поместит в нее объект houses

Конструкция for заключается в фигурные скобки с % и имеет окончание {% endfor %}
Внутри конструкции нам доступен объект house, который отвечает за один единственный дом.

Напишем:

div>h2+div*2

и нажмем TAB, чтобы Pycharm быстро создал несколько HTML тэгов.

Добавим в двойных фигурных скобках:

{{ house.name }}
{{ house.price }}
{{ house.description }}

{% … %} — если фигурные скобки с % отвечают за синтаксические конструкции, как например в for, то с помощью двойных фигурных скобок {{ … }}, мы можем обращаться к Python объектам, в нашем случае к объекту house и сейчас мы выводим данные по нашему объекту в HTML.

Откроем сайт и обновим страницу

Отлично!

Автор: Vladimir Semenovich

Django. Отображение данных на сайте (часть 9)

Для того чтобы показать наши дома на сайте, откроем views.py в нем мы будем хранить так называемые представления — это специальная функция, которая будет возвращать html-страницу в браузере.

В файл views.py добавим функцию houses_list, в которой зададим аргумент request.

def houses_list(request):
pass

Request — это запрос вашего посетителя, когда посетитель заходит на страницу сайта, то браузер формирует специальный запрос web-серверу, Django этот запрос обрабатывает и помещает его в специальный объект request. Затем Django вызывает, какое-то представления, например houses_list и передает в его запрос request, а после представление помещает html-страницу обратно в браузер.

Чтобы вернуть html-страницу ее нужно создать.

Добавим в папку houses, новую папку templates.
Templates — это простая папка, а не python пакет в ней __init__.py файл не нужен. В нутри templates добавим еще одну папку houses, как и имя нашего приложения, а уже в ней создадим houses_list.html и добавим текст в

«Дом у моря»

Затем вернемся в views.py

views.py

Как вы заметили имя представления article_list(request) совпадает с именем шаблона houses_list.html, который мы создали. Так делать не обязательно, но это хорошая практика, которая проще позволяет ориентироваться в коде.

Добавим в представление:

def houses_list(request):
return render(request, “houses/houses_list.html”)

Тоесть мы в функции houses_list, возвращаем отрендеренный шаблон houses_list.html

Дополнительно в функцию houses_list мы передаем запрос посетителя request

Теперь нам нужно связать нашу функцию представления с каким-то URL.

Перейдем в urls.py и импортируем в него наше представление:

from houses.views import houses_list

А в список urlpatterns скопируем строку из комментария и заменим views.home на houses_list

Первый параметр в функции url — это регулярное выражение, которое отвечает за путь на сайте

^ — это начало адреса
$ — это конец адреса
r’^s’ — все выражение соответствует главной странице

Когда посетитель перейдет на главную страницу сайта, Django сопоставит путь с регулярным выражением, т.к. путь будет соответствовать этой записи r’^s’, то Django запустит представление houses_list,

которое вернет отрендеренную html-страницу

Теперь откроем браузер и увидим нашу пустую страницу с заголовком дом у моря

Автор: Vladimir Semenovich