<?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>Ubuntu Linux &#187; python</title>
	<atom:link href="/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://UbuntuLinux.ru</link>
	<description>Сайт для пользователей Ubuntu Linux</description>
	<lastBuildDate>Sat, 25 Oct 2014 15:23:48 +0000</lastBuildDate>
	<language>ru-RU</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.1</generator>
	<item>
		<title>Основы работы с потоками в Python</title>
		<link>http://UbuntuLinux.ru/developers/basic-threading-in-python/</link>
		<comments>http://UbuntuLinux.ru/developers/basic-threading-in-python/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 03:57:54 +0000</pubDate>
		<dc:creator><![CDATA[Admin]]></dc:creator>
				<category><![CDATA[Разработка под Linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://manlinux.org/?p=94</guid>
		<description><![CDATA[Перевод статьи Basic Threading in Python (автор Peyton McCullough), автор перевода Сергей Шилов Если вы желаете, чтобы ваше приложение выполняло несколько задач в одно и то же время, то можете воспользоваться потоками (threads). Python может работать с потоками, но много разработчиков находят программирование &#8230; <a href="/developers/basic-threading-in-python/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><strong>Перевод статьи Basic Threading in Python (автор Peyton McCullough), автор перевода Сергей Шилов</strong></p>
<div id="preamble">
<p>Если вы желаете, чтобы ваше приложение выполняло несколько задач в одно и то же время, то можете воспользоваться потоками (<em>threads</em>). Python может работать с потоками, но много разработчиков находят программирование потоков очень сложным. Среди прочего Peyton McCullough объяснит как порождать и уничтожать потоки в этом популярном языке.</p>
</div>
<p><span id="more-864"></span></p>
<h2>Введение</h2>
<div>
<p>Потоки позволяют приложениям выполнять в одно и то же время множество задач. Многопоточность (<em>multi-threading</em>) важна во множестве приложений, от примитивных серверов до современных сложных и ресурсоёмких игр, так что, естественно, многие языки программирования поддерживают возможность работы с потоками. Python тоже входит в их число.</p>
<p>Однако, поддержка многопоточности в Python не обходится без ограничений и последствий, как писал Гвидо ван Россум:</p>
<div>
<p>«К несчастью, для большинства смертных программирование потоков просто Слишком Сложное, чтобы делать его правильно… Даже в Python — всякий раз, как кто-то всерьёз берётся за программирование потоков, на меня обрушиваются тонны сообщений об ошибках, причём если причиной половины из них действительно являются ошибки в интерпретаторе Python, то причина второй половины кроется в недостаточном понимании особенностей многопоточности…»</p>
</div>
<p>Прежде чем мы приступим к разбору кода, работающего с потоками, нам нужно рассмотреть наиболее важную вещь — глобальную блокировку интерпретатора (<em>global interpreter lock</em>, <em>GIL</em>) Python. Если два или более потока попытаются манипулировать одним и тем же объектом в одно и то же время, то неизбежно возникнут проблемы. Глобальная блокировка интерпретатора исправляет это. В любой момент времени действия может выполнять только один поток. Python автоматически переключается между потоками, когда в этом возникает необходимость.</p>
</div>
<h2>Использование модуля Threading</h2>
<div>
<p>Модуль threading предоставляет нам простой способ работы с потоками. Его класс Thread может быть унаследован (<em>subclassed</em>) для создания потока или нескольких потоков. Метод run должен содержать код, который вы желаете выполнить при выполнении потока. Звучит просто, не так ли? Вот, посмотрите:</p>
<div>
<pre>import threading
class MyThread(threading.Thread):
    def run(self):
        print 'Insert some thread stuff here.'
        print 'It'll be executed...yeah....'
        print 'There's not much to it.'</pre>
</div>
<p>Выполнить поток также просто. Всё, что нам нужно сделать, это создать экземпляр нашего класса потока, после чего вызвать его метод start:</p>
<div>
<pre>import threading
class MyThread(threading.Thread):

    def run(self):
        print 'You called my start method, yeah.'
        print 'Were you expecting something amazing?'

 MyThread().start()</pre>
</div>
<p>Конечно, всего один поток это не бог весть что. Как и люди, потоки через некоторое время остаются в одиночестве. Давайте создадим группу потоков:</p>
<div>
<pre>import threading
theVar = 1
class MyThread(threading.Thread):
    def run ( self ):
        global theVar
        print 'This is thread ' + str(theVar) + ' speaking.'
        print 'Hello and good bye.'
        theVar = theVar + 1

for x in xrange ( 20 ):
    MyThread().start()</pre>
</div>
<p>Давайте теперь сделаем с помощью модуля threading нечто условно-полезное. Сервера часто используют потоки для работы в одно и то же время с несколькими клиентами. Давайте создадим простой, но расширяемый сервер. Когда клиент подключится к нему, сервер создаст новый поток для обслуживания этого клиента. Чтобы отправлять потоку данные клиента нам понадобится перекрыть метод __init__ класса Thread, чтобы он принимал параметры. Отнынесервер будет отправлять поток своей дорогой и ждать новых клиентов. Каждый поток будет посылать упакованный (<em>pickled</em>) объект соответствующему клиенту, после чего печатать не более десяти строк, полученных от клиента. (Упакованный объект в общем случае является объектом, уменьшенным до нескольких символов. Это полезно при сохранении объектов для последующего использования или для передачи объектов по сети).</p>
<div>
<pre>import pickle
import socket
import threading

# We'll pickle a list of numbers:
someList = [1, 2, 7, 9, 0]
pickledList = pickle.dumps(someList)

# Our thread class:
class ClientThread(threading.Thread):

    # Override Thread's __init__ method to accept the parameters needed:
    def __init__(self, channel, details):
        self.channel = channel
        self.details = details
        threading.Thread.__init__(self)

    def run(self):
        print 'Received connection:', self.details[0]
        self.channel.send(pickledList)
        for x in xrange(10):
            print self.channel.recv(1024)
        self.channel.close()
        print 'Closed connection:', self.details[0]

# Set up the server:
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 2727))
server.listen(5)

# Have the server serve "forever":
while True:
    channel, details = server.accept()
    ClientThread(channel, details).start()</pre>
</div>
<p>Теперь нам нужно создать клиента, который будет подключаться к серверу, получать от него упакованный объект, распаковывать (<em>reconstructs</em>) объект и, наконец, посылать десять сообщений и закрывать соединение:</p>
<div>
<pre>import pickle
import socket

# Connect to the server:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 2727))

# Retrieve and unpickle the list object:
print pickle.loads(client.recv(1024))

# Send some messages:
for x in xrange(10):
    client.send('Hey. ' + str(x) + 'n')

# Close the connection
client.close()</pre>
</div>
<p>Конечно, приведённый выше клиент не в состоянии воспользоваться всеми преимуществами многопоточностинашего сервера. Клиент порождает только один поток, что делает многопоточность бессмысленной. Давайте добавим клиенту многопоточности, чтобы сделать всё более интересным. Каждый поток будет подключаться ксерверу и выполнять приведённый выше код:</p>
<div>
<pre>import pickle
import socket
import threading

# Here's our thread:
class ConnectionThread(threading.Thread):
    def run(self):
        # Connect to the server:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect (('localhost', 2727))

        # Retrieve and unpickle the list object:
        print pickle.loads(client.recv(1024))

        # Send some messages:
        for x in xrange(10):
            client.send('Hey. ' + str(x) + 'n')

        # Close the connection
        client.close()

# Let's spawn a few threads:
for x in xrange(5):
    ConnectionThread().start()</pre>
</div>
</div>
<h2>Пулы потоков (<em>pooling threads</em>)</h2>
<div>
<p>Важно помнить, что потоки не появляются мгновенно. Создание большого их числа может замедлить ваше приложение. Чтобы создать поток и, позднее, уничтожить его, требуется время. Потоки могут также потреблять много ценных системных ресурсов в больших приложениях. Эта проблема легко решается путём создания ограниченного числа потоков (<em>set number of threads</em>) (пула потоков) и назначения им новых задач, в общем, повторного их использования. Соединения будут приниматься и передаваться тому потоку, который раньше всех закончит работу с предыдущим клиентом.</p>
<p>Если вы по-прежнему не понимаете, сравните это с больницей. Скажем, у нас есть пятеро врачей. Это наши потоки. Пациенты (клиенты) приходят в больницу и, если врачи заняты, сидят в приёмном покое.</p>
<p>Очевидно, нам нужно нечто, что сможет передавать данные клиента в наши потоки, не вызывая при этом проблем (оно должно быть «потокобезопасным»). Модуль Queue Python делает это для нас. Клиентская информация сохраняется в объекте Queue, откуда потоки извлекают её по мере надобности.</p>
<p>Давайте переделаем наш сервер, чтобы оценить преимущества пула потоков:</p>
<div>
<pre>import pickle
import Queue
import socket
import threading

# We'll pickle a list of numbers, yet again:
someList = [1, 2, 7, 9, 0]
pickledList = pickle.dumps(someList)

# A revised version of our thread class:
class ClientThread(threading.Thread):

# Note that we do not override Thread's __init__ method.
# The Queue module makes this not necessary.

    def run(self):
        # Have our thread serve "forever":
        while True:
            # Get a client out of the queue
            client = clientPool.get()

            # Check if we actually have an actual client in the client variable:
            if client != None:
                print 'Received connection:', client[1][0]
                client[0].send(pickledList)
                for x in xrange(10):
                    print client[0].recv(1024)
                client[0].close()
                print 'Closed connection:', client[1][0]

# Create our Queue:
clientPool = Queue.Queue(0)

# Start two threads:
for x in xrange(2):
    ClientThread().start()
# Set up the server:
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 2727))
server.listen(5)

# Have the server serve "forever":
while True:
    clientPool.put(server.accept())</pre>
</div>
<p>Как вы можете увидеть, он немного сложнее нашего предыдущего сервера, но не усложнён до полной непонятности. Для проверки этого сервера, так же, как и предыдущего, можно воспользоваться клиентом из предыдущего раздела.</p>
</div>
<h2>Дополнительные хитрости</h2>
<div>
<p>Работа с потоками не заключается только в их создании и уничтожении. Модуль (может, не модуль а класс?) Thread из модуля threading содержит ещё несколько методов, которые могут вам пригодиться. Первые два предназначены для именования потоков. Метод setName присваивает потоку имя, а метод getName возвращает имя потока:</p>
<div>
<pre>import threading

class TestThread(threading.Thread):
    def run(self):
        print 'Hello, my name is', self.getName()

cazaril = TestThread()
cazaril.setName('Cazaril')
cazaril.start()

ista = TestThread()
ista.setName('Ista')
ista.start()

TestThread().start()</pre>
</div>
<p>Ничего удивительного. Также, как вы можете видеть, у потоков есть имена, даже если вы их не задавали.</p>
<p>Мы также можем проверить, является ли поток «живым», воспользовавшись методом isAlive. Если поток ещё не закончил выполняться, независимо от того, что происходит в его методе run, то он классифицируется как «живой»:</p>
<div>
<pre>import threading
import time

class TestThread(threading.Thread):

    def run(self):
        print 'Patient: Doctor, am I going to die?'

class AnotherThread(TestThread):

    def run (self):
        TestThread.run(self)
        time.sleep(10)

dying = TestThread()
dying.start()
if dying.isAlive():
    print 'Doctor: No.'
else:
    print 'Doctor: Next!'

living = AnotherThread()
living.start()
if living.isAlive():
    print 'Doctor: No.'
else:
    print 'Doctor: Next!'</pre>
</div>
<p>Второй поток остаётся в живых, поскольку мы заставили его ждать, воспользовавшись методом sleep модуля time.</p>
<p>Если нам нужно, чтобы поток дождался завершения другого потока, можно воспользоваться методом join:</p>
<div>
<pre>import threading
import time

class ThreadOne(threading.Thread):

    def run(self):
        print 'Thread', self.getName(), 'started.'
        time.sleep ( 5 )
        print 'Thread', self.getName(), 'ended.'

class ThreadTwo(threading.Thread):

    def run(self):
        print 'Thread', self.getName(), 'started.'
        thingOne.join()
        print 'Thread', self.getName(), 'ended.'

thingOne = ThreadOne()
thingOne.start()
thingTwo = ThreadTwo()
thingTwo.start()</pre>
</div>
<p>Мы также можем использовать метод setDaemon. Если при вызове в него передаётся значение True и другие потоки завершили своё исполнение, то из основной программы будет произведён выход, а поток продолжит работу:</p>
<div>
<pre>import threading
import time

class DaemonThread(threading.Thread):

    def run(self):
        self.setDaemon(True)
        time.sleep(10)

DaemonThread().start()
print 'Leaving.'</pre>
</div>
<p>Python также содержит модуль thread, работающий на более низком уровне, чем threading. Хочу обратить ваше внимание на одну особенность: это содержащаяся в нём функция start_new_thread. Используя её мы можем превратить обычную функцию в поток:</p>
<div>
<pre>import thread

def thread(stuff):
    print "I'm a real boy!"
    print stuff

thread.start_new_thread(thread, ('Argument'))</pre>
</div>
</div>
<h2>Заключение</h2>
<div>
<p>О многопоточности можно рассказать значительно больше, чем я сделал в этой статье, но я не буду пытаться объять необъятное. Кроме того, как упомянул Гвидо ван Россум, преимущества, которые даёт сложная многопоточность вPython могут быть сведены на нет последствиями. Однако, небольшая доза здравого смысла может устранить большинство проблем в простой многопоточности.</p>
<p>Многопоточность очень важна, когда дело касается компьютерных приложений и, как я упоминал раньше, Python её поддерживает. При условии правильного использования, эффект от применения потоков может быть очень благотворным и часто даже критическим, как я подчеркивал в этой статье.</p>
<div>
<div>DISCLAIMER</div>
<p>The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware.</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://UbuntuLinux.ru/developers/basic-threading-in-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как работать с базами данных в Python</title>
		<link>http://UbuntuLinux.ru/developers/how-to-work-with-databases-in-python/</link>
		<comments>http://UbuntuLinux.ru/developers/how-to-work-with-databases-in-python/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 14:23:41 +0000</pubDate>
		<dc:creator><![CDATA[Admin]]></dc:creator>
				<category><![CDATA[Разработка под Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://manlinux.org/?p=41</guid>
		<description><![CDATA[Предполагается, что сам Python уже установлен и читатель владеет основами языка. Устанавливаем модуль для работы с базами данных. Таких модулей несколько, мы будем использовать MySQLdb (пакет называетсяpython-mysqldb). В Ubuntu достаточно сделать apt-get install python-mysqldb , чтобы установить данный пакет. Когда пакет &#8230; <a href="/developers/how-to-work-with-databases-in-python/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><span id="more-850"></span></p>
<ol>
<li>Предполагается, что сам Python уже установлен и читатель владеет основами языка.</li>
<li>Устанавливаем модуль для работы с базами данных. Таких модулей несколько, мы будем использовать MySQLdb (пакет называется<code>python-mysqldb</code>). В Ubuntu достаточно сделать <code>apt-get install python-mysqldb</code> , чтобы установить данный пакет.</li>
<li>Когда пакет установлен, можно начать его использование. Для этого нужно его импортировать в наш код:
<pre>import _mysql</pre>
</li>
<li>Чтобы подключиться к базе данных используйте
<pre>db = _mysql.connect("localhost","user","password","dbname");</pre>
</li>
<li>Отправляем запрос базе командой
<pre>db.query("""SELECT * FROM table""")</pre>
</li>
<li>Принимаем ответ от базы с помощью <code>answ = db.store_result()</code> или<code>answ = db.use_result()</code>. Разница этих двух методов в том, что первый получит сразу весь ответ базы, а второй будет получать его построчно(с сервера). Визуально они выглядят одинаково: и первый и второй при вызове будут отдавать по одной записи (строке), но в реальности store_result() один лишь раз обратится к базе(и сразу весь ответ будет держать у себя), а db.use_result() будет построчно спрашивать у сервера баз данных.</li>
<li>Для реального получения данных используем <code>answ.fetch_row()</code>. При каждом вызове будет выводиться кортеж кортежей полей. То есть
<pre>(('поле 1', 'поле 2', … ,'поле n'),)</pre>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://UbuntuLinux.ru/developers/how-to-work-with-databases-in-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PEP8 коротко и по-русски</title>
		<link>http://UbuntuLinux.ru/developers/pep8-briefly-and-in-russian/</link>
		<comments>http://UbuntuLinux.ru/developers/pep8-briefly-and-in-russian/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 12:57:23 +0000</pubDate>
		<dc:creator><![CDATA[Admin]]></dc:creator>
				<category><![CDATA[Разработка под Linux]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://manlinux.org/?p=28</guid>
		<description><![CDATA[PEP8 – это стилевые правила для кода на языке Python. используйте 4 пробела для отступа и не используйте табы, не смешивайте их максимальная длина строки 79 символов; для разрыва строки используйте отступы или бэкслеш функции верхнего уровня и определения классов &#8230; <a href="/developers/pep8-briefly-and-in-russian/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a target="_blank" rel="nofollow" href="http://www.python.org/dev/peps/pep-0008/" rel="nofollow"  target="_blank">PEP8</a> – это стилевые правила для кода на языке Python.<br />
<span id="more-845"></span></p>
<ul>
<li>используйте 4 пробела для отступа и не используйте табы, не смешивайте их</li>
<li>максимальная длина строки 79 символов; для разрыва строки используйте отступы или бэкслеш</li>
<li>функции верхнего уровня и определения классов отделяйте двумя пустыми строками</li>
<li>определения методов внутри класса отделяйте одной пустой строкой</li>
<li>дополнительные пустые строки используйте для логической группировки методов</li>
<li>кодировка файлов должна быть Latin-1, а в Питоне 3 и выше – utf-8</li>
<li>каждый импортируемый модуль с новой строки</li>
<li>порядок импортов: стандартные модули, third-party модули, локальные модули приложения</li>
<li>пустая строка между каждой группой импортов</li>
<li>избегайте лишних пробелов внутри скобок; перед запятыми, точкой с запятой и двоеточиями</li>
<li>избегайте лишних пробелов перед скобками с аргументами функций и скобками с индексами</li>
<li>избегайте больше чем одного пробела между операторами (= – + итд)</li>
<li>используйте одиночный пробел для выделения операторов</li>
<li>избегайте пробелов вокруг ‘=’, который используется для параметров по-умолчанию и keyword аргументов</li>
<li>обновляйте комментарии вместе с кодом</li>
<li>пишите комментарии по-английски</li>
<li>избегайте имён из одиночных l, O, I</li>
<li>для модулей и пакетов используйте короткие <code>всестрочные</code> имена</li>
<li>для классов используйте <code>СловаНачинаютсяЗаглавными</code> имена</li>
<li>для функций используйте <code>слова_с_подчёркиваниями</code> (или <code>смешанныйРегистр</code> если так получилось исторически)</li>
<li>для методов используйте <code>слова_с_подчёркиваниями</code> имена</li>
<li>для внутренних методов и переменных <code>_подчёркивание_перед_словом</code></li>
<li>для проверки на <code>None</code> используйте <code>is</code> или <code>is not</code>, не используйте операторы сравнения</li>
<li>используйте исключения основанные на классах — наследованные от Exception</li>
<li>используйте методы класса string вместо строковых функций</li>
<li>используйте ”.startswith() и ”.endswith() вместо вырезки из строк для проверки префиксов и суффиксов</li>
<li>используйте isinstance() для проверки типа</li>
<li>не сравнивайте булевы переменные с True и False</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://UbuntuLinux.ru/developers/pep8-briefly-and-in-russian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django. Как начать: развёртка, поднятие</title>
		<link>http://UbuntuLinux.ru/developers/django-how-to-install-and-start/</link>
		<comments>http://UbuntuLinux.ru/developers/django-how-to-install-and-start/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 12:50:55 +0000</pubDate>
		<dc:creator><![CDATA[Admin]]></dc:creator>
				<category><![CDATA[Разработка под Linux]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://manlinux.org/?p=25</guid>
		<description><![CDATA[Django – классный фреймвор на python’е. Более подробная информация – в гугле или позже (если и будет описание от меня – то в отдельной заметке). Эта заметка – “почеркушки на полях”, дабы быстро вспомнить как оно разворачивается. Нужен python (во &#8230; <a href="/developers/django-how-to-install-and-start/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><em>Django – классный фреймвор на python’е. Более подробная информация – в гугле или позже (если и будет описание от меня – то в отдельной заметке). Эта заметка – “почеркушки на полях”, дабы быстро вспомнить как оно разворачивается.</em><br />
<span id="more-25"></span></p>
<ol>
<li>Нужен <a target="_blank" rel="nofollow" href="http://www.python.org/download/" rel="nofollow"  target="_blank">python</a> (во время написания этих строк существовали ветки 2.6 и 3. Django написан для 2.x. Я использую 2.5.2).</li>
<li>Качаем <a target="_blank" rel="nofollow" href="http://www.djangoproject.com/download/" rel="nofollow"  target="_blank">Django</a>.</li>
<li>Устанавливаем Django:
<ol type="a">
<li><code>tar xzvf Django-*</code></li>
<li><code>cd Django-*</code></li>
<li><code>sudo python setup.py install</code></li>
</ol>
</li>
<li> Проверка: запускаем python в консоли, скармливаем код
<pre>&gt;&gt;&gt; import django
&gt;&gt;&gt; django.VERSION
(1, 1, 1, 'final', 0)</pre>
</li>
<li>Учим питон общаться с базой данных (в моём случае – MySQL):
<pre>sudo aptitude install python-mysqldb</pre>
</li>
<li> Создаём проект:
<pre>mkdir ~/django
cd ~/django
django-admin.py startproject site</pre>
<p>В результате создастся папка ~/django/site следующего содержания:</p>
<pre>site/
    __init__.py
    manage.py
    settings.py
    urls.py</pre>
<ul type="disc">
<li><code>__init__.py</code>: Файл необходим для того, чтобы Python рассматривал данный каталог как пакет, т.е., как группу модулей. Это пустой файл и обычно вам не требуется добавлять что-либо в него.</li>
<li><code>manage.py</code>: Это утилита командной строки, которая позволяет вам взаимодействовать с проектом различными методами. Наберите <strong>python manage.py help</strong> для получения информации о возможностях утилиты. Вы не должны изменять содержимое данного файла, он создан в данном каталоге в целях удобства.</li>
<li><code>settings.py</code>: Настройки для текущего проекта Django. Посмотрите на содержимое файла, чтобы иметь представление о типах доступных параметров и их значениях по умолчанию.</li>
<li><code>urls.py</code>: Описания URL для текущего проекта Django, так сказать «оглавление» для вашего сайта. <span style="color: #ff0000;">На момент создания должен быть пустым </span>(В моём случае это было не так. Было много закомменченных строк).</li>
</ul>
</li>
<li>Запускаем сервер (выделяем под это дело отдельную консольку):
<pre>cd ~/django/site
python manage.py runserver</pre>
</li>
<li>Сервак поднят на localhost’е, 8000ом порту. Можете проверить, набрав http://localhost:8000/ в браузере.
<div style="border: 1px solid red; margin: 10px 0px; padding: 10px;"><strong>Achtung!</strong> этот сервак не боевой, а тренировочный. Может обслуживать лишь 1 запрос в единицу времени. Как установить Django на нормальный? – Сначала напишите что-нибудь стоящее, а потом уже и задавайтесь этим вопросом. Пока что скажу, что это делается несложно.</div>
</li>
<li> Создаём прилагу:
<pre>cd ~/django/site
python manage.py startapp application</pre>
<p>Где вместо “application” – имя вашей прилаги (по-сути – название папки, в которой она будет лежать)</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://UbuntuLinux.ru/developers/django-how-to-install-and-start/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
