Website development
Compilers
30 May 2013

Простой сайт на D

На хабре уже упоминался язык D. Но популярности он не получил из-за невозможности практического использования, а точнее большинству он просто не нужен.Сегодня хочу рассказать вам об одном полезном фреймворке для D. Большинство программистов хоть раз писали веб-сервер на компилируемом языке, но эти языки слишком низкоуровневы для такой задачи. Для такой задачи можно использовать этот язык в связке с фреймворком vibe.d;

Установка dmd и vibe.d достаточна проста. При установке фреймворка под windows не забудьте прописать нужные пути в PATH

Для начала создадим проект.

vibe init project_name
Фреймворк сам создаст нужную структуру(3 папки и манифест)
./views — шаблоны
./public — статичные файлы, аля *.css,*.js
./src — исходный код приложения

//app.d

import vibe.d;
import std.stdio;
import std.string;
import std.file;
import std.array;

// Подключаем нужны библиотеки

void image (HTTPServerRequest req, HTTPServerResponse res)
{
	auto file = format("./public/images/%s", req.params["f"]);
	
	if(exists(file))
	{
		auto image = cast(ubyte[]) read(file);
		res.writeBody(image,"image");
	}
	else
	{
		res.writeBody("Not Found","text/plain");
	}
}

// Создаем обработчика , который будет отдавать изображения

void style (HTTPServerRequest req, HTTPServerResponse res)
{
	auto css = readText(format("./public/styles/%s", req.params["f"]));
	res.writeBody(css,"text/css");
}

// Создаем обработчика , который будет CSS

void error(HTTPServerRequest req, HTTPServerResponse res, HTTPServerErrorInfo error)
{
	res.writeBody("Some error, man","text/plain");
}

// Создаем обработчика ошибок

void index_req(HTTPServerRequest req, HTTPServerResponse res)
{
	
	auto request = req.params["r"];
	
	// Получаем текст запроса 
	
	res.renderCompat!("index.dt", HTTPServerRequest, "req",string,"title")(req,request);
	// Рендерим шаблон с передачей в него шаблона.
}

void index(HTTPServerRequest req, HTTPServerResponse res)
{
	
	
	res.renderCompat!("index.dt", HTTPServerRequest, "req",string,"title")(req,"Main page");
	// Рендерим шаблон с передачей в него шаблона.
}

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




shared static this()
{ 

	auto settings = new HttpServerSettings;
	settings.port = 8080;
	
	// Подняли http сервер на порту 8080
	
	//settings.errorPageHandler = toDelegate(&error);
	// Подключили обработчик ошибок
	
	
	// Создаем экземляр роутера(он выбирает на какой обработчик отправить тот или иной запрос)
	auto router = new URLRouter;
	router.get("/:r",&index_req);
	router.get("/",&index);
	router.get("/style/:f",&style);
	router.get("/images/:f",&image);
	//Добавили пару обработчиков
	
	listenHTTP(settings,router);
	//Запустили сервер
}


В vibe есть неплохой шаблонизатор, немного спорный, но неплохой. Основан на шаблонизаторе JADE. CSS подключается в зависимости от обработчика, но стили желательно держать в папке public.Файлы шаблонов же следует держать в views.

!!! 5
html
	head
		title Hi world
		meta(charset="utf-8")
		link(rel="stylesheet",href="/style/main.css")
	body
		div#menu
			a#logo(href="/")
			div.links 
				a(href="/main")Main page
				a(href="/about")About
				a(href="/some")Some
		div#content
			div.article
				h3 #{title}
				p Sorry,not founded


Неоспоримый плюс vibed — это работа с проектами. Очень удобно работать из консоли, создание, компиляция и дебаг проекта. Себе наделал пару скриптов для Notepad++.

vibe build

Сборка проекта(разумеется в папке проекта).

После компиляции создается исполняемый файл, подключаются нужные библиотеки. Еще один плюс этого фреймворка — Батарейки в комплекте. Библиотек реально хватает для всего. При том, это не только написание cgi приложений, это полноценный асинхроный сервер. С развитием проекта предполагается развитие балансировщика нагрузки(если правильно понял).

Плюсы: Скорость, Относительная простота, Низкий порог вхождения, Большая комплектация, Гибкость(работает не только с http, но и напрямую с tcp)
Минусы: Сырость проекта и языка, маленькое сообщество

В целом фреймворк вполне неплох и удобен. В сочетании с удобным языком думаю появится новый конкурент GO,node.js.

+36
25.2k 68
Comments 46