Простой сайт на 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.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 46

    • НЛО прилетело и опубликовало эту надпись здесь
        0
        Можно, сложно… но зачем?
          +2
          Ускорение сложных сайтов. Зря так думаете, не так уж и сложно. Думаю в течении некоторого времени появится транслятор html => Vibe templ…
          Даже, примерно, догадываюсь кто его напишет.
            +1
            Это еще не сложно. Вот в Yesod фреймворке на Хаскелле сложно. Там аналогичная система есть для CSS и Javascript. www.yesodweb.com/book/shakespearean-templates
              +4
              Веб-приложение на Хаскелле? Мсье, а вы знаете толк…
            +3
            Не сложно. На днях перенес верстку на slim. Очень понравилось
              +1
              На самом деле уже есть конвертер HTML -> Jade: html2jade.aaron-powell.com/.
                0
                Тем более
              +2
              А зачем у Вас комментарии идут после комментируемого кода? Если сначала прочесть код, то и без комментариев ясно, что он делает.
                0
                Ну не всем это бывает понятно. Пусть, лучше, будут комментарии, нежели непонимание.
                  +4
                  А если комментарии поставить перед комментируемым кодом, будет еще понятнее!
                    0
                    Это уже холивар о стиле )
                      +6
                      Ну вы вообще снесли мозг этим. Где вы вообще откопали такую странную привычку?
                        +7
                        Однажды предложили мальчишки со двора и понеслось.
                        +1
                        Честно говоря, нигде не видел такого стиля. Комментарий нужен, чтоб понять, что делает код. Зачем он, если это уже понятно? А вот до кода он как раз выполнит эту задачу.
                  +3
                  <offtop>Not founded? Это что-то новенькое :)</offtop>
                    0
                    Это же не заголовок, заголовки он либо сам пишем, либо через метод.
                    Просто фраза
                      +5
                      Прошу прощения, не понял вашего комментария. Я просто хотел сказать, что правильно not found
                        +3
                        «Не основано».
                          0
                          Тоже неправильно вас понял. Ох уж это недопонимание
                        0
                        чего новенькое то? стандартная ошибка человека, который не знает форм. Вообще очень прикольно, первый раз встретился, когда прибежала девочка проверяющая тексты после программеров. Грамматически то правильно, но по смыслу не очень. Но мы программеры люди же странные, мало ли что имели ввиду :)
                        0
                        Давно использую vibe.d, но у него есть один большой недостаток: отсутствие daemon режима, который необходим при доступе через ssh. Пришлось писать костыльную обертку, форкающую процесс с vibe.

                        Очень важно: vibe еще не достиг production состояния (хотя сам язык близок к этому). Если решите использовать, готовьтесь столкнутся с сотнями багов и необходимостью допиливания напильником исходников фреймворка.
                          0
                          Можешь пару примеров по Редису скинуть. Не смог разобраться
                          sir.me@list.ru
                            0
                            Редис только пробовали, пока искали альтернативу сломанному монго драйверу. Вся суть:
                            1. import vibe.db.redis.redis;
                            2. создать RedisClient,
                            3. У полученного объекта есть все методы, которые описаны в офф. списке комманд

                            В репе vibe есть пример: github.com/rejectedsoftware/vibe.d/blob/master/examples/redis/source/app.d
                              0
                              В моем dmd, видимо, баг, не компилируется пример.
                                0
                                Ни сообщения компилятора, ни его версии. Вы хотели, чтобы читатели вашего комментария просто посочувствовали?
                                  0
                                  Ну, как бы, я уже понял, что проблема в старой версии.
                            0
                            Отсутствие daemon режима, по моему скромному мнению,
                            для подобных вещей является скорее современной тенденцией.
                            Создавать daemon-ов и управлять ими это работа,
                            например, для upstart script, с которой он прекрасно справляется.

                            Обязательно посмотрите в сторону upstart — несколько
                            строчек в конфиг файле который лежит в /etc/init
                            делают удивительные вещи.
                              0
                              Итого к этому и пришли, rdmd скрипт в /etc/init, но все же приятнее, когда в сервере есть встроенный daemon режим, так как не нужно придумывать своих config файлов и способов логирования ошибок.
                            0
                            У вас дыра вот в этой строке:
                            auto file = format("./public/images/%s", req.params["f"]);
                            

                            Передав ../../XXX можно получить любой файл с сервера.
                              0
                              В нормальных фреймворках должен быть встроен правильный код для отдачи статики.
                                0
                                Есть serveStaticFiles(), но это временная заглушка.
                              0
                              Согласен, в данной реализации это совсем не безопасно. Лучше заменить на встроенный вариант без этой дыры:
                                 auto router = new URLRouter;
                                  router.get("/:r",&index_req);
                                  router.get("/",&index);
                                  router.get("*", serveStaticFiles("./public/"));
                                  ...
                              

                              *Промахнулся, это ответ для ветки чуть выше*
                                0
                                Просто предполагается динамические изменение файлов(ресайз картинки для мобильных налету)
                                0
                                Хотелось бы тесты скорости, хотя бы на helloworld. В сравнении с php и node.js.
                                  +1
                                  Бенчмарк проводил с помощью:
                                  ab -r -n 100000 -c 100 http://127.0.0.1:8080/
                                  


                                  Проц: AMD Athlon(tm) 64 X2 Dual Core Processor 3800+

                                  Сравнивал helloword для vibe и node.js:
                                  vibe dmd:  4183.49 #/sec
                                  node.js helloworld: 3695.95 #/sec 
                                  
                                    0
                                    с gcc или llvm бэкэнднами компиляторов D должен быть быстрей
                                      0
                                      Vibe не собрался с последним gdc, ldc не пробовал. На гитхабе есть тикет, в котором люди добивались большего быстродействия vibe перед node.js: github.com/rejectedsoftware/vibe.d/issues/38
                                      0
                                      При публикации очередной записи с DConf 2013 (День 2. Выступление 4) стали доступны результаты более детальных бенчмарков. Посмотреть их можно на слайдах и в документе.
                                      0
                                      А с php сравнивать смысла не вижу, ибо D компилируемый.
                                        0
                                        ну почему же нет смысла. Понятно, что D быстрее, но вот на сколько быстрее — вопрос. В 2 раза, в 10 или в 100 раз быстрее
                                          0
                                          Так и NodeJs интерпретируемый.
                                          Давайте тогда уж сравним D и C ;)
                                            0
                                            Node.Js компилируемый. У него в основе движок V8 от Гугла (тот же, что и в браузере Chromium / Chrome).
                                            Но с C сравнить тоже интересно, вы правы :)
                                              0
                                              А на Си вы не задолбаетесь сайт то писать?
                                              В Ди баланс между скоростью и удобством
                                              0
                                              Node.js имеет JIT компиляцию, поэтому сравнить стоило.
                                          +1
                                          Знать бы как поведет такой сайт при нагрузке и как дела с оперативкой будут идти.

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

                                          Самое читаемое