CGI: пишем простой сайт на Python. Часть 1: Hello world
Проще всего создать динамические страницы на Python при помощи CGI-скриптов. CGI-скрипты — это исполняемые файлы, которые выполняются веб-сервером, когда в URL запрашивается соответствующий скрипт.
Сегодня я расскажу про то, как написать Hello world, как CGI-скрипт.
Настройка локального сервера
В Python уже есть встроенный CGI сервер, поэтому его настройка элементарна.
Для запуска из консоли (для любителей linux-систем). Запускать нужно из той папки, где мы хотим работать:
Для сидящих на Windows чуть проще будет запуск Python файла (заметьте, что он должен находиться в той же папке, в которой мы планируем работать!):
Теперь откройте браузер и в адресной строке наберите localhost:8000
Если у вас примерно такая же картина, значит, у вас все заработало!
Hello world
Теперь в той папке, где мы запустили сервер, создаём папку cgi-bin (у меня она уже создана).
В этой папке создаём скрипт hello.py со следующим содержимым:
Первая строка говорит о том, что это Python скрипт (CGI-скрипты можно не только на Python писать).
Вторая строка печатает заголовок. Он обозначает, что это будет html файл (бывает ещё css, javascript, pdf и куча других, и браузер различает их по заголовкам).
Третья строка (просто символ новой строки) отделяет заголовки от тела ответа.
Четвёртая печатает Hello world.
Теперь переходим на localhost:8000/cgi-bin/hello.py
Если у вас не работает, проверьте, установлены ли права на выполнение.
Также в консоли запущенного сервера появляются сообщения об ошибках. Например, убрал скобочку и обновил страницу:
Введение
Недавно я наткнулся на интересную библиотеку на GitHub — WebCode. Библиотека позволяет писать на Python CSS и HTML код. Ранее я не встречал аналогов, поэтому решил изучить WebCode поподробнее.
Начало
Чтобы скачать WebCode нужно перейти по ссылке, а далее нажать на ‘Clone or download’ => ‘Download ZIP’. (После извлечения файла, перенесите его в папку, где будете писать код)
Итак, перейдём к делу.
Первые строки, которые надо написать это:
В начале импортируем библиотеку, как wb. А дальше пишем базовую функцию startuse().
Первый аргумент в этой функции — название HTML файла, который библиотека будет генерировать, второй — имя вашего сайта во вкладке, третий — название CSS файла(если не собираетесь его создавать, напишите css=0) и наконец четвёртый аргумент отвечает за язык, на котором Вы будете писать текст. finuse() завершает работу и принимает 1 аргумент, который может быть либо True, либо False. Если Вы укажите True, то когда вы запустите файл, он автоматически откроется в браузере. Если же False, то он этого делать не будет.
Как можно было догадаться, между startuse() и finuse(), будет наш дальнейший код.
Давайте его напишем:
Функция writep() добавляет HTML p тег на наш сайт, иными словами — пишет текст на нашу страницу. С первым аргументом text в этой функции — всё понятно, второй аргумент — это класс(в дальнейшем с помощью этого свойства, мы сможем изменить цвет или размер нашего текста), третий аргумент отвечает за то, будет ли наш текст принадлежать другому элементу. True — не будет, False — будет. Пример:
Как видите, чтобы «положить» один элемент в другой, нам нужно создать переменную, которая будет содержать в нашем случае p тег, указать change=False, а далее указать переменную в text.
Примечание: функция writediv() аналогична writep(), только вместо p создаётся div элемент.
Можете запустить и посмотреть, что у нас получилось:
Украшаем нашу страницу
Давайте сделаем наш сайт, более ярким. Для этого нам нужно написать несколько функций:
Функции stylestart() и stylefin() — это по сути тоже самое, что и startuse() finuse(), только теперь мы запускаем CSS, а не HTML код.
Помните, мы назначали writep() класс «simple-text»? Так вот, теперь мы его объявляем с помощью функции startclass(), задавая псевдо-классу(:hover, :active, :focus и т.д) значение 0, то есть его не объявляем. usestyle() принимает стандартные CSS свойства. К последнему usestyle() нужно приписать True. Так мы показываем, что после этой функции в нашем классе ничего не будет.
Теперь поменяем фон на нашей странице:
Прошу заметить, что для тегов используется startobject(), а не startclass().
Используем преимущества Python для создания сайта
В написании кода на HTML и CSS зачастую возникает проблема: несколько раз писать одно и тоже. Но WebCode её решает:
Как видите, использование данной библиотеки сильно облегчает жизнь программистам.
Вот весь код, который мы сегодня написали:
Как написать свой сайт на python
В материале 3 раздела: в первом описывается процесс создания законченного проекта на Django, в принципе, для понимания основ работы с фреймворком на нем можно и остановиться. Последующие 2 добавляют стили и описывают некоторые дополнительные приемы работы с пользователями.
Содержание:
- Создание проекта
- Добавление стилей
- Работа с пользователями
Создание проекта
Создадим папку с названием проекта, например log. В этой папке нужно создать виртуальное окружение. Для этого воспользуемся командой: После чего созданное виртуальное окружение нужно активировать, для этого в разных ОС используются разные команды.
Для Linux и OS X: Для Windows: Далее нужно установить фреймворк в это виртуальное окружение, с помощью команды: После того как Django установится, создадим новый проект с помощью команды: После этого будет создана новая папка log, в которую надо перейти. Внутри нее вы увидите файл manage.py. Этот файл мы будем использовать очень часто, на всем протяжении работы с проектом.
Можно сразу попробовать запустить встроенный в Django веб-сервер с помощью команды: (надеюсь, перед тем как запускать эту команду вы не забыли перейти в папку log/log, там, где вы видите файл manage.py) Если после запуска сервера вы откроете браузер, и перейдёте по адресу localhost:8000, то вы должны увидеть приветственную страницу Django. Если страница у вас открылась, значит все в порядке и можно продолжать.
Для хранения записей на сайте нужна БД, на данный момент у нас уже есть sqlite-БД, которая находится в файле db.sqlite3 (рядом с файлом manage.py). Но пока что она пустая, поэтому теперь создадим таблицы в БД, которые потребуются для работы нашего проекта с помощью команды: Так как проект на Django должен состоять из различных приложений (apps), то теперь нам нужно создать новое приложение в нашем проекте, назовем его logs. Делается это с помощью команды: После чего папка проекта (log/log) будет иметь следующее содержимое: Получается, что у нас целых 3 папки log, одна в другой, как в матрёшке. И есть еще папка с названием logs. Постарайтесь не запутаться в них, потому что в дальнейшем нам придется работать отдельно в каждой из них, и очень важно не перепутать в какой что делать.
Чтобы Django узнал о существовании вновь созданного приложения logs, в файле settings.py (папка log/log/log) найдите список INSTALLED_APPS, и добавьте новый элемент с названием приложения – logs. Должно получиться вот так (добавленная строчка выделена жирным):
Модель (Model)
Добавим модели Topic и Entry в файл models.py (папка log/log/logs). Модели будут содержать описания о том, какие данные будут храниться в БД-таблицах нашего проекта.
Откроем файл models.py и добавим туда следующее содержимое: Таблицы моделей Entry и Topic имеют связь один-ко-многим. То есть у каждой основной записи или темы (Topic) может быть много вложенных (Entry).
Теперь осталось создать файл миграции для добавленных моделей и создать новые таблицы в БД на основе этих миграций. Делается это с помощью 2-х команд:
Создание суперпользователя
Чтобы попасть в админ-панель Django (http://localhost:8000/admin) нужно создать нового пользователя. Делается это командой: При создании суперпользователя укажите имя пользователя, email (можно не указывать) и пароль.
После добавления нового пользователя можно попробовать войти в админ-панель Django. Если у вас всё получится, то вы должны увидеть следующую картинку: Здесь вы видите таблицу с 2-мя строчками для работы с группами пользователей (Groups) и с самими пользователями (Users). Для того, чтобы мы здесь могли работать с нашими моделями, их нужно зарегистрировать в файле admin.py (log/log/logs). Откроем файл и добавим в него следующий код: После этого обновите страницу админ-панели и вы должны увидеть 2 новые строчки: Entries и Topics.
Маршруты (urls)
Нам нужно добавить маршруты, по которым запросы от браузера будут открывать нужные страницы сайта. Для этого следует отредактировать 2 файла с одинаковым названием urls.py, это файл urls.py для всего проекта в целом (папка log/log/log) и для отдельного приложения logs (папка log/log/logs). В папке приложения logs файла urls.py нет, его нужно создать самостоятельно.
Для начала откроем файл urls.py проекта (папка log/log/log). И в список urlpatterns добавим новую строчку (выделена жирным): Чтобы не было ошибки нужно в строчку (выше списка urlpatterns): добавить импорт метода include(). После чего эта строчка будет выглядеть следующим образом: Далее создадим файл urls.py в папке приложения (папка log/log/logs). Его содержимое должно быть таким: Здесь, в методе path() первым параметром идет url страницы на сайте, 2-й параметр – это метод в файле views (в данном случае index или topic), который должен обрабатывать пришедший запрос от посетителя сайта, 3-й параметр – это произвольное имя данного маршрута, которое может применяться в дальнейшем для обращения к этому маршруту.
Представление (View)
Представление в Django – это контроллер в других фреймворках. Представление получает информацию от модели и отдает её в шаблон (template), который, в свою очередь, нужен для размещения переданной ему информации на html-странице. Класс представления – views.py можно найти в папке приложения logs (log/log/logs). Добавим в него 2 метода из маршрутов, которые мы добавили выше, в файле urls.py приложения (index() и topic()). В результате его содержимое должно быть следующим: В обоих методах мы видим метод render(). Он использует html-файлы для вывода полученных из модели данных на страницу в браузере. Это и есть шаблоны. Всего нам нужно будет их 3 штуки, один общий (base.html), который будут наследовать 2 других. Первый (index.html) – для вывода списка основных записей или тем (topics), второй (topic.html) – для вывода какой-то определенной темы, и списка вложенных в нее заметок/записей (entries).
Шаблон (Template)
Для того чтобы добавить нужные нам шаблоны в папке приложения logs (log/log/logs) создадим папку templates, а внутри нее папку с названием приложения logs. Затем внутри папки logs создадим 3 файла: base.html, index.html и topic.html. Содержимое файлов представляет html-код с включениями Django-директив. Особо выпендриваться с html-разметкой я не стал, чтобы не усложнять материал, но вы, конечно, можете сделать всё по-своему.
Содержимое файла base.html следующее: Вначале выводится ссылка на индексную страницу сайта, обратите внимание, чтобы создать ссылку здесь используется имя маршрута index, которое мы указали ранее в файле urls.py. Между Django-директивами и будет включено содержимое из 2-х других шаблонов (index.html и topic.html).
Содержимое файла index.html следующее: Содержимое файла topic.html следующее: Теперь в браузере на индексной странице (http://localhost:8000/) можно увидеть следующую картинку: Добавить темы (topics) и вложенные записи (entries) можно через админку Django.
Создаём простой сайт на python3
Первое, что сразу хочется отметить, что обзор изначально предполагает работу на Kali Linux (ну или другой Linux, например, Debian или Ubuntu), у меня есть необходимость в том, чтобы «привыкнуть» к этой операционной системе (а кроме того, приучить ещё пару-тройку человек), и лучше всего это делается при выполнении неких «упражнений».
Несмотря на то, что основной инструментарий Kali Linux предназначен, чтобы ломать, я сторонник теории, что лучше всех «ломает» тот, кто строил. Уж эти так ломают, как другие никогда не справятся. Ведь не зря говорят «ломать не строить, душа не болит», вот и будем строить с душой то, что в будущем придётся ломать (а там и знать, как защищать).
Первая задача – написать простой сайт на python3. Но, прежде чем у нас будет возможность приступить к самому сайту надо сначала запустить сервер, на котором он будет работать. Для этого мы создадим каталог (папку) в которой будем работать. Свой каталог я назвал «sites».
«По умолчанию» python3 уже имеет свой сервер и нам нужно лишь запустить его, это делается простой командой:
python3 -m http.server —cgi
Но стоит закрыть терминал, как придётся снова и снова вводить эту команду, что не очень-то удобно (особенно человеку привыкшему всё решать путём двух кликов мыши).
Это тоже решаемо, для начала перейдём в каталог:
Теперь нам надо создать файл содержимое, которого будет выше написанная строка, в Linux пишем команду:
Вместо server.py Вы можете назвать файл как-нибудь иначе. Я думаю, открыть и добавить текст у Вас проблемы не возникнет, а вот чтобы файл был «исполняемым» (чтобы запускался с двух кликов мыши по нему, это так же требует команды.
При попытке запуска:
Bash: ./server.py: Отказано в доступе
Причина тому не установленные атрибуты файла, поэтому следующая наша команда:
sudo chmod +x server.py
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) …
Кстати, localhost и 127.0.0.1 так же будут доступны.
С настройкой и запуском сервера (одним кликом мыши) мы закончили, приступаем к созданию простой страницы сайта (после перейдём к более сложным процедурам). Работать мы будем с CGI-скриптами, а значит сначала создадим каталог (внутри каталога sites) cgi-bin.