<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <atom:link rel="self" type="application/rss+xml" href="http://breys.ru/rss"/>
    <language>ru</language>
    <copyright>Copyright 2008,2009 breys.ru</copyright>
    <title>Заметки на breys.ru</title>
    <link>http://breys.ru/blog/</link>
    <description>Заметки по теме: Django, Брейс - дизайн студия</description>
    <item>
      <link>http://breys.ru/blog/1596.html</link>
      <guid>http://breys.ru/blog/1596.html</guid>
      <title>Linux  Django pyodbc MSSQL</title>
      <pubDate>Sat, 28 Dec 2013 14:34:59 +0400</pubDate>
      <description>&lt;p&gt;настройки FreeTDS драйвера&lt;/p&gt;
&lt;pre&gt;cat /etc/freetds/freetds.conf&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[FREE_MSSQL]&lt;br /&gt;host = vinserv.a &lt;br /&gt;port = 1433&lt;br /&gt;tds version = 8.0&lt;br /&gt;client charset = UTF8 &lt;br /&gt;TraceFile = /tmp/freetds.log&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;проверка&lt;/p&gt;
&lt;pre&gt;tsql -S FREE_MSSQL -U sa -P 1&lt;/pre&gt;
&lt;p&gt;настройки системных odbc&lt;/p&gt;
&lt;pre&gt;cat /etc/odbcinst.ini &lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[af4]&lt;br /&gt;Description&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = Free TDS driver&lt;br /&gt;Driver&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so&lt;br /&gt;Setup&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so&lt;br /&gt;TraceFile&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp; /tmp/odbcinst.log&lt;br /&gt;ForceTrace = Yes &lt;br /&gt;FileUsage&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = 1&lt;br /&gt;UsageCount&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = 14&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;cat /etc/odbc.ini &lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[AF4]&lt;br /&gt;Description&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = MS SQL driver&lt;br /&gt;Driver&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = af4 &lt;br /&gt;Servername&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = FREE_MSSQL&lt;br /&gt;Database&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = ArchiveFund&lt;br /&gt;UID&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = sa&lt;br /&gt;PWD&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = 1&lt;br /&gt;Trace = YES &lt;br /&gt;TraceFile&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp; /tmp/odbc_trace&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;проверка&lt;/p&gt;
&lt;pre&gt;isql AF4 sa 1 -v&lt;/pre&gt;
&lt;p&gt;для проверки нужно использовать синтаксис ODBC, например&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;use ArchiveFund&lt;br /&gt;select * from tblFund&lt;br /&gt;go&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;после того как появились успешные тесты нужно настроить Django на работу с этим источником данных&lt;/p&gt;
&lt;pre&gt;pip install django-pyodbc&lt;/pre&gt;
&lt;p&gt;и добавляем в settings.py следующее определение DATABASES&lt;/p&gt;
&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#039AF4&amp;#039: {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#039ENGINE&amp;#039: &amp;#039django_pyodbc&amp;#039,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#039NAME&amp;#039: &amp;#039ArchiveFund&amp;#039,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#039USER&amp;#039: &amp;#039sa&amp;#039,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#039PASSWORD&amp;#039: &amp;#039sa&amp;#039,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#039OPTIONS&amp;#039: {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#039driver&amp;#039: &amp;#039FreeTDS&amp;#039,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#039dsn&amp;#039: &amp;#039AF4&amp;#039,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/blockquote&gt;
&lt;p&gt;Теперь можно проинспектировать базы с помощью&lt;/p&gt;
&lt;pre&gt;python manage.py&amp;nbsp; inspectdb &amp;gt;&amp;gt; af4/models.py&lt;/pre&gt;
&lt;p&gt;пока всё, после НГ буду разбираться с charset и чужими кривыми моделями&lt;/p&gt;</description>
      <author>ffsdmad@jabber.ru ( Басманов ) </author>
    </item>
    <item>
      <link>http://breys.ru/blog/1592.html</link>
      <guid>http://breys.ru/blog/1592.html</guid>
      <title>Django использование select_related для оптимизации работы</title>
      <pubDate>Thu, 05 Dec 2013 15:51:08 +0400</pubDate>
      <description>&lt;p&gt;Имею модель&amp;nbsp;fk.Archive на которую ссылаются несколько других моделей из разных приложений,&amp;nbsp;с помощью аттрибута&amp;nbsp;&lt;strong&gt;related_name&lt;/strong&gt;&amp;nbsp;указываю связь&lt;/p&gt;
&lt;pre&gt;#&lt;br /&gt;
class Archive(models.Model):&lt;br /&gt;&amp;nbsp; &amp;nbsp; short_name = models.CharField(max_length=50L, verbose_name=&amp;#039короткое название&amp;#039 )
&lt;br /&gt;&lt;br /&gt;class Fond(models.Model):&lt;br /&gt;&amp;nbsp; &amp;nbsp; archive = models.ForeignKey(Archive, verbose_name=&amp;#039архив&amp;#039, null=True, &lt;strong&gt;related_name=&amp;#039fond&amp;#039&lt;/strong&gt;)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;fkod = models.CharField(&amp;#039номер&amp;#039,max_length=8L)
&lt;br /&gt;
&lt;br /&gt;class Request(models.Model):&lt;br /&gt;&amp;nbsp; &amp;nbsp; crt_date = models.DateField(&amp;#039создание&amp;#039, editable=False, auto_now_add=True)&lt;br /&gt;&amp;nbsp; &amp;nbsp; archive = models.ForeignKey(Archive, verbose_name=&amp;#039архив&amp;#039, null=True, &lt;strong&gt;related_name=&amp;#039request&amp;#039&lt;/strong&gt;)&lt;/pre&gt;
&lt;p&gt;затем используются в разных представлениях с использованием&amp;nbsp;&lt;strong&gt;select_related&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;#&lt;br /&gt;
def fond_list(request):&lt;br /&gt;&amp;nbsp; &amp;nbsp; fond_list = Fond.objects.using(&amp;#039default&amp;#039).&lt;strong&gt;select_related("archive"&lt;/strong&gt;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; context = {&amp;#039fond_list&amp;#039: fond_list, }&lt;br /&gt;&amp;nbsp; &amp;nbsp; return render(request, &amp;#039ensa-fond.html&amp;#039, context)&lt;br /&gt;
&lt;br /&gt;
def request_index(request):&lt;br /&gt;&amp;nbsp; &amp;nbsp; table = RequestTable(Request.objects.&lt;strong&gt;select_related("archive"&lt;/strong&gt;))&lt;br /&gt;&amp;nbsp; &amp;nbsp; RequestConfig(request).configure(table)&lt;br /&gt;&amp;nbsp; &amp;nbsp; return render(request, &amp;#039request.html&amp;#039, {&amp;#039request_list2&amp;#039: table})&lt;br /&gt;
&lt;br /&gt;
class RequestIndex(ListView):&lt;br /&gt;&amp;nbsp; &amp;nbsp; template_name = "request.html"&lt;br /&gt;&amp;nbsp; &amp;nbsp; context_object_name = "request_list"&lt;br /&gt;&amp;nbsp; &amp;nbsp; def get_queryset(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return Request.objects.&lt;strong&gt;select_related("archive")&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-size: 1em;"&gt;зачем это нужно? Дело в том, что когда django генерируя шаблон выполняет запросы к таблица Fond и Reques, а затем расчитывает значение поля archive, то при генерации каждой новой строки будет выполнен новый sql запрос к таблице archive. Итого, если вы выводите табличку в 20 записей то как минимум получите 24 запроса к базе&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="открыть: оптимизация Django запросов с использование select_related" rel="lightbox[roadtrip]" href="/upload/1386244368.38.png"&gt;&lt;img src="/upload/images/1386244368.38.png" alt="оптимизация Django запросов с использование select_related" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;А в случае оптимизации &lt;strong&gt;select_relate&lt;/strong&gt; Django сгенерирует общий SQL запрос с использованием JOIN и в результате получите свой единственный запрос к таблице.&lt;/p&gt;
&lt;p&gt;Если используется представление на основе базовых классов то нужно переопределять&amp;nbsp;queryset с помощью&amp;nbsp;&lt;strong&gt;get_queryset&lt;/strong&gt;&lt;/p&gt;</description>
      <author>ffsdmad@jabber.ru ( Басманов ) </author>
    </item>
    <item>
      <link>http://breys.ru/blog/1587.html</link>
      <guid>http://breys.ru/blog/1587.html</guid>
      <title>Если Django начинает ругаться из под gunicorn UnicodeEncodeError</title>
      <pubDate>Mon, 30 Sep 2013 14:56:54 +0400</pubDate>
      <description>&lt;p&gt;Послу установки отлаженного приложения на сервер возможена такая ситуация, что приложение не работает, а в логах что-то вроде&lt;/p&gt;
&lt;pre&gt;type &amp;#039exceptions.UnicodeEncodeError&amp;#039, &amp;#039: &lt;br /&gt;&amp;#039, UnicodeEncodeError(&amp;#039ascii&amp;#039, u&amp;#039dpsse/history/lipa-vagonka.ru/\u0412\u0430\u0433\u043e\u043d\u043a\u0430/2013-09-30&amp;#039, 30, 37, &amp;#039ordinal not in range(128)&amp;#039))&lt;/pre&gt;
&lt;p&gt;Скорее всего это говорит о том, что запущенный экземпляр Django не знает о системной локали, проверить это легко, нужно в рабочем месте приложения сгенерировать исключение в котором показать текущую локаль&lt;/p&gt;
&lt;pre&gt;raise RuntimeError( os.has_key(&amp;#039LANG&amp;#039) )&lt;/pre&gt;
&lt;p&gt;или&lt;/p&gt;
&lt;pre&gt;import logging&lt;br /&gt;logger = logging.getLogger( __name__ )&lt;br /&gt;logger.error( os.has_key(&amp;#039LANG&amp;#039) )&lt;/pre&gt;
&lt;p&gt;Если будет что-то вроде&lt;/p&gt;
&lt;pre&gt;raise RuntimeError( os.environ[&amp;#039LANG&amp;#039] )&lt;br /&gt;&amp;nbsp; File "/data/django/gaspiko.ru/env/lib/python2.6/UserDict.py", line 22, in __getitem__&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise KeyError(key)&lt;br /&gt;KeyError: &amp;#039LANG&amp;#039&lt;/pre&gt;
&lt;p&gt;Значит локаль ни где не установлена! Проще всего установить локаль в скрипте запуска gunicorn&lt;/p&gt;
&lt;pre&gt;1 #!/bin/bash&lt;br /&gt;2 export LANG=ru_RU.UTF-8&lt;br /&gt;3 set -e&lt;/pre&gt;
&lt;p&gt;После перезапуска всё должно работать&lt;/p&gt;</description>
      <author>ffsdmad@jabber.ru ( Басманов ) </author>
    </item>
    <item>
      <link>http://breys.ru/blog/1585.html</link>
      <guid>http://breys.ru/blog/1585.html</guid>
      <title>Подготовка виртуальной среды для разработки в среде Django</title>
      <pubDate>Wed, 18 Sep 2013 12:41:17 +0400</pubDate>
      <description>&lt;p&gt;потребуетеся установить&lt;/p&gt;
&lt;pre&gt;aptitude install virtualenv&lt;/pre&gt;
&lt;p&gt;затем нужно создать директорию для django и создать там виртуальную среду&lt;/p&gt;
&lt;pre&gt;mkdir django-projects/&lt;br /&gt;virtualenv django-projects/env&lt;/pre&gt;
&lt;p&gt;а чтобы использовать виртуальную среду её необходимо активировать и заходя в директорию с проектами уже находясь в этой директории использовать git и pip и все прочее&lt;/p&gt;
&lt;pre&gt;cd django-projects/&lt;br /&gt;. env/bin/activate&lt;br /&gt;&lt;br /&gt;# установка необходимых модулей в виртуальную среду&lt;br /&gt;pip install django django-tinymce django-mptt&lt;br /&gt;&lt;br /&gt;# клонирование рабочего репозитория проекта&lt;br /&gt;git clone git@vrtubsvr1.a:~/gaspiko_ru&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;cd gaspiko_ru&lt;br /&gt;# запуск тестового сервера&lt;br /&gt;python manage.py runserver&lt;/pre&gt;
&lt;p&gt;вроде всё, на последок &lt;a href="http://git-scm.com/book/ru/"&gt;руководство по git&lt;/a&gt;, очередной поделке великого Торвальдса&lt;/p&gt;</description>
      <author>ffsdmad@jabber.ru ( Басманов ) </author>
    </item>
    <item>
      <link>http://breys.ru/blog/1584.html</link>
      <guid>http://breys.ru/blog/1584.html</guid>
      <title>Если сломался pip</title>
      <pubDate>Tue, 17 Sep 2013 07:33:57 +0400</pubDate>
      <description>&lt;p&gt;Бывает что в ходе установки различных модулей ломается pip и выдаёт на любую комманду что-то типа&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;ImportError&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; cannot &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; name urandom&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Что починить virtualenv без спереустановки необходимо выполнить&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;virtualenv --no-site-packages ~/breys_ru/env/&lt;/code&gt;&lt;/pre&gt;</description>
      <author>ffsdmad@jabber.ru ( Басманов ) </author>
    </item>
  </channel>
</rss>

