Ural penguins - Сообщения с тегом FormAlchemy
http://uralbash.ru/blog/tag/formalchemy/atom.xml
2012-07-04T11:51:00Z
ABlog
pyramid_formalchemy
http://uralbash.ru/articles/2012/pyramid_formalchemy/
2012-07-04T11:51:00Z
2012-07-04T11:51:00Z
Uralbash
<div class="section" id="pyramid-formalchemy">
<p><a class="reference external" href="https://pypi.python.org/pypi/FormAlchemy">FormAlchemy</a> это <code class="docutils literal"><span class="pre">CRUD</span></code> для <a class="reference external" href="http://sqlalchemy.org/">SQLAlchemy</a>. Для <a class="reference external" href="http://docs.pylonsproject.org/projects/pylons-webframework/en/latest/">Pylons</a>
существовало расширение прямо в самом модуле в разделе ext. Для Pyramid создали
отдельный пакет <a class="reference external" href="https://pypi.python.org/pypi/pyramid_formalchemy">pyramid_formalchemy</a>. Посмотрим как это работает:</p>
<p>Создаем проект:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ pcreate -s alchemy -s pyramid_fa myapp
</pre></div>
</div>
<p>добавляем в проект файл <code class="docutils literal"><span class="pre">forms.py</span></code>:</p>
<div class="literal-block-wrapper docutils container" id="id2">
<div class="code-block-caption"><span class="caption-text">forms.py</span></div>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">formalchemy</span> <span class="kn">import</span> <span class="n">FieldSet</span><span class="p">,</span> <span class="n">Grid</span>
</pre></div>
</div>
</div>
<p>структура файлов должна выглядеть так:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="p">|</span> <span class="p">|</span>+static/
<span class="p">|</span> <span class="p">|</span>+templates/
<span class="p">|</span> <span class="p">|</span>-__init__.py
<span class="p">|</span> <span class="p">|</span>-faforms.py
<span class="p">|</span> <span class="p">|</span>-fainit.py
<span class="p">|</span> <span class="p">|</span>-faroutes.py
<span class="p">|</span> <span class="p">|</span>-forms.py
<span class="p">|</span> <span class="p">|</span>-models.py
<span class="p">|</span> <span class="p">|</span>-tests.py
<span class="p">|</span> <span class="sb">`</span>-views.py
</pre></div>
</div>
<p>изменяем <code class="docutils literal"><span class="pre">__init__.py</span></code>:</p>
<div class="literal-block-wrapper docutils container" id="id3">
<div class="code-block-caption"><span class="caption-text">__init__.py</span></div>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">pyramid.config</span> <span class="kn">import</span> <span class="n">Configurator</span>
<span class="kn">from</span> <span class="nn">sqlalchemy</span> <span class="kn">import</span> <span class="n">engine_from_config</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">DBSession</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">global_config</span><span class="p">,</span> <span class="o">**</span><span class="n">settings</span><span class="p">):</span>
<span class="sd">""" This function returns a Pyramid WSGI application.</span>
<span class="sd"> """</span>
<span class="n">engine</span> <span class="o">=</span> <span class="n">engine_from_config</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="s1">'sqlalchemy.'</span><span class="p">)</span>
<span class="n">DBSession</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="n">bind</span><span class="o">=</span><span class="n">engine</span><span class="p">)</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">Configurator</span><span class="p">(</span><span class="n">settings</span><span class="o">=</span><span class="n">settings</span><span class="p">)</span>
<span class="n">config</span><span class="o">.</span><span class="n">add_static_view</span><span class="p">(</span><span class="s1">'static'</span><span class="p">,</span> <span class="s1">'static'</span><span class="p">,</span> <span class="n">cache_max_age</span><span class="o">=</span><span class="mi">3600</span><span class="p">)</span>
<span class="n">config</span><span class="o">.</span><span class="n">add_route</span><span class="p">(</span><span class="s1">'home'</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">)</span>
<span class="n">config</span><span class="o">.</span><span class="n">scan</span><span class="p">()</span>
<span class="c1"># pyramid_formalchemy's configuration</span>
<span class="n">config</span><span class="o">.</span><span class="n">include</span><span class="p">(</span><span class="s1">'pyramid_fanstatic'</span><span class="p">)</span>
<span class="n">config</span><span class="o">.</span><span class="n">include</span><span class="p">(</span><span class="s1">'pyramid_formalchemy'</span><span class="p">)</span>
<span class="n">config</span><span class="o">.</span><span class="n">include</span><span class="p">(</span><span class="s1">'fa.jquery'</span><span class="p">)</span>
<span class="c1"># register an admin UI</span>
<span class="n">config</span><span class="o">.</span><span class="n">formalchemy_admin</span><span class="p">(</span><span class="s1">'/admin'</span><span class="p">,</span> <span class="n">package</span><span class="o">=</span><span class="s1">'youAppName'</span><span class="p">,</span>
<span class="n">view</span><span class="o">=</span><span class="s1">'fa.jquery.pyramid.ModelView'</span><span class="p">)</span>
<span class="k">return</span> <span class="n">config</span><span class="o">.</span><span class="n">make_wsgi_app</span><span class="p">()</span>
</pre></div>
</div>
</div>
<p>Заходим в <a class="reference external" href="http://0.0.0.0:6543/admin/">http://0.0.0.0:6543/admin/</a> и радуемся.</p>
<img alt="_static/2012/pyramid_formalchemy.png" class="align-center" src="_static/2012/pyramid_formalchemy.png" />
<p>Online демо находится <a class="reference external" href="http://docs.formalchemy.org/demo/admin/">здесь</a>.</p>
</div>
FormAlchemy KeyError: "Key not found: "
http://uralbash.ru/articles/2011/fa_keyerror/
2011-12-18T22:51:00Z
2011-12-18T22:51:00Z
Uralbash
<div class="section" id="formalchemy-keyerror-key-not-found">
<p>Ошибка в <a class="reference external" href="http://docs.formalchemy.org/">FormAlchemy</a> типа <code class="docutils literal"><span class="pre">KeyError:</span> <span class="pre">"Key</span> <span class="pre">not</span> <span class="pre">found:</span>
<span class="pre">u'Task--super_task_id'"</span></code> лечится обновлением:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ pip install formalchemy --upgrade
</pre></div>
</div>
<p>При этом новая версия подтянет бетта версию <a class="reference external" href="http://docs.webob.org/en/latest/">webob</a> 1.2 с которым
<a class="reference external" href="http://docs.pylonsproject.org/projects/pylons-webframework/en/latest/">pylons</a> 1 еще не работает из-за:</p>
<p><code class="docutils literal"><span class="pre">DeprecationWarning:</span> <span class="pre">decode_param_names</span> <span class="pre">is</span> <span class="pre">deprecated</span> <span class="pre">and</span> <span class="pre">will</span> <span class="pre">not</span> <span class="pre">be</span> <span class="pre">supported</span> <span class="pre">starting</span> <span class="pre">with</span> <span class="pre">WebOb</span> <span class="pre">1.2</span></code></p>
<p>Откатимся:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ pip install <span class="nv">webob</span><span class="o">==</span><span class="m">1</span>.1.1
</pre></div>
</div>
<p>Ошибка должна исчезнуть, вот обсуждение <a class="reference external" href="http://groups.google.com/group/formalchemy/browse_thread/thread/19348cc5faae8711/3aaf49efffd9f160?lnk=gst&q=key+not+found#3aaf49efffd9f160">google groups</a></p>
</div>
Pylons + FormAlchemy REST Controller
http://uralbash.ru/articles/2011/fa_rest_controller/
2011-11-13T21:10:00Z
2011-11-13T21:10:00Z
Uralbash
<div class="section" id="pylons-formalchemy-rest-controller">
<p>Для своих <a class="reference external" href="https://ru.wikipedia.org/wiki/REST">REST</a> контроллеров можно использовать, формы <a class="reference external" href="http://docs.formalchemy.org/">FormAlchemy</a>.</p>
<p>Создаем контроллер:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>/path/to/youproj$ paster restcontroller comment comments
Creating yourproj/yourproj/controllers/comments.py
Creating yourproj/yourproj/tests/functional/test_comments.py
</pre></div>
</div>
<p>Или если нужно в отдельной директории:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>/path/to/yourproj$ paster restcontroller admin/tracback admin/trackbacks
Creating yourproj/controllers/admin
Creating yourproj/yourproj/controllers/admin/trackbacks.py
Creating yourproj/yourproj/tests/functional/test_admin_trackbacks.py
</pre></div>
</div>
<p>В файле нашего <a class="reference external" href="https://ru.wikipedia.org/wiki/REST">REST</a> контроллера добавим:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">formalchemy.ext.pylons.controller</span> <span class="kn">import</span> <span class="n">RESTController</span>
</pre></div>
</div>
<p>И в конце файла обернем его так:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># wrap with formalchemy RESTController</span>
<span class="n">CommentsController</span> <span class="o">=</span> <span class="n">RESTController</span><span class="p">(</span><span class="n">CommentsController</span><span class="p">,</span> <span class="s1">'comment'</span><span class="p">,</span> <span class="s1">'comments'</span><span class="p">)</span>
</pre></div>
</div>
<p>Теперь если закомментировать какой-нибудь из стандартных методов в
контроллере (<code class="docutils literal"><span class="pre">index</span></code>, <code class="docutils literal"><span class="pre">new</span></code>, <code class="docutils literal"><span class="pre">update</span></code>, <code class="docutils literal"><span class="pre">delete</span></code>, <code class="docutils literal"><span class="pre">show</span></code>, <code class="docutils literal"><span class="pre">edit</span></code>) он
будет браться из контроллера <a class="reference external" href="http://docs.formalchemy.org/">FormAlchemy</a> со стандартными формами. Довольно
удобно в разработке.</p>
</div>