<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Мастерская интернет-разработчика &#187; Python. Изучаем вместе!</title>
	<atom:link href="http://adw0rd.ru/category/python-learn-together/feed/" rel="self" type="application/rss+xml" />
	<link>http://adw0rd.ru</link>
	<description>Блог Михаила Андреева (aka adw0rd)</description>
	<lastBuildDate>Wed, 28 Jul 2010 18:10:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Django. Первое приложение</title>
		<link>http://adw0rd.ru/2010/django-first-app/</link>
		<comments>http://adw0rd.ru/2010/django-first-app/#comments</comments>
		<pubDate>Wed, 26 May 2010 17:09:03 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Python. Изучаем вместе!]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4852</guid>
		<description><![CDATA[Захотелось мне поведать как использовать связь ManyToMany, начал я значит писать пост, но так как я хотел его детализировать то он слишком разросся... И я решил сначала написать пост о том, как создавать первый проект и приложение на Django, чтобы потом ссылаться сюда. &#8212; начинал я этот пост писать еще в том году, да все [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://adw0rd.ru/wp-content/uploads/2009/11/Djangologo.gif" alt="Djangologo" title="Djangologo" width="125" height="50" class="alignright size-full wp-image-4834" /></p>
<p>Захотелось мне поведать как использовать связь <strong>ManyToMany</strong>, начал я значит писать пост, но так как я хотел его детализировать то он слишком разросся... И я решил сначала написать пост о том, как создавать первый проект и приложение на <strong>Django</strong>, чтобы потом ссылаться сюда.</p>
<p><i style="color:#c4c4c4">&mdash; начинал я этот пост писать еще в том году, да все руки не доходили его закончить, спасибо vasa_c за терпение</i></p>
<h3>Устанавливаем Django</h3>
<p>Заходим на страницу <noindex><a rel="nofollow" href="http://www.djangoproject.com/download/" >загрузки официального сайта</a></noindex>, скачиваем <noindex><a rel="nofollow" href="http://www.djangoproject.com/download/1.1.1/tarball/" >Django 1.1.1</a></noindex> (или выше). Далее, как и в инструкции:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-O</span> Django-1.1.1.tar.gz http:<span style="color: #000000; font-weight: bold;">//</span>www.djangoproject.com<span style="color: #000000; font-weight: bold;">/</span>download<span style="color: #000000; font-weight: bold;">/</span>1.1.1<span style="color: #000000; font-weight: bold;">/</span>tarball<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzvf</span> Django-1.1.1.tar.gz<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> Django-1.1.1<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> python setup.py <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<p>Все, джанго установлен!<br />
<span id="more-4852"></span><br />
Так как мы будем работать с MySQL, то вам надо установить библиотеку py-mysqldb, представляющая собой интерфейс к MySQL.</p>
<h4>Для Ubuntu:</h4>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> python-mysqldb</div></div>
<h4>Для FreeBSD</h4>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>databases<span style="color: #000000; font-weight: bold;">/</span>py-MySQLdb<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<p>А для Windows можно скачать <noindex><a rel="nofollow" href="http://sourceforge.net/projects/mysql-python/files/mysql-python/" >тут</a></noindex>.</p>
<h3>Создаем наш первый проект</h3>
<p>Допустим, что имя проекта у нас будет &laquo;myproject&raquo;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #dc143c;">cd</span> /www<br />
django-admin.<span style="color: black;">py</span> startproject myproject</div></div>
<p>Теперь создайте себе новую БД &laquo;myproject&raquo;:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #ff0000;">`myproject`</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARACTER <span style="color: #993333; font-weight: bold;">SET</span> utf8 COLLATE utf8_general_ci;</div></div>
<p>И отредактируйте &laquo;/www/myproject/settings.py&raquo;, заменив только соответствующие части:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Настройки БД</span><br />
DATABASE_ENGINE = <span style="color: #483d8b;">'mysql'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.</span><br />
DATABASE_NAME = <span style="color: #483d8b;">'myproject'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Or path to database file if using sqlite3.</span><br />
DATABASE_USER = <span style="color: #483d8b;">'username'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Not used with sqlite3.</span><br />
DATABASE_PASSWORD = <span style="color: #483d8b;">'password'</span> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Not used with sqlite3.</span><br />
DATABASE_HOST = <span style="color: #483d8b;">''</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Set to empty string for localhost. Not used with sqlite3.</span><br />
DATABASE_PORT = <span style="color: #483d8b;">''</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Set to empty string for default. Not used with sqlite3.</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Путь до каталога, где лежат наши медиа файлы (css, js, images)</span><br />
MEDIA_ROOT = <span style="color: #483d8b;">'/www/myproject/static/'</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># URL медиа файлов (css, js, images)</span><br />
MEDIA_URL = <span style="color: #483d8b;">'/'</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># URL медиа файлов админки (css, js, images, etc)</span><br />
ADMIN_MEDIA_PREFIX = <span style="color: #483d8b;">'/admin-media/'</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Путь до каталога с шаблонами</span><br />
TEMPLATE_DIRS = <span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">&quot;/www/myproject/blog/templates&quot;</span><br />
<span style="color: black;">&#41;</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Установленные приложения в нашем проекте</span><br />
INSTALLED_APPS = <span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.auth'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.contenttypes'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.sessions'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.sites'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.admin'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'myproject.blog'</span>,<br />
<span style="color: black;">&#41;</span><br />
<span style="color: #808080; font-style: italic;"># в конец добавлено две строки, первая подключает джанговскую админку,</span><br />
<span style="color: #808080; font-style: italic;"># а второе наше приложение, которое мы ниже опишем</span></div></div>
<p>Для чего я ставлю в начале строки <strong>&laquo;#~*~ coding: utf-8 ~*~&raquo;</strong> читайте <noindex><a rel="nofollow" href="http://www.python.org/dev/peps/pep-0263/" >тут</a></noindex>.</p>
<h3>Создаем наше первое приложение</h3>
<p>После того, как вы создали проект, надо создать приложение, если у вас проект состоит из одного приложения&nbsp;&mdash; можете его назвать &laquo;main&raquo;.</p>
<p>Создаем приложение &laquo;blog&raquo;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #dc143c;">cd</span> /www/myproject<br />
python manage.<span style="color: black;">py</span> startapp blog</div></div>
<h4>Файл модели</h4>
<p>Теперь перейдем к разработке модели нашего приложения, отредактируем &laquo;/www/myproject/blog/models.py&raquo;.<br />
У нас будет пока одна сущность, это Посты в Блоге:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
<span style="color: #808080; font-style: italic;"># импортируем класс модели</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> models<br />
<span style="color: #808080; font-style: italic;"># и админки</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span> <span style="color: #ff7700;font-weight:bold;">import</span> admin<br />
<br />
<span style="color: #483d8b;">''</span><span style="color: #483d8b;">'<br />
Blog posts<br />
'</span><span style="color: #483d8b;">''</span><br />
<span style="color: #ff7700;font-weight:bold;">class</span> Post<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># название поста</span><br />
&nbsp; &nbsp; title = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># содержимое поста</span><br />
&nbsp; &nbsp; text = models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #483d8b;">''</span><span style="color: #483d8b;">'<br />
Класс для админки, тут будут дополнительные атрибуты необходимые для админки<br />
'</span><span style="color: #483d8b;">''</span><br />
<span style="color: #ff7700;font-weight:bold;">class</span> PostAdmin<span style="color: black;">&#40;</span>admin.<span style="color: black;">ModelAdmin</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># в таблице списка постов выводить только колонку title, если вы добавите еще одно имя поля, то и оно выведется</span><br />
&nbsp; &nbsp; list_display = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'title'</span>,<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># связываем эту модель с моделью PostAdmin</span><br />
admin.<span style="color: #dc143c;">site</span>.<span style="color: black;">register</span><span style="color: black;">&#40;</span>Post, PostAdmin<span style="color: black;">&#41;</span></div></div>
<p>После создания файла моделей, вам необходимо запустить синхронизацию с БД, для того чтобы создались структуры данных:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>myproject<br />
python manage.py syncdb</div></div>
<blockquote class="info">
<p>
Для более детального изучения команд manage.py введите:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python manage.py <span style="color: #7a0874; font-weight: bold;">help</span></div></div>
<p>Если вас интересует конкретная комманда, например syncdb, то:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python manage.py <span style="color: #7a0874; font-weight: bold;">help</span> syncdb</div></div>
<p>Вы так же можете создавать свои команды, но об этом поговорим не в этот раз.
</p>
</blockquote>
<p><strong>syncdb</strong> создаст таблицы в вашей БД, а также при первой инициализации попросит <em>создать</em> рутовую учетную запись для вашего проекта в django (это будет админский аккаунт):</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Creating table auth_permission<br />
Creating table auth_group_permissions<br />
Creating table auth_group<br />
Creating table auth_user_user_permissions<br />
Creating table auth_user_groups<br />
Creating table auth_user<br />
Creating table auth_message<br />
Creating table django_content_type<br />
Creating table django_session<br />
Creating table django_site<br />
Creating table django_admin_log<br />
Creating table blog_post<br />
<br />
You just installed Django's auth system, which means you don't have any superusers defined.<br />
Would you like to create one now? (yes/no): yes<br />
Username (Leave blank to use 'root'): <br />
E-mail address: mail@example.com<br />
Password: <br />
Password (again): <br />
Superuser created successfully.<br />
Installing index for auth.Permission model<br />
Installing index for auth.Message model<br />
Installing index for admin.LogEntry model</div></div>
<p>Когда вы создадите новый класс модели вам будет необходимо вновь запустить syncdb.<br />
Если вы внесли изменения в уже синхронизированное приложение, а именно в его модель, то syncdb НЕ внесет их в вашу БД, для этого используйте sqlall и другие sql* комманды:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python manage.py sqlall название_приложения <span style="color: #7a0874; font-weight: bold;">&#40;</span>например: blog<span style="color: #7a0874; font-weight: bold;">&#41;</span></div></div>
<p>Или попробуйте расширение для Django <noindex><a rel="nofollow" href="http://code.google.com/p/django-evolution/" >Django Evolution</a></noindex> (для этого необходимо его установить в вашу систему и добавить в INSTALLED_APPS&nbsp;&mdash; &laquo;django_evolution&raquo;).</p>
<h4>Файл урлов</h4>
<p>Для навигации по вашему проекту вам нужен роутер (URL диспетчер).<br />
Отредактируем &laquo;/www/myproject/urls.py&raquo;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
<span style="color: #808080; font-style: italic;"># импортируем админку</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span> <span style="color: #ff7700;font-weight:bold;">import</span> admin<br />
<br />
<span style="color: #808080; font-style: italic;"># Makes the patterns() function available</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">conf</span>.<span style="color: black;">urls</span>.<span style="color: black;">defaults</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span><br />
<br />
<span style="color: #808080; font-style: italic;"># импортируем наши вьюхи (см. ниже описание файла вьюх)</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> myproject.<span style="color: black;">blog</span>.<span style="color: black;">views</span> <span style="color: #ff7700;font-weight:bold;">import</span> main_page, get_post<br />
<br />
<span style="color: #808080; font-style: italic;"># Above we used admin.autodiscover() to automatically load the INSTALLED_APPS admin.py modules</span><br />
admin.<span style="color: black;">autodiscover</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
urlpatterns = patterns<span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>,<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Если ничего не введено, то отдаем управление mainpage вьюхе</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^$'</span>, main_page<span style="color: black;">&#41;</span>,<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Если передан id поста, то отдаем управление get_post вьюхе</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^post/([0-9]{1,5})'</span>, get_post<span style="color: black;">&#41;</span>,<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Если введен /admin/, то идем в админку</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^admin/'</span>, include<span style="color: black;">&#40;</span>admin.<span style="color: #dc143c;">site</span>.<span style="color: black;">urls</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,<br />
<span style="color: black;">&#41;</span></div></div>
<p>Вы конечно можете отредактировать локальный для приложения &laquo;blog&raquo;&nbsp;&mdash; urls.py (&laquo;/www/myproject/blog/urls.py&raquo;), но тогда вам надо будет импортировать &laquo;/www/myproject/blog/urls.py&raquo; в корневом &laquo;urls.py&raquo;. Либо вы можете его определить в settings.py (ROOT_URLCONF).</p>
<h4>Файл вьюхи</h4>
<p>Ту роль, которую играет &laquo;Controller&raquo; в MVC, в Django играет роль View. Почему это так читайте <noindex><a rel="nofollow" href="http://docs.djangoproject.com/en/dev/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names" >тут</a></noindex>.<br />
Отредактируем &laquo;/www/myproject/blog/views.py&raquo;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
<span style="color: #808080; font-style: italic;"># функция генерирующая 404 страницу</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">http</span> <span style="color: #ff7700;font-weight:bold;">import</span> Http404<br />
<br />
<span style="color: #808080; font-style: italic;"># функция отрисовки страницы, принимающая путь до шаблона и данные помещенные в шаблон</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">shortcuts</span> <span style="color: #ff7700;font-weight:bold;">import</span> render_to_response<br />
<br />
<span style="color: #808080; font-style: italic;"># наша модель</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> myproject.<span style="color: black;">blog</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Post<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> main_page <span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Получаем список постов</span><br />
&nbsp; &nbsp; posts = Post.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># отрисовываем</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span><span style="color: #483d8b;">'list.html'</span>, <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;posts&quot;</span>: &nbsp;posts<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> get_post <span style="color: black;">&#40;</span>request, post_id<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># выбираем конкретный пост, pk - primary key</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; post = Post.<span style="color: black;">objects</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span>pk=post_id<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> Post.<span style="color: black;">DoesNotExist</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># если такого поста нет, то генерируем 404</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">raise</span> Http404<br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># отрисовываем</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span><span style="color: #483d8b;">'single.html'</span>, <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;title&quot;</span>: &nbsp;post.<span style="color: black;">title</span>, <span style="color: #483d8b;">&quot;text&quot;</span>: post.<span style="color: black;">text</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span></div></div>
<h3>Вывод в шаблоне</h3>
<p>В Django очень мощный и гибкий шаблонизатор, у него даже есть аналог на PHP&nbsp;&mdash; <strong>Twig</strong>, что говорит о его удобстве (был бы неудобным&nbsp;&mdash; не копировали бы), хотя <strong>Twig</strong> по слухам сильно хуже.<br />
Однако, есть более крутой шаблонизатор для Django&nbsp;&mdash; <noindex><a rel="nofollow" href="http://jinja.pocoo.org/2/" >Jinja2</a></noindex>, с более высокой производительностью и более гибкими возможностями. Описывать <strong>Jinja</strong> я не буду, ведь не это цель сего поста, поэтому делюсь только ссылочками:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://vostryakov.ru/blog/13-perehod-ot-django-templejtovk-jinja2/" >Переход от Django темплэйтов к Jinja2</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://docs.djangoproject.com/en/dev/ref/templates/api/#using-an-alternative-template-language" >Django: Using an alternative template language</a></noindex></li>
</ul>
<p>С более полными возможностями <strong>Django Template</strong> вы можете познакомится на <noindex><a rel="nofollow" href="http://docs.djangoproject.com/en/dev/topics/templates/" >официальной странице</a></noindex>.</p>
<p>В <strong>Django Template</strong> поддерживается наследование, поэтому мы напишем общий шаблон и будем его использовать <strong>base.html</strong>:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;content-type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>{% block title %}Default{% endblock %} / MyProject<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span><br />
&nbsp; &nbsp; {% block content %}<br />
&nbsp; &nbsp; {% endblock %}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></div></div>
<p>Шаблон вывода списка постов <strong>list.html</strong>:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">{% extends &quot;base.html&quot; %}<br />
<br />
{% block title %}List!{% endblock %}<br />
<br />
{% block content %}<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;list-style-type:none&quot;</span>&gt;</span><br />
{% for post in posts %}<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;padding-left:10px;{% if forloop.counter0|divisibleby:&quot;</span><span style="color: #cc66cc;">4</span><span style="color: #ff0000;">&quot; %}background-color:#E1F3C9{% endif %}&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/post/{{ post.id }}/&quot;</span>&gt;</span>{{ post.title }}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>{{ post.text }}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span><br />
{% endfor %}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span><br />
{% endblock %}</div></div>
<p>Шаблон вывода одной записи <strong>single.html</strong>:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">{% extends &quot;base.html&quot; %}<br />
<br />
{% block title %}{{ title }}{% endblock %}<br />
<br />
{% block content %}<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>{{ title }}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h1</span>&gt;</span><br />
<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span><br />
{{ text }}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span><br />
{% endblock %}</div></div>
<h3>Nginx</h3>
<p>Теперь настроим Nginx для того, чтобы запуская &laquo;manage.py runserver&raquo; нам не прописывать порт в URL и чтобы использовать нормальное имя хоста, хотя вы может вполне без это обойтись.<br />
Но я очень рекомендую использовать Nginx.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">server {<br />
&nbsp; &nbsp; listen 80;<br />
&nbsp; &nbsp; server_name myproject.loc;<br />
<br />
&nbsp; &nbsp; location ^~ /admin-media {<br />
&nbsp; &nbsp; &nbsp; &nbsp; alias /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location /static/ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; root /www/myproject/static/;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location ~* \.(jpg|jpeg|gif|png|ico|css|zip|js|swf)$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; root /www/myproject/static/;<br />
&nbsp; &nbsp; &nbsp; &nbsp; expires 7d;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location / {<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http://127.0.0.1:8001/;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_redirect off;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header Host $host;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Real-IP $remote_addr;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />
&nbsp; &nbsp; }<br />
}</div></div>
<p>Добавить в &laquo;/etc/hosts&raquo; ваш хост:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">127.0.0.1 &nbsp; &nbsp; &nbsp;myproject.loc</div></div>
<p>И перезагрузить Nginx:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># в новых версиях nginx можно послать сигнал</span><br />
nginx <span style="color: #660033;">-s</span> reload<br />
<br />
<span style="color: #666666; font-style: italic;"># или для ubuntu/debian через скрипт инициализации</span><br />
service nginx restart<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>nginx restart<br />
<br />
<span style="color: #666666; font-style: italic;"># или для freebsd</span><br />
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span>nginx restart</div></div>
<p>Запускаем веб-сервер проекта на 8001 порту, так как мы туда будем проксировать из Nginx:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>myproject<br />
python manage.py runserver <span style="color: #000000;">8001</span></div></div>
<p>Теперь зайдите в админку (<noindex><a rel="nofollow" href="http://myproject.loc/admin/" >http://myproject.loc/admin/</a></noindex>), введите вашу &laquo;root&raquo; учетку, которую создавали при syncdb.</p>
<blockquote class="download">
<p>Вы можете скачать архив с исходниками проекта <a href="/files/django-myproject/myproject-20100526.tgz">тут</a></p>
</blockquote>
<p>Вот мы и познакомились с первым приложение на Django, как я и обещал в начале этого поста следующая статья будет о <strong>ManyToMany</strong>, где мы подключим к нашему &laquo;Блогу&raquo; возможность создавать и выводить теги, а также расскажу более полно о возможностях моделях и ORM, View и о URL диспетере.</p>
<p>P.S. Пост дописывал в торопях, если найдете любые ошибки&nbsp;&mdash; обязательно отпишитесь в комментарии, спасибо!</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/django-first-app/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Использование Nginx+Tornado для приложений на Django</title>
		<link>http://adw0rd.ru/2009/nginx-tornado-django/</link>
		<comments>http://adw0rd.ru/2009/nginx-tornado-django/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 16:08:26 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Python. Изучаем вместе!]]></category>
		<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tornado]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4780</guid>
		<description><![CDATA[Не так давно был анонсирован новый веб-сервер Tornado, написанный на Python, отличительной чертой которого являлась скорость работы и то что это не просто веб-сервер, а целый фреймворк. Впервые я с ним познакомился на хабре, а вскоре после этого прочел заметку Django + Tornado и решил попробовать торнадо в действии! На самом деле конфигурация &#171;Nginx+Tornado+Django&#187; позаимствована [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/nginx-tornado-django/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/11/tornado.png" alt="tornado" title="tornado" width="286" height="72" class="alignright size-full wp-image-4785" /></a></p>
<p>Не так давно был анонсирован новый веб-сервер <strong>Tornado</strong>, написанный на <strong>Python</strong>, отличительной чертой которого являлась скорость работы и то что это не просто веб-сервер, а целый фреймворк.</p>
<p>Впервые я с ним познакомился на <noindex><a rel="nofollow" href="http://habrahabr.ru/blogs/python/69346/" >хабре</a></noindex>, а вскоре после этого прочел заметку <noindex><a rel="nofollow" href="http://imbolc.name/2009/09/django-tornado.html" >Django + Tornado</a></noindex> и решил попробовать торнадо в действии!</p>
<p>На самом деле конфигурация &laquo;Nginx+Tornado+Django&raquo; позаимствована у заметки, ссылку на которую я привел выше, однако у меня та конфигурация не заработала, поэтому я выкладываю для себя и друзей свой конфиг.</p>
<h3>Установка</h3>
<p>Устанавливаем <strong>Tornado</strong>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>py-tornado<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<p>Устанавливаем <strong>Nginx</strong>, если он у вас не установлен:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>nginx-devel<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<p><span id="more-4780"></span></p>
<h3>Настройка</h3>
<p>Теперь настроим Nginx для проксирования на Tornado:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">server <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
<br />
&nbsp; &nbsp; listen <span style="color: #000000;">80</span>;<br />
&nbsp; &nbsp; server_name liburg.ru;<br />
<br />
&nbsp; &nbsp; location ^~ <span style="color: #000000; font-weight: bold;">/</span>admin-media <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>python2.6<span style="color: #000000; font-weight: bold;">/</span>site-packages<span style="color: #000000; font-weight: bold;">/</span>django<span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>admin<span style="color: #000000; font-weight: bold;">/</span>media;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
&nbsp; &nbsp; location = <span style="color: #000000; font-weight: bold;">/</span>robots.txt <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; root <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>liburg<span style="color: #000000; font-weight: bold;">/</span>static<span style="color: #000000; font-weight: bold;">/</span>;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
&nbsp; &nbsp; location ~<span style="color: #000000; font-weight: bold;">*</span> \.<span style="color: #7a0874; font-weight: bold;">&#40;</span>jpg<span style="color: #000000; font-weight: bold;">|</span>jpeg<span style="color: #000000; font-weight: bold;">|</span>gif<span style="color: #000000; font-weight: bold;">|</span>png<span style="color: #000000; font-weight: bold;">|</span>ico<span style="color: #000000; font-weight: bold;">|</span>css<span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">zip</span><span style="color: #000000; font-weight: bold;">|</span>js<span style="color: #000000; font-weight: bold;">|</span>swf<span style="color: #7a0874; font-weight: bold;">&#41;</span>$ <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; root <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>liburg<span style="color: #000000; font-weight: bold;">/</span>static<span style="color: #000000; font-weight: bold;">/</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; expires 7d;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
&nbsp; &nbsp; location <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http:<span style="color: #000000; font-weight: bold;">//</span>127.0.0.1:<span style="color: #000000;">8001</span><span style="color: #000000; font-weight: bold;">/</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_redirect off;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header Host <span style="color: #007800;">$host</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Real-IP <span style="color: #007800;">$remote_addr</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Forwarded-For <span style="color: #007800;">$proxy_add_x_forwarded_for</span>;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span></div></div>
<p>В корень проекта (рядом с manage.py, settings.py и т.д.) кладем файл &laquo;tornading.py&raquo;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">signal</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">fcntl</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">subprocess</span> <span style="color: #ff7700;font-weight:bold;">import</span> Popen<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>.<span style="color: black;">handlers</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> tornado.<span style="color: black;">httpserver</span> <br />
<span style="color: #ff7700;font-weight:bold;">import</span> tornado.<span style="color: black;">ioloop</span> <br />
<span style="color: #ff7700;font-weight:bold;">import</span> tornado.<span style="color: black;">wsgi</span> <br />
<br />
PORT = <span style="color: #ff4500;">8001</span><br />
HOST = <span style="color: #483d8b;">'liburg.ru'</span> &nbsp;<span style="color: #808080; font-style: italic;"># видно в top, htop, ps, etc</span><br />
LOG_FILE = <span style="color: #483d8b;">'/var/log/tornado.log'</span> &nbsp;<span style="color: #808080; font-style: italic;"># '' for not write log</span><br />
LOG_LEVEL = <span style="color: #483d8b;">'INFO'</span> &nbsp;<span style="color: #808080; font-style: italic;"># INFO (все статусы), WARNING (&gt;=404), ERROR (&gt;=500)</span><br />
<br />
<span style="color: #808080; font-style: italic;"># настраиваем Джанго</span><br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">insert</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'/'</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/'</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<span style="color: #dc143c;">os</span>.<span style="color: black;">environ</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'DJANGO_SETTINGS_MODULE'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'settings'</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span><br />
application = django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span>.<span style="color: black;">WSGIHandler</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># если сайт не на Джанго, просто импортируем wsgi-объект как aplication</span><br />
<span style="color: #808080; font-style: italic;">#~ from wsgi_app import application</span><br />
<br />
<span style="color: #808080; font-style: italic;"># настраиваем логирование в файл</span><br />
<span style="color: #dc143c;">os</span>.<span style="color: black;">chdir</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">if</span> LOG_FILE:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: black;">makedirs</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span>LOG_FILE<span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">OSError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">pass</span><br />
&nbsp; &nbsp; file_handler = <span style="color: #dc143c;">logging</span>.<span style="color: black;">handlers</span>.<span style="color: black;">RotatingFileHandler</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; filename = LOG_FILE, mode=<span style="color: #483d8b;">'a+'</span>, &nbsp;<span style="color: #808080; font-style: italic;"># имя файла</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; maxBytes = <span style="color: #ff4500;">1000000</span>, &nbsp;<span style="color: #808080; font-style: italic;"># максимально байт в файле</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; backupCount = <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># максимум файлов</span><br />
&nbsp; &nbsp; file_handler.<span style="color: black;">setLevel</span><span style="color: black;">&#40;</span><span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">logging</span>, LOG_LEVEL<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; file_handler.<span style="color: black;">setFormatter</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">Formatter</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%(asctime)s<span style="color: #000099; font-weight: bold;">\t</span>%(levelname)-8s %(message)s'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datefmt = <span style="color: #483d8b;">'%d-%m-%Y %H:%M:%S'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">getLogger</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>.<span style="color: black;">setLevel</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">logging</span>.<span style="color: black;">NOTSET</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">getLogger</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>.<span style="color: black;">addHandler</span><span style="color: black;">&#40;</span>file_handler<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># блокируемый файл для проверки активности сервера</span><br />
PID_FNAME = <span style="color: #483d8b;">'/tmp/'</span> + <span style="color: #483d8b;">'_'</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/'</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">'.pid'</span><br />
COMMANDS = <span style="color: black;">&#91;</span><span style="color: #483d8b;">'start'</span>, <span style="color: #483d8b;">'stop'</span>, <span style="color: #483d8b;">'restart'</span><span style="color: black;">&#93;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> daemon<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">critical</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'--- SERVER (RE)STARTED'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>PID_FNAME, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">flock</span><span style="color: black;">&#40;</span>f.<span style="color: black;">fileno</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">LOCK_EX</span> | <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">LOCK_NB</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; f.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%-12i'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">getpid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; f.<span style="color: black;">flush</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; container = tornado.<span style="color: black;">wsgi</span>.<span style="color: black;">WSGIContainer</span><span style="color: black;">&#40;</span>application<span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; http_server = tornado.<span style="color: black;">httpserver</span>.<span style="color: black;">HTTPServer</span><span style="color: black;">&#40;</span>container<span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; http_server.<span style="color: black;">listen</span><span style="color: black;">&#40;</span>PORT<span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; tornado.<span style="color: black;">ioloop</span>.<span style="color: black;">IOLoop</span>.<span style="color: black;">instance</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; <br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; started = alegry_started<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> started:<br />
&nbsp; &nbsp; &nbsp; &nbsp; pid = Popen<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>HOST, <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'daemon'</span><span style="color: black;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; executable=<span style="color: #483d8b;">'python'</span><span style="color: black;">&#41;</span>.<span style="color: black;">pid</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Server started at port %s (pid: %i)...'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>PORT, pid<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Server alegry started (pid: %i)'</span> <span style="color: #66cc66;">%</span> started<br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> stop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; started = alegry_started<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> started:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: black;">kill</span><span style="color: black;">&#40;</span>started, <span style="color: #dc143c;">signal</span>.<span style="color: black;">SIGKILL</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Server stoped (pid %i)'</span> <span style="color: #66cc66;">%</span> started<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Server not started'</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> restart<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; stop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> alegry_started<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'<br />
&nbsp; &nbsp; Если сервер запущен, возвращает pid, иначе 0<br />
&nbsp; &nbsp; '</span><span style="color: #483d8b;">''</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>PID_FNAME<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>PID_FNAME, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; f.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'0'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; f.<span style="color: black;">flush</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>PID_FNAME, <span style="color: #483d8b;">'r+'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">flock</span><span style="color: black;">&#40;</span>f.<span style="color: black;">fileno</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">LOCK_EX</span> | <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">LOCK_NB</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">IOError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; started = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>f.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; started = <span style="color: #ff4500;">0</span><br />
&nbsp; &nbsp; f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> started<br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#40;</span>COMMANDS + <span style="color: black;">&#91;</span><span style="color: #483d8b;">'daemon'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #dc143c;">cmd</span> = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">globals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #dc143c;">cmd</span><span style="color: black;">&#93;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Error: invalid command'</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Usage: python tornading.py {%s}.'</span> <span style="color: #66cc66;">%</span> <span style="color: #483d8b;">'|'</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>COMMANDS<span style="color: black;">&#41;</span></div></div>
<p>Стартуем Nginx и Tornado:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span>nginx start<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>liburg<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> python tornading.py start</div></div>
<p>На случай падения Tornado&nbsp;&mdash; добавьте в крон задание на запуск сервера:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>liburg<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>python tornading.py start</div></div>
<p>PS. Проект <noindex><a rel="nofollow" href="http://liburg.ru/" >Либург.ру</a></noindex> работает на Tornado+Django</p>
<p>upd: <noindex><a rel="nofollow" href="http://wiki.python.su/%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8/Tornado-web" >Документация к веб-серверу Tornado</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/nginx-tornado-django/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Установка mod_python для разработки веб-приложений на Python</title>
		<link>http://adw0rd.ru/2009/modpython/</link>
		<comments>http://adw0rd.ru/2009/modpython/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 19:49:35 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Python. Изучаем вместе!]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4594</guid>
		<description><![CDATA[Решил попробовать создать тестовое веб-приложение на Python и первое что пришло в голову&#160;&#8212; использовать mod_python для Apache, погуглив я не нашел толковых примеров и разобравшись с проблемой решил написать об этом заметку. Кстати, самый толковый пример как не странно я нашел на http://modpython.org/examples/, но пришлось &#171;методом тыка&#187; переписывать их пример чтобы что-то заработало. :) Так [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/modpython/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/08/mod_python.gif" alt="mod_python" title="mod_python" width="268" height="164" class="alignright size-full wp-image-4595" /></a></p>
<p>Решил попробовать создать тестовое веб-приложение на Python и первое что пришло в голову&nbsp;&mdash; использовать mod_python для Apache, погуглив я не нашел толковых примеров и разобравшись с проблемой решил написать об этом заметку. Кстати, самый толковый пример как не странно я нашел на <noindex><a rel="nofollow" href="http://modpython.org/examples/" >http://modpython.org/examples/</a></noindex>, но пришлось &laquo;методом тыка&raquo; переписывать их пример чтобы что-то заработало. :)</p>
<p>Так как у меня Windows, то буду рассказывать на примере именно этой ОС, однако покажу как сделать и для FreeBSD.</p>
<blockquote>
<p>
С помощью пакета mod_python для Apache можно запускать сценарии на языке Python, также он поддерживает шаблоны механизма Python Server Pages.</p>
<p><a href="http://adw0rd.ru/2009/python-introduction/" >http://adw0rd.ru/2009/python-introduction/</a>
</p>
</blockquote>
<p><strong>Нам потребуется:</strong></p>
<ul>
<li><noindex><a rel="nofollow" href="http://httpd.apache.org/download.cgi" >Apache версии 2.2</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://www.apache.org/dist/httpd/modpython/win/3.3.1/" >mod_python версии 3.3.1</a></noindex></li>
<li>Интерпретатор Python версии 2.5, например <noindex><a rel="nofollow" href="http://www.activestate.com/activepython/downloads/" >ActivePython 2.5.4.4</a></noindex></li>
</ul>
<p><span id="more-4594"></span></p>
<h3>Установка</h3>
<p>Установите &laquo;ActivePython 2.5.4.4&raquo;, следуя инструкциям установщика, это не должно быть затруднительным. Далее, я предполагаю, что <strong>Apache</strong> у вас уже установлен, поэтому перейду сразу к <strong>mod_python</strong>.</p>
<p>Запускаем &laquo;mod_python-3.3.1.win32-py2.5-Apache2.2.exe&raquo;, он сам подцепит где находится интерпретатор <strong>Python</strong> и следуйте инструкциям.</p>
<blockquote class="info">
<p>
Для FreeBSD надо выполнить:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/ports/www/mod_python3/</span><br />
<span style="color: #666666; font-style: italic;"># make install clean</span></div></div>
</blockquote>
<p>После установки <strong>mod_python</strong> необходимо вписать в &laquo;httpd.conf&raquo; следующую строку (после всех &laquo;LoadModule&raquo;):</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">LoadModule python_module modules/mod_python.so</div></div>
<p>И еще добавьте index.py для директивы &laquo;DirectoryIndex&raquo;:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;IfModule dir_module&gt;<br />
&nbsp; &nbsp; DirectoryIndex index.py index.htm index.html<br />
&lt;/IfModule&gt;</div></div>
<h3>Настройка</h3>
<p>Теперь, впишем инструкции инициализации mod_python для конкретного хоста, у меня это &laquo;liburg.loc&raquo;:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;VirtualHost *:80&gt;<br />
&nbsp; &nbsp; ServerAdmin youmail@example.com<br />
&nbsp; &nbsp; DocumentRoot &quot;C:/path/to/liburg.loc/www&quot;<br />
&nbsp; &nbsp; ServerName liburg.loc<br />
<br />
&nbsp; &nbsp; SetHandler mod_python<br />
&nbsp; &nbsp; PythonHandler mod_python.publisher<br />
&nbsp; &nbsp; PythonDebug On<br />
<br />
&lt;/VirtualHost&gt;</div></div>
<p>И перезагрузите Apache</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">httpd -k restart</div></div>
<h3>Первое наше веб-приложение</h3>
<p>Создаем в &laquo;C:/path/to/liburg.loc/www&raquo; файл index.py с содержимым:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># мы будем использовать Python Server Pages, поэтому надо его подключить<br />
from mod_python import psp<br />
<br />
def index(req):<br />
&nbsp; &nbsp; # &quot;publisher&quot;, который мы повесили в &quot;PythonHandler&quot; вызывает данную ф-ию по умолчанию<br />
&nbsp; &nbsp; return 'Hello World!'</div></div>
<p>Вот и все, наше первое веб-приложение готово!</p>
<p>Самое главное это показать как начать, а вы сами уже почитайте что такое PSP и как использовать его механизм шаблонов, можете рассмотреть <noindex><a rel="nofollow" href="http://modpython.org/examples/" >этот пример</a></noindex> чтобы во всем разобраться.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/modpython/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Как работает Python?</title>
		<link>http://adw0rd.ru/2009/python-howto-work/</link>
		<comments>http://adw0rd.ru/2009/python-howto-work/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 20:13:53 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Python. Изучаем вместе!]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4348</guid>
		<description><![CDATA[Всем еще раз привет, сейчас расскажу о том, как работает Python, что такое интерпретатор, как работает компилятор и что такое байт-код, далее расскажу о виртуальной машине (PVM) и о производительности Python. Также о альтернативных реализациях интерпретатора. После того, как вы установили себе Python, перейдем к теоретически-практической части и начнем с того что из себя представляет [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2009/python-howto-work/"><img src="http://adw0rd.ru/wp-content/uploads/2009/08/python_3.png"  alt="python_3" title="python_3" width="256" height="103" class="alignright size-full wp-image-4412" /></a></noindex></p>
<p>Всем еще раз привет, сейчас расскажу о том, как работает Python, что такое интерпретатор, как работает компилятор и что такое байт-код, далее расскажу о виртуальной машине (PVM) и о производительности Python. Также о альтернативных реализациях интерпретатора.</p>
<p>После того, как <a href="http://adw0rd.ru/2009/python-and-pydev/" >вы установили себе Python</a>, перейдем к теоретически-практической части и начнем с того что из себя представляет интерпретатор.</p>
<h3>Интерпретатор</h3>
<p><strong>Интерпретатор</strong>&nbsp;&mdash; это такая программа, которая выполняет другие программы. Когда вы пишете программу на языке Python, интерпретатор читает вашу программу и выполняет содержащиеся в ней инструкции. В действительности, интерпретатор&nbsp;&mdash; это слой программной логики между вашим программным кодом и аппаратурой вашего компьютера.</p>
<p>В зависимости от используемой версии Python сам интерпретатор может быть реализован как программа на языке C, как набор классов Java и в каком-либо другом виде, но об этом позже.</p>
<h4>Запуск сценария в консоли</h4>
<p>Давайте запустите в консоле интерпретатор:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># python</span></div></div>
<p>Теперь он ожидает ввода комманд, введите туда следующую инструкцию:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'hello world!'</span></div></div>
<p>ура, наша первая программа! :D<br />
<span id="more-4348"></span></p>
<h4>Запуск сценария из файла</h4>
<p>Создайте файл &laquo;test.py&raquo;, с содержимым:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># вывести &quot;hello world&quot;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;hello world&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># вывести 2 в 10 степени</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #ff4500;">2</span> <span style="color: #66cc66;">**</span> <span style="color: #ff4500;">10</span></div></div>
<p>и выполните этот файл:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># python /path/to/test.py</span></div></div>
<p>Вы увидите в консоли результат, поехали дальше!</p>
<h3>Динамическая компиляция и байт-код</h3>
<p>После того, как запустите сценарий, <strong>Python</strong> сначала компилирует исходный текст сценария в байт-код для виртуальной машины. <strong>Компиляция</strong>&nbsp;&mdash; это просто этап перевода, а байт-код это низкоуровневое платформонезависимое представление исходного текста программы. Python транслирует каждую инструкцию в исходном коде сценария в группы инструкций байт-кода для повышения скорости выполнения программы, так как байт-код выполняется намного быстрее. После компиляции в байт-код, создается файл с расширением <strong>&laquo;.pyc&raquo;</strong> по соседству с исходным текстом сценария.</p>
<p>В следующий раз, когда вы запустите свою программу интерпретатор минует этап компиляции и отдаст на выполнение откомпилированный файл с расширением &laquo;.pyc&raquo;. Однако, если вы изменили исходные тексты вашей программы, то снова произойдет этап компиляции в байт-код, так как Python автоматически следит за датой изменения файла с исходным кодом.</p>
<p>Если Python окажется не в состоянии записать файл с байт-кодом, например из-за отсутствия прав на запись на диск, то программа не пострадает, просто байт-код будет собран в памяти и при завершении программы оттуда удален.</p>
<h3>Виртуальная машина Python (PVM)</h3>
<p>После того как пройдет процесс компиляции, байт-код передается механизму под названием <strong>виртуальная машина</strong>, которая и выполнит инструкции из байт-кода. <strong>Виртуальная машина</strong>&nbsp;&mdash; это механизм времени выполнения, она всегда присутствует в составе системы Python и это крайняя составляющая системы под названием &laquo;Интерпретатор Python&raquo;.</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2009/08/python.png" alt="python" title="python" width="478" height="165" class="alignnone size-full wp-image-4391" style="border: dotted #c4c4c4 2px;" /></p>
<p>Для закрепления пройденного еще раз проясним ситуацию, компиляция в байт-код производится автоматически, а PVM&nbsp;&mdash; это всего лишь часть системы Python, которую вы установили вместе с интерпретатором и компилятором. Все происходит прозрачно для программиста, и вам не надо выполнять эти операции вручную.</p>
<h3>Производительность</h3>
<p>Программисты имеющие опыт работы с такими языками как C и C++, могут заметить некоторые отличия в модели выполнения Python. Первое&nbsp;&mdash; это отсутствие этапа сборки или вызова утилиты &laquo;make&raquo;, программы на Python могут быть сразу же запущены после написания исходного кода. Второе отличие&nbsp;&mdash; байт-код не является двоичным машинным кодом (например инструкции для микропроцессора Intel), он является внутренним представлением программы на языке Python.</p>
<p>По этим причинам программы на Python не могут выполняться также быстро как на C/C++. Обход инструкций выполняет виртуальная система, а не микропроцессор, и чтобы выполнить байт-код, необходима дополнительная интерпретация, инструкции которой требуют большего времени, чем машинные инструкции микропроцессора.</p>
<p>Однако, с другой стороны, в отличии от традиционных интерпретаторов, например как в PHP, здесь присутствует дополнительный этап компиляции&nbsp;&mdash; интерпретатору не требуется каждый раз анализировать исходный текст программы.</p>
<p>В итоге, Python по производительности находится между традиционными компилирующими и традиционными интерпретирующими языками программирования.</p>
<h3>Альтернативные реализации Python</h3>
<p>То что было сказано выше о компиляторе и виртуальной машине, характерно для стандартной реализации Python, так называемой CPython (реализации на ANSI C). Однако также существует альтернативные реализации, такие как Jython и IronPython, о которых пойдет сейчас речь.</p>
<h4>CPython</h4>
<p>Это стандартная и оригинальная реализация Python, названа так, потому что написана на ANSI C. Именно ее мы установили, когда выбрали пакет <strong>ActivePython</strong> или установили из <strong>FreeBSD</strong> портов. Поскольку это эталонная реализация, она как правило <strong>работает быстрее, устойчивее и лучше</strong>, чем альтернативные реализации.</p>
<h4>Jython</h4>
<p>Первоначальное название JPython, основная цель&nbsp;&mdash; <strong>тесная интеграция с языком программирования Java</strong>. Реализация Jython состоит из Java-классов, которые выполняют компиляцию программного кода на языке Python в байт-код Java и затем передают полученный байт-код <strong>виртуальной машине Java (JVM)</strong>.</p>
<p>Цель Jython состоит в том, чтобы позволить программам на языке Python управлять Java-приложениями, точно также как CPython может управлять компонентами на языках C/C++. Эта реализация имеет беcшовную интеграцию с Java. Поскольку программный код на Python транслируется в байт-код Java, во время выполнения он ведет себя точно также, как настоящая программа на языке Java. Программы на Jython могут выступать в качестве апплетов и сервлетов, создавать графический интерфейс с использованием механизмов Java и т.д. Более того, Jython обеспечивает поддержку возможности импортировать и использовать Java-классы в программном коде Python.</p>
<p>Тем не менее, поскольку реализация Jython обеспечивает более низкую скорость выполнения и менее устойчива по сравнению с CPython, она представляет интерес скорее для разработчиков программ на языке Java, которым необходим язык сценариев в качестве интерфейса к Java-коду.</p>
<h4>IronPython</h4>
<p>Реализация предназначена для обеспечения интеграции программ Python с приложениями, созданными для работы в среде Microsoft .NET Framework операционной системы Windows, а также в Mono&nbsp;&mdash; открытом эквиваленте для Linux. Платформа .NET и среда выполнения языка C# предназначены для обеспечения взаимодействия между программными объектами&nbsp;&mdash; независимо от используемого языка программирования, в духе более ранней модели COM компании Microsoft.</p>
<p>IronPython позволяет программам на языке Python играть роль как клиентских, так и серверных компонентов, доступных из других языков программирования .NET. Поскольку <strong>разработка ведется компанией Microsoft</strong>, от IronPython, помимо прочего, можно было бы ожидать существенной оптимизации производительности.</p>
<h3>Средства оптимизации скорости выполнения</h3>
<p>Существуют и другие реализации, включая динамический компилятор <strong>Psyco</strong> и транслятор Shedskin C++, которые пытаются оптимизировать основную модель выполнения.</p>
<h4>Динамический компилятор Psyco</h4>
<p><strong>Система Psyco</strong>&nbsp;&mdash; это компонент, расширяющий модель выполнения байт-кода, что позволяет программам выполняться быстрее. <strong>Psyco</strong> является расширением <strong>PVM</strong>, которое собирает и использует информацию о типах, чтобы транслировать части байт-кода программы в истинный двоичный машинный код, который выполняется гораздо быстрее. Для такой трансляции не требуется вносить изменения в исходный код или производить дополнительную компиляцию в ходе разработки.</p>
<p>Во время выполнения программы, Psyco собирает информацию о типах объектов, и затем эта информация используется для генерации высокоэффективного машинного кода, оптимизированного для объектов этого типа. После этого произведенный машинный код заменяет соответствующие участки байт-кода, тем самым увеличивается скорость выполнения.</p>
<p>В идеале некоторые участки программного кода под управление Psyco <strong>могут выполняться также быстро, как скомпилированный код на языке Си</strong>.</p>
<p>Psyco обеспечивает увеличение скорости от 2 до 100 раз, но обычно в 4 раза, при использовании немодифицированного интерпретатора Python. Единственный минус у Psyco, это то обстоятельство, что в настоящее время он способен генерировать машинный код только для архитектуры <strong>Intel x86</strong>.</p>
<p>Psyco не идет в стандартной поставке, его надо скачать и установить отдельно. Еще есть проект <strong>PyPy</strong>, который представляет собой попытку переписать <strong>PVM</strong> с целью оптимизации кода как в <strong>Psyco</strong>, проект <strong>PyPy</strong> собирается поглотить в большей мере проект <strong>Psyco</strong>.</p>
<h4>Транслятор Shedskin C++</h4>
<p><strong>Shedskin</strong>&nbsp;&mdash; это система, которая преобразует исходный код на языке Python в исходный код на языке C++, который затем может быть скомпилирован в машинный код. Кроме того, система реализует платформонезависемый подход к выполнению программного кода Python.<br />
<a name="frozen"></a></p>
<h3>Фиксированные двоичные файлы (frozen binaries)</h3>
<p>Иногда необходимо из своих программ на Python создавать самостоятельные исполняемые файлы. Это необходимо скорее для упаковки и распространения программ.</p>
<p>Фиксированные двоичные файлы объединяют в единый файл пакета байт-код программ, PVM и файлы поддержки, необходимые программам. В результате получается единственный исполняемый файл, например файл с расширение &laquo;.exe&raquo; для Windows.</p>
<p>На сегодняшний день существует три основных инструмента создания &laquo;frozen binaries&raquo;:</p>
<ul>
<li><strong>py2exe</strong>&nbsp;&mdash; он может создавать автономные программы для Windows, использующие библиотеки Tkinter, PMW, wxPython и PyGTK для создания графического интерфейса, программы использующие программные средства создания игр PyGame, клиентские программы win32com и многие другие;</li>
<li><strong>PyInstaller</strong>&nbsp;&mdash; напоминает py2exe, но также работает в Linux и UNIX и способен производить самоустанавливающиеся исполняемые файлы;</li>
<li><strong>freeze</strong>&nbsp;&mdash; оригинальная версия.</li>
</ul>
<p>Вам надо загружать эти инструменты отдельно от Python, они распространяются бесплатно.</p>
<p>Фиксированные двоичные файлы имеют немалый размер, ибо они содержат в себе PVM, но по современным меркам из все же нельзя назвать необычно большими. Так как интерпретатор Python встроен непосредственно в фиксированные двоичные файлы, его установка не является обязательным требованием для запуска программ на принимающей стороне.</p>
<h3>Резюме</h3>
<p>На сегодня всё, в следующей статье расскажу о стандартных типах данные в Python, ну и в последующих статьях рассмотрим каждый тип в отдельности, а также функции и операторы для работы с этими типами.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/python-howto-work/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Установка интерпретатора Python и среды разрабоки PyDev для Eclipse</title>
		<link>http://adw0rd.ru/2009/python-and-pydev/</link>
		<comments>http://adw0rd.ru/2009/python-and-pydev/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 18:56:28 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Python. Изучаем вместе!]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4407</guid>
		<description><![CDATA[Всем привет, сегодня я расскажу о том, как вам начать разрабатывать на Python свои программы, а именно о установке интерпретатора, а также о среде разработки PyDev для Eclipse. Установка интерпретатора Python Интерпретатор нужен для обработки инструкций исходного кода сценариев на языке Python, последующей компиляции в байт-код и выполнения на виртуальной машине. О всех этих понятиях [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2009/python-and-pydev/"><img src="http://adw0rd.ru/wp-content/uploads/2009/08/python_2.png"  alt="python_2" title="python_2" width="256" height="103" class="alignright size-full wp-image-4354" /></a></noindex></p>
<p>Всем привет, сегодня я расскажу о том, как вам начать разрабатывать на Python свои программы, а именно о установке интерпретатора, а также о среде разработки PyDev для Eclipse.</p>
<h3>Установка интерпретатора Python</h3>
<p>Интерпретатор нужен для обработки инструкций исходного кода сценариев на языке Python, последующей компиляции в байт-код и выполнения на виртуальной машине. О всех этих понятиях и <a href="/2009/python-howto-work/">как работает Python рассказываю в следующей статье</a>.</p>
<h4>Установка для Windows</h4>
<p>Скачайте пакет <noindex><a rel="nofollow" href="http://www.activestate.com/activepython/" >ActivePython</a></noindex> и установите его, почему именно этот пакет расскажу в <a href="/2009/python-howto-work/">следующей статье</a>. Далее, запустите консоль Windows (cmd.exe) через Пуск->Выполнить (Win+R) и введите команду &laquo;python&raquo;, вы увидите следующее:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">C:\Documents and Settings\adw0rd&gt;python<br />
ActivePython 2.6.2.2 (ActiveState Software Inc.) based on<br />
Python 2.6.2 (r262:71600, Apr 21 2009, 15:05:37) [MSC v.1500 32 bit (Intel)] on win32<br />
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.<br />
&gt;&gt;&gt;</div></div>
<p>Если у вас вышло следующее сообщение:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">C:\Documents and Settings\adw0rd&gt;python<br />
&quot;python&quot; не является внутренней или внешней<br />
командой, исполняемой программой или пакетным файлом.</div></div>
<p>то вам следует прописать путь до &laquo;python.exe&raquo; в системную переменную &laquo;Path&raquo;.<br />
<span id="more-4407"></span></p>
<h4>Установка Python для FreeBSD</h4>
<p>Тут все проще, сначала <a href="http://adw0rd.ru/2009/freebsd-ports-and-pkg/" >обновите порты</a>, далее просто установите <strong>Python</strong> из портов:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># cd /usr/ports/<br />
# portsnap fetch update<br />
# cd lang/python<br />
# make install clean<br />
# rehash</div></div>
<p><strong>rehash</strong>&nbsp;&mdash; нужен для того, чтобы сразу же, без перезагрузки терминала вам была доступна команда &laquo;python&raquo;, без необходимости ввода полного пути до исполняемого файла!</p>
<p>Если вам нужна конкретная версия, то на момент написания статьи доступны следующие версии:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lang/python23<br />
lang/python24<br />
lang/python25<br />
lang/python26<br />
lang/python30<br />
lang/python31</div></div>
<h3>Интегрированные среды разработки (IDE)</h3>
<p>В качестве IDE для Python существует куча программ, можно выбрать <strong>IDLE</strong>, как рекомендует автор книги &laquo;Изучаем Python&raquo; Марк Лутц, или <strong>NetBeans</strong> например, однако я рекомендую установить <strong>Eclipse</strong> и расширение <strong>PyDev</strong>.</p>
<h4>PyDev для Eclipse</h4>
<p><noindex><a rel="nofollow" href="http://www.eclipseplugincentral.com/Web_Links-index-req-viewlink-cid-235.html" ><img alt="PyDev" src="http://pydev.sourceforge.net/images/logo_open_110_80.png" title="PyDev" class="alignright" width="110" height="80" /></a></noindex></p>
<p>Заходим на страницу расширения: <noindex><a rel="nofollow" href="http://www.eclipseplugincentral.com/Web_Links-index-req-viewlink-cid-235.html" >Eclipse / PyDev</a></noindex> и копируем &laquo;Update Site URL&raquo;:</p>
<blockquote>
<p>http://pydev.sourceforge.net/updates/</p>
</blockquote>
<p>Далее, в Eclipse, проходим в окно &laquo;Help -> Install new software...&raquo; и вбиваем туда эту ссылку, жмем &laquo;Finish&raquo; и следуем инструкциям Eclipse, он вас попросит перезагрузить IDE, перезагрузите. Далее, добавьте новую перспективу: &laquo;Windows -> Open Perspective -> Other... -> Pydev&raquo;, жмем &laquo;OK&raquo; и все, вы установили PyDev, переходите к <a href="/2009/python-howto-work/">следующей статье</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/python-and-pydev/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Купил книгу по Django</title>
		<link>http://adw0rd.ru/2009/django-first-book/</link>
		<comments>http://adw0rd.ru/2009/django-first-book/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 11:21:16 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Python. Изучаем вместе!]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Книги]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4337</guid>
		<description><![CDATA[В след, после покупки книги Изучаем Python, 3-е издание, прикупил себе книгу &#171;Django. Разработка веб-приложений на Python&#187;. После написания ряда статей по Python, переключусь на написание статей по Django.]]></description>
			<content:encoded><![CDATA[<p>В след, после покупки книги <a href="http://adw0rd.ru/2009/python-first-book/" >Изучаем Python, 3-е издание</a>, прикупил себе книгу <strong>&laquo;Django. Разработка веб-приложений на Python&raquo;</strong>. После написания <a href="/category/python-learn-together/">ряда статей по Python</a>, переключусь на написание статей по <strong>Django</strong>.</p>
<p><noindex><a rel="nofollow" href="http://www.books.ru/shop/books/666336" ><img src="http://adw0rd.ru/wp-content/uploads/2009/08/666336.jpg" alt="666336" title="666336" width="150" height="213" class="alignnone size-full wp-image-4340" /></a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/django-first-book/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Введение в Python</title>
		<link>http://adw0rd.ru/2009/python-introduction/</link>
		<comments>http://adw0rd.ru/2009/python-introduction/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 10:45:06 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Python. Изучаем вместе!]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4190</guid>
		<description><![CDATA[Сейчас изучаю Python и решил поделится некоторыми заметками о этом языке, наподобие того как я рассказывал о Java. По Java я еще буду делать заметки, так что не расстраиваетесь... В данное время, просто приоритеты расставлены так, что Python на первом месте! Чтобы серьезно попрактиковаться, я собираюсь на нем разрабатывать Либург (каталог IT-книг с рецензиями и [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2009/python-introduction/"><img src="http://adw0rd.ru/wp-content/uploads/2009/08/python_1.png"  alt="python_1" title="python_1" width="256" height="103" class="alignright size-full wp-image-4220" /></a></noindex></p>
<p>Сейчас изучаю <strong>Python</strong> и решил поделится некоторыми заметками о этом языке, наподобие того как я <a href="/category/java-learn-together/">рассказывал о Java</a>. По <strong>Java</strong> я еще буду делать заметки, так что не расстраиваетесь...</p>
<p>В данное время, просто приоритеты расставлены так, что <strong>Python</strong> на первом месте! Чтобы серьезно попрактиковаться, я собираюсь на нем разрабатывать <noindex><a rel="nofollow" href="http://liburg.ru/" >Либург</a></noindex> (каталог IT-книг с рецензиями и очерками), в связке с <strong>Django</strong>.</p>
<p>Заметки основаны на книге <a href="http://adw0rd.ru/2009/python-first-book/" >Learning Python</a>, которую я прикупил недавно, можно сказать что это даже конспект. Перейдем ближе к делу и начнем с введения в этот язык и технологию в целом.</p>
<h3>Введение</h3>
<p>Язык <strong>Python</strong> был изначально оптимизирован для достижения высокой скорости разработки, у него простой и интуитивно-понятный синтаксис (как по мне, так очень логичные конструкции, в следующих статьях я покажу это на конкретных примерах), динамическая типизация, отсутствие этапа компиляции (у Python динамическая компиляция) и встроенные инструментальные средства позволяют разработчикам создавать программы за более короткое время, чем при использовании других инструментов.</p>
<p>Он обладает такими возможностями, как модульность и <strong>объектно-ориентированное программирование</strong>, однако не обязывает использовать только ООП, вы также можете использовать <strong>процедурный подход</strong>.</p>
<p>Его объектная модель поддерживает такие понятия, как полиморфизм, перегрузка операторов и множественное наследование, однако, учитывая простоту синтаксиса и типизации <strong>Python</strong>, ООП не вызывает сложностей в применении. При наличии соответствующего связующего программного кода программы на языке <strong>Python</strong> могут использовать механизм наследования от классов реализованных на <strong>C++, Java и C#</strong>.<br />
<span id="more-4190"></span></p>
<h3>Основные факторы и преимущества этого языка</h3>
<p>Многие компании во всем мире используют Python для разнообразных проектов, приведу краткий список этих компаний: <strong>NASA</strong> (научные вычисления), <strong>CERN</strong>, <strong>STSCI</strong> (Институт космического телескопа), <strong>NSA</strong> (шифрование и анализ разведданных), <strong>Apple</strong>, <strong>Google</strong> (в том числе и в поисковой системе), <strong>Яндекс</strong>, <strong>YouTube</strong>, <strong>BitTorrent</strong> (клиент peer-to-peer), <strong>Intel</strong>, <strong>Cisco</strong>, <strong>HP</strong>, <strong>Seagate</strong>, <strong>Nokia</strong>, <strong>Qualcomm</strong>, <strong>IBM</strong>, <strong>DreamWorks</strong>, <strong>Pixar</strong> (для анимационных фильмов) и многие другие организации во всем мире.</p>
<h4>Качество программного обеспечения</h4>
<p>Код на языке Python более ясен и легко читается, что несомненно улучшает качество программного кода в сравнении с другими языками сценариев (вспомним Perl). В этом мы убедимся в следующих статьях, когда перейдем к практической части.</p>
<h4>Высокая скорость разработки</h4>
<p>В сравнении с другими компилирующими языками программирования, такими как <strong>C, C++ и Java</strong>, Python значительно повышает производительность труда разработчика, так как эквивалентный код имеет в три и более раза меньший объем. Кроме того, программный код на языке Python запускается сразу же, минуя этапы компиляции и связывания.</p>
<h4>Переносимость программ</h4>
<p>Стандартная реализация языка Python написана на переносимом ANSI C, благодоря чему он компилируется и работает практически на всех основных платформах. Программы на языке Python могут выполняться на широком спектре устройств, начиная от наладонных компьютеров (PDA) и заканчивая суперкомпьютерами.</p>
<p>Большая часть программного кода на языке Python выполняется без изменений на любой поддерживаемой платформе:</p>
<ul>
<li>MS Windows и DOS;</li>
<li>Mac OS и Mac OS X;</li>
<li>FreeBSD, Linux, Solaris;</li>
<li>BeOS, QNX, OS/2, VMS и VxWorks;</li>
<li>PalmOS и PocketPC;</li>
<li>Symbian и Windows Mobile;</li>
<li>iPod и игровые консоли;</li>
<li>и многие другие...</li>
</ul>
<p>Более того, он имеет массу возможностей по созданию переносимых графических интерфейсов, программ доступа к базам данных, веб-приложений и т.д.</p>
<h4>Поддержка библиотек</h4>
<p>Python имеет большое число стандартных библиотек, которые вы можете использовать в своей программе, например такие как <em>&laquo;библиотека для работы с регулярными выражениями&raquo;, &laquo;библиотека для работы с сетью&raquo;</em>, так же вы можете написать свои библиотеки и использовать их на ряду со стандартными.</p>
<p>К числу сторонних библиотек можно отнести:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/NumPy" >NumPy</a></noindex>&nbsp;&mdash; альтернатива Mathlab;</li>
<li><noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/Pygame" >PyGame</a></noindex>&nbsp;&mdash; разработка игр и анимации;</li>
<li><strong>PIL</strong>&nbsp;&mdash; обработка графических изображений;</li>
<li><strong>PyRo</strong>&nbsp;&mdash; управление роботом;</li>
<li><strong>NLTK</strong>&nbsp;&mdash; анализировать фразы на естественном языке;</li>
<li>библиотеки для работы с последовательным портом и т.д.</li>
</ul>
<h4>Интеграция компонентов</h4>
<p>На сегодняшний день Python имеет возможность вызывать функции из библиотек на языке <strong>C/C++</strong>, сам вызываться из программ, написанных на языках <strong>C/C++</strong>, интегрироваться с <strong>Java</strong>-компонентами, взаимодействовать с другими платформами, как <strong>SOAP, XML-RPC, COBRA</strong> и т.д.</p>
<p>Возможность Python расширяться и встраиваться в системы на языках <strong>C и C++</strong> делает его удобным и гибким языком для описания поведения других систем и компонентов. Прикладной интерфейс <strong>C API</strong> в Python позволяет программа на языке <strong>C</strong> вызывать и быть вызываемыми из программ на языке Python.</p>
<p>Такие инструменты, как <strong>SWIG и SIP</strong>, автоматически генерирующие программный код, могут автоматизировать действия по связыванию скомпилированных компонентов в Python для последующего использования их в сценариях.</p>
<p>А такие огромные платформы, как поддержка <strong>COM в Windows</strong>, <strong>Jython</strong>&nbsp;&mdash; реализация Python на языке <strong>Java</strong>, <strong>IronPython</strong>&nbsp;&mdash; реализация на базе <strong>.NET</strong>, представляют альтернативные возможности организации взаимодействий с компонентами. Например в <strong>Windows</strong>, программы на <strong>Python</strong> могут управлять такими приложениями, как <strong>Word или Excel</strong>.</p>
<h3>Качество и поддержка ПО</h3>
<p>Философия Python диктует использование минималистского подхода, это означает, что даже при наличии нескольких вариантов решения задачи в этом языке обычно существует всего один очевидный путь, небольшое число менее очевидных альтернатив и несколько взаимосвязанных вариантов организации взаимодействий.</p>
<blockquote class="info">
<p>
Инструкция</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">import</span> this</div></div>
<p>активизует пасхальное яйцо, которое отображает некоторые принципы проектирования, лежащие в основе языка.
</p>
</blockquote>
<p>Давайте вспомним язык <strong>Perl</strong>, где каждый программист сочинял свой путь решения, после чего такой код было сложно понять другим программистам (в большинстве случаев и самому разработчику этого кода), а в нынешнее время самое главное это поддержка кода, а не быстрое его написание!</p>
<h3>Что можно делать с помощью Python?</h3>
<p>Python как многоцелевой язык программирования, практически не ограничен: он может использоваться для реализации чего угодно, от веб-сайтов и игровых программ до управления роботами и космическими кораблями.</p>
<h4>Системное программирование</h4>
<p>Встроенные в Python интерфейсы доступа к службам операционных систем делают его идеальным инструментом для создания переносимых программ и утилит системного администрирования. Программы на языке Python могут отыскивать файлы и каталоги, запускать другие программы, производить параллельные вычисления с использованием нескольких процессоров и потоков, и делать многое другое. Также поддерживает все типичные инструменты ОС: файлы, сокеты, каналы, процессы, многопоточную модель исполнения, поиск по шаблону с использование рег. выражений, аргументы ком. строки и много другое.</p>
<p>Системные интерфейсы в Python созданы переносимыми, поэтому вам не надо изменять код под каждую ОС.</p>
<h4>Графический интерфейс</h4>
<p>В состав Python входит стандартный ОО интерфейс к <strong>Tk GUI API</strong>, который называется <strong>Tkinter</strong>, позволяющий реализовывать переносимый графический интерфейс с внешним видом присущим операционной системе. Свободно распространяемое расширение <strong>PMW</strong> содержит дополнительные визуальные компоненты для набора <strong>Tkinter</strong>.</p>
<p>Кроме того, существует прикладной интерфейс <strong>wxPython GUI API</strong>, основанный на библиотеке <strong>C++</strong>, который предлагает альтернативный набор инструментов. Инструменты <strong>PythonCard и Dabo</strong>, построены на основе <strong>wxPython и Tkinter</strong>. При выборе соответствующей библиотеки вы сможете использовать другие инструменты для построения графических интерфейсов, например: <strong>Qt, GTK, MFC и Swing</strong>.</p>
<h4>Веб-сценарии</h4>
<p>Python поставляется со стандартными интернет-модулями, которые позволяют программам выполнять разнообразные сетевые операции. Сценарии могут производить взаимодействие через сокеты, извлекать данные полученные из html-форм; передавать файлы по протоколу <strong>FTP</strong>; обрабатывать файлы <strong>XML</strong>; передавать, принимать, создавать и производить разбор писем электронной почтой; производить взаимодействия по протоколам <strong>XML-RPC, SOAP, Telnet</strong> и т.д.</p>
<p>С помощью пакета <strong>mod_python</strong> для <strong>Apache</strong> можно запускать сценарии на языке Python, также он поддерживает шаблоны механизма <strong>Python Server Pages</strong>.</p>
<p>Система <strong>Jython</strong> обеспечивает бесшовную интеграцию <strong>Python/Java</strong> и поддерживает серверные апплеты, которые выполняются на стороне клиента.</p>
<p>Помимо всего этого для Python существуют полноценные пакеты веб-разработки, такие как <strong>Django, Zope, TurboGears, Pylons и WebWare</strong>, предназначенные для быстрого создания полнофункциональных высококачественных веб-сайтов.</p>
<h4>Приложения баз данных</h4>
<p>В Python имеется поддержка <strong>Sybase, Oracle, ODBC, MySQL, PostgreSQL, Informix, SQLite</strong> и многие другие. Также существует <em>&laquo;переносимый прикладной программный интерфейс баз данных&raquo;</em>, предназначенный для доступа к <strong>БД SQL</strong> из сценариев Python, который унифицирует доступ к различным базам данных, что-то на подобие <strong>PDO</strong> для <strong>PHP</strong>.</p>
<p>Стандартный модуль <strong>Pickle</strong> реализует простую систему хранения объектов, позволяющий программам сохранять и восстанавливать объекты Python в файлах или в специализированных для этого объектах. Также можно использовать систему <strong>ZODB</strong>, которая является полостью ОО базой данных. Существует и еще один инструмент под названием <strong>SQLObject</strong>, который отображает реляционные таблицы в модель классов языка Python.</p>
<h3>Python мощный</h3>
<p>Python обеспечивает простоту и непринужденность языка сценариев и мощь, которую обычно можно найти в компилирующих языках. Превышая возможности других языков сценариев,  такая комбинация делает Python удобным средством разработки крупномасштабных проектов.</p>
<ul>
<li><strong>Динамическая типизация</strong>
<p>В Python нет необходимости объявлять явно типы объектов, он сам следит за ними.</p>
</li>
<li><strong>Автоматическое управление памятью</strong>
<p>Python автоматически распределяет память под объекты и освобождает ее (сборка мусора), когда объекты становятся ненужными.</p>
</li>
<li><strong>Модульное программирование</strong>
<p>Для создания крупных систем Python предоставляет такие возможности, как модули, классы и исключения. Они позволяют разбивать систему на составляющие, применять ООП для создания программного кода многократного использования и элегантно обрабатывать возникающие события и ошибки.</p>
</li>
<li><strong>Встроенные типы объектов</strong>
<p>Python предоставляет наиболее типичные структуры данных, такие как числа, списки, словари и строки, в виде особенностей, присущих самому языку программирования. Встроенные объекты могут комбинироваться друг с другом для представления данных с более сложной структурой.</p>
</li>
<li><strong>Встроенные инструменты</strong>
<p>Для работы со всеми этими встроенными типами данных у Python имеются средства, предназначенные для конкатенации, получения срезов, сортировка, отображение и многое другое.</p>
</li>
<li><strong>Библиотеки утилит</strong>
<p>В Python также входит большая коллекция библиотечных инструментов, которые поддерживают практически все, что может потребоваться,&nbsp;&mdash; от поиска с использованием рег. выражений до работы в сети.</p>
</li>
<li><strong>Утилиты сторонних разработчиков</strong>
<p>Так как Python открытый, то для него делают очень много сторонних библиотек, которые решить внутренними средствами не возможно. В сети можно найти свободную реализацию поддержки COM, средств для работы с изображениями, распределенных объектов COBRA, XML, механизмов доступа к БД и многое другое.</p>
</li>
</ul>
<p>Несмотря на широкие возможности, Python имеет чрезвычайно простой синтаксис и архитектуру. В результате мы имеем мощный инструмент программирования, обладающий простотой и удобством, присущим языкам сценариев.</p>
<h3>Python свободный</h3>
<p>Вы можете найти в сети полные исходные тексты реализации Python. Нет никаких ограничений на его копирование, встраивание в свои системы или распостранение в составе ваших продуктов. Фактически вы сможете даже продавать исходные тексты Python, если появится такое желание.</p>
<h3>Python назван в честь Монти Пайтона (Monty Python)</h3>
<p>Несмотря на то что на эмблеме Python изображена рептилия, правда в том, что создатель Python, Гвидо ван Россум, назвал свое детище в честь комедийного сериала &laquo;Летающий цирк Монти Пайтона&raquo;, который транслировался по каналу BBC.</p>
<p>Он большой поклонник этого сериала, как и многие программисты со всего мира! В связи с этим, традиционные имена переменных &laquo;foo&raquo; и &laquo;bar&raquo; часто заменены на &laquo;spam&raquo; и &laquo;egg&raquo;. Также, конференции по языку Python обычно имеют именование &laquo;Испанская инквизиция&raquo;.</p>
<h3>Какие преимущества у Python по сравнению с другим языком?</h3>
<ul>
<li>
<p>Python имеет более широкие возможности, чем <strong>Tcl</strong>. Язык Python поддерживает &laquo;программирование в целом&raquo;, что делает его применимым для разработки крупных систем.</p>
</li>
<li>
<p>Python имеет более четкий синтаксис и более простую архитектуру, чем <strong>Perl</strong>, что делает код более удобочитаемым и простым в сопровождении.</p>
</li>
<li>
<p>Python проще и удобнее, чем <strong>Java</strong>. Python&nbsp;&mdash; язык сценариев, а <strong>Java</strong> унаследовала сложный синтаксис от таких языков программирования, как C++, например.</p>
</li>
<li>
<p>Python проще и удобнее, чем <strong>C++</strong>, но не редко он не может конкурировать с <strong>C++</strong>, поскольку будучи языком сценариев, Python предназначен для другого круга задач.</p>
</li>
<li>
<p>Python более зрелый и имеет более ясный синтаксис, чем <strong>Ruby</strong>. В отличии от <strong>Ruby и Java</strong>, ОО стиль программирования не является обязательным в Python&nbsp;&mdash; он не вынуждает использовать ООП в проектах, где этот стиль неприменим.</p>
</li>
<li>
<p>Python обладает динамическими характеристиками таких языков, как <strong>SmallTalk и Lisp</strong>, но имеет более простой и традиционный синтаксис.</p>
</li>
</ul>
<h3>Резюме</h3>
<p>Вот мы и закончили с введением в этот замечательный язык, однако теоретическая часть не окончена, в следующей статье расскажу про то как работает <strong>Python</strong> и <strong>PVM</strong>, также про альтернативные интерпретаторы на <strong>Java и .NET</strong> и для чего они нужны, и еще о многом другом.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/python-introduction/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Купил книгу по Python</title>
		<link>http://adw0rd.ru/2009/python-first-book/</link>
		<comments>http://adw0rd.ru/2009/python-first-book/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 11:48:10 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Python. Изучаем вместе!]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Книги]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4021</guid>
		<description><![CDATA[Решил изучить Python, прикупил книженцию &#171;Изучаем Python, 3-е издание&#187;. Читается очень легко и захватывающе, сейчас читаю на 100-ой странице, и прям не оторвать от прочтения! Купил книгу в books.ru на В.О., около метро Василеостро́вская, в бизнес-центре Остров. Думаю раздел открыть на блоге, посвященный книгам, пока что не открыли проект liburg.ru...]]></description>
			<content:encoded><![CDATA[<p>Решил изучить Python, прикупил книженцию &laquo;Изучаем Python, 3-е издание&raquo;. Читается очень легко и захватывающе, сейчас читаю на 100-ой странице, и прям не оторвать от прочтения!</p>
<p>Купил книгу в <noindex><a rel="nofollow" href="http://www.books.ru/shop/books/626282" >books.ru</a></noindex> на В.О., <noindex><a rel="nofollow" href="http://www.books.ru/shop/help/spb" >около метро Василеостро́вская, в бизнес-центре Остров</a></noindex>.</p>
<p><noindex><a rel="nofollow" href="http://www.books.ru/shop/books/626282" ><img alt="" src="http://www.ozon.ru/multimedia/books_covers/1000823269.jpg" title="Learning Python" class="alignnone" width="200" height="262" style="border:dotted #c4c4c4 2px;padding:4px;" /></a></noindex></p>
<p>Думаю раздел открыть на блоге, посвященный книгам, пока что не открыли проект <noindex><a rel="nofollow" href="http://liburg.ru" >liburg.ru</a></noindex>...</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/python-first-book/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
