Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed multiple ui_modules issue, updated documentation (still unfinis…

…hed)
  • Loading branch information...
commit a05548abc0967ecefa401e3106af87ef7650adc3 1 parent 05aa5e0
@LBiNationalTrust LBiNationalTrust authored
View
BIN  Documentation/_build/doctrees/docs/quickstart.doctree
Binary file not shown
View
BIN  Documentation/_build/doctrees/environment.pickle
Binary file not shown
View
BIN  Documentation/_build/doctrees/index.doctree
Binary file not shown
View
96 Documentation/_build/html/_sources/docs/quickstart.txt
@@ -1,3 +1,99 @@
Quickstart: Using Mojo for the first time
=========================================
+This is a quickstart tutorial that will get you set up and running with Mojo for the first time.
+
+Installation
+------------
+
+1. Download the Mojo distribution
+2. Decompress the zip file
+3. Make sure you have installed the required support packages: ``Tornado``, ``TornadIO2``, ``bcrypt`` and ``wtforms``
+4. From the command line in the new folder run ``python setup.py install``
+
+This should install Mojo into your python path. However, there is one more step that you may need to do to fully
+take advantage of Mojo's helper apps, and that is to make mojo_manager available in your PATH, for linux and Mac OSX users,
+this can be accomplished by doing something like::
+
+ ln /usr/bin/python2.7/Lib/site-packages/Mojo/mojo_manager.py /usr/sbin/mojo_manager.py
+
+On windows, adding the Mojo site-packages directory should be enough to give gloabl access to ``mojo_manager``
+
+Once you've done that, you should be able to test your installation by opeining a python window and typing::
+
+ import Mojo
+
+*Note:* It is recommended to deploy Mojo in something like virtualenv to ensure you can easily keep it (and your app)
+up to date without affecting your main Python setup and other projects.
+
+Your first project
+------------------
+
+Mojo sets up it's projects as a project folder that contains a series of Apps, these apps are independent from one another
+and offer a way to group different functional areas of your app away into discrete units. The typical Mojo project will have a
+folder structure that looks like::
+
+ --[ProjectName]
+ ----[static]
+ ----[Apps]
+ ------[App 1]
+ --------[templates]
+ --------models.py
+ --------ui_modules.py
+ --------urls.py
+ --------views.py
+ ------[App 2]
+ ------[App 3]
+ ----settings.py
+ ----runserver.py
+
+A quick run down of what each of these files and folders are:
+
+* ``[ProjectName]``: Your projct folder, this houses all the apps, modules settings and server for your tornado project
+* ``[static]``: All your static assets can be placed in here and they will be referenced automatically when you use the ``static_url("images/logo.png")`` built in tornado function
+* ``[Apps]``: Houses all of your individual apps, these break down into a series of base files that make your app work:
+
+ * ``[App 1]/models.py``: This is your model definition file, here you set out what database tables you want to use
+ * ``[App 1]/ui_modules.py``: Your UI Modules for Tornado are housed here, these are automatically loaded so they can be used directly from your templates
+ * ``[App 1]/urls.py``: The URL's for this app, ampping to the relevant Request Handlers
+ * ``[App 1]/views.py``: The request handlers that will manage the various app's functions
+
+* ``settings.py``: All the settings for your application
+* ``runserver.py``: This, strangely enough, runs your web server
+
+To create your first app, you simply need to invok ethe mojo_manager application,
+this will create your project folder as follows::
+
+mojo_manager.py -p MyNewProject
+cd MyNewProject
+mojo_manager.py -a HelloWorldApp
+
+That's it, all the files you need to get started should be created and in nbamed appropriately.
+
+Setup the App
+-------------
+
+To get started, lets set up your settings.py to get your first server up and running. Open ``settings.py`` in your favourite editor
+and make sure the ``INSTALLED_APPS`` section looks like this::
+
+ INSTALLED_APPS = [
+ 'HelloWorldApp',
+ ]
+
+Once you've made the change, simply save the file and open up your terminal window in the directory where ``runserver.py`` is located, then
+type the following::
+
+ ``python runserver.py``
+
+You should see::
+
+ Starting Mojo tornado server.
+ DEBUG:root:Setting up url routers:
+ DEBUG:root:--Added URL's for: blog_app
+ DEBUG:root:--Adding UI Modules for blog_app
+ DEBUG:root:--Added SocketHandler for: blog_app
+ DEBUG:root:Found DATABASE setting - creating session for DB: mojo_blog
+ INFO:root:Starting up tornadio server on port '8001'
+ INFO:root:Entering IOLoop...
+
+If you navigate to ``http://localhost:8000`` you should see the Mojo welcome page. *Congratulations, you are running Mojo!*
View
19 Documentation/_build/html/_sources/index.txt
@@ -6,13 +6,30 @@
Mojo - a framework for Tornado
==============================
+Mojo is a framework that makes it easy and quick to build Tornado projects that scale.
+
+Some key features of Mojo:
+
+- A lightweight and flexible ORM that makes developing easy
+- ORM is based off a 'backend' system, enabling you to write your own backend and extend the ORM to other databases without altering your code
+- Authentication and session mixins so you don't need to roll-your-own implementation or third parties
+- Integration with wtForms, with the ability to use your Models as Forms and to populate models from Form data
+- Modular structure so you can add functionality to your project on an app by app basis
+- Prettier debugging output
+- SocketIO support baked in with TornadIO2
+- Project and app-creation templates that make it easy to set up new projects
+
+The project is heavily influenced by Django, developers familiar with django will find some of the conventions in Mojo
+very familiar.
+
+To get acquainted with Mojo and get started, see the quick-start guide.
+
Contents:
---------
.. toctree::
:maxdepth: 2
- docs/intro.rst
docs/quickstart.rst
docs/apps.rst
docs/urls.rst
View
107 Documentation/_build/html/docs/quickstart.html
@@ -27,7 +27,7 @@
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="top" title="Mojo 0.1 documentation" href="../index.html" />
<link rel="next" title="What are apps" href="apps.html" />
- <link rel="prev" title="An introduction to Mojo" href="intro.html" />
+ <link rel="prev" title="Mojo - a framework for Tornado" href="../index.html" />
</head>
<body>
<div class="related">
@@ -43,7 +43,7 @@
<a href="apps.html" title="What are apps"
accesskey="N">next</a> |</li>
<li class="right" >
- <a href="intro.html" title="An introduction to Mojo"
+ <a href="../index.html" title="Mojo - a framework for Tornado"
accesskey="P">previous</a> |</li>
<li><a href="../index.html">Mojo 0.1 documentation</a> &raquo;</li>
</ul>
@@ -56,6 +56,93 @@
<div class="section" id="quickstart-using-mojo-for-the-first-time">
<h1>Quickstart: Using Mojo for the first time<a class="headerlink" href="#quickstart-using-mojo-for-the-first-time" title="Permalink to this headline">¶</a></h1>
+<p>This is a quickstart tutorial that will get you set up and running with Mojo for the first time.</p>
+<div class="section" id="installation">
+<h2>Installation<a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h2>
+<ol class="arabic simple">
+<li>Download the Mojo distribution</li>
+<li>Decompress the zip file</li>
+<li>Make sure you have installed the required support packages: <tt class="docutils literal"><span class="pre">Tornado</span></tt>, <tt class="docutils literal"><span class="pre">TornadIO2</span></tt>, <tt class="docutils literal"><span class="pre">bcrypt</span></tt> and <tt class="docutils literal"><span class="pre">wtforms</span></tt></li>
+<li>From the command line in the new folder run <tt class="docutils literal"><span class="pre">python</span> <span class="pre">setup.py</span> <span class="pre">install</span></tt></li>
+</ol>
+<p>This should install Mojo into your python path. However, there is one more step that you may need to do to fully
+take advantage of Mojo&#8217;s helper apps, and that is to make mojo_manager available in your PATH, for linux and Mac OSX users,
+this can be accomplished by doing something like:</p>
+<div class="highlight-python"><pre>ln /usr/bin/python2.7/Lib/site-packages/Mojo/mojo_manager.py /usr/sbin/mojo_manager.py</pre>
+</div>
+<p>On windows, adding the Mojo site-packages directory should be enough to give gloabl access to <tt class="docutils literal"><span class="pre">mojo_manager</span></tt></p>
+<p>Once you&#8217;ve done that, you should be able to test your installation by opeining a python window and typing:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">Mojo</span>
+</pre></div>
+</div>
+<p><em>Note:</em> It is recommended to deploy Mojo in something like virtualenv to ensure you can easily keep it (and your app)
+up to date without affecting your main Python setup and other projects.</p>
+</div>
+<div class="section" id="your-first-project">
+<h2>Your first project<a class="headerlink" href="#your-first-project" title="Permalink to this headline">¶</a></h2>
+<p>Mojo sets up it&#8217;s projects as a project folder that contains a series of Apps, these apps are independent from one another
+and offer a way to group different functional areas of your app away into discrete units. The typical Mojo project will have a
+folder structure that looks like:</p>
+<div class="highlight-python"><pre>--[ProjectName]
+----[static]
+----[Apps]
+------[App 1]
+--------[templates]
+--------models.py
+--------ui_modules.py
+--------urls.py
+--------views.py
+------[App 2]
+------[App 3]
+----settings.py
+----runserver.py</pre>
+</div>
+<p>A quick run down of what each of these files and folders are:</p>
+<ul class="simple">
+<li><tt class="docutils literal"><span class="pre">[ProjectName]</span></tt>: Your projct folder, this houses all the apps, modules settings and server for your tornado project</li>
+<li><tt class="docutils literal"><span class="pre">[static]</span></tt>: All your static assets can be placed in here and they will be referenced automatically when you use the <tt class="docutils literal"><span class="pre">static_url(&quot;images/logo.png&quot;)</span></tt> built in tornado function</li>
+<li><tt class="docutils literal"><span class="pre">[Apps]</span></tt>: Houses all of your individual apps, these break down into a series of base files that make your app work:<ul>
+<li><tt class="docutils literal"><span class="pre">[App</span> <span class="pre">1]/models.py</span></tt>: This is your model definition file, here you set out what database tables you want to use</li>
+<li><tt class="docutils literal"><span class="pre">[App</span> <span class="pre">1]/ui_modules.py</span></tt>: Your UI Modules for Tornado are housed here, these are automatically loaded so they can be used directly from your templates</li>
+<li><tt class="docutils literal"><span class="pre">[App</span> <span class="pre">1]/urls.py</span></tt>: The URL&#8217;s for this app, ampping to the relevant Request Handlers</li>
+<li><tt class="docutils literal"><span class="pre">[App</span> <span class="pre">1]/views.py</span></tt>: The request handlers that will manage the various app&#8217;s functions</li>
+</ul>
+</li>
+<li><tt class="docutils literal"><span class="pre">settings.py</span></tt>: All the settings for your application</li>
+<li><tt class="docutils literal"><span class="pre">runserver.py</span></tt>: This, strangely enough, runs your web server</li>
+</ul>
+<p>To create your first app, you simply need to invok ethe mojo_manager application,
+this will create your project folder as follows:</p>
+<p>mojo_manager.py -p MyNewProject
+cd MyNewProject
+mojo_manager.py -a HelloWorldApp</p>
+<p>That&#8217;s it, all the files you need to get started should be created and in nbamed appropriately.</p>
+</div>
+<div class="section" id="setup-the-app">
+<h2>Setup the App<a class="headerlink" href="#setup-the-app" title="Permalink to this headline">¶</a></h2>
+<p>To get started, lets set up your settings.py to get your first server up and running. Open <tt class="docutils literal"><span class="pre">settings.py</span></tt> in your favourite editor
+and make sure the <tt class="docutils literal"><span class="pre">INSTALLED_APPS</span></tt> section looks like this:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">INSTALLED_APPS</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="s">&#39;HelloWorldApp&#39;</span><span class="p">,</span>
+<span class="p">]</span>
+</pre></div>
+</div>
+<p>Once you&#8217;ve made the change, simply save the file and open up your terminal window in the directory where <tt class="docutils literal"><span class="pre">runserver.py</span></tt> is located, then
+type the following:</p>
+<div class="highlight-python"><pre>``python runserver.py``</pre>
+</div>
+<p>You should see:</p>
+<div class="highlight-python"><pre>Starting Mojo tornado server.
+DEBUG:root:Setting up url routers:
+DEBUG:root:--Added URL's for: blog_app
+DEBUG:root:--Adding UI Modules for blog_app
+DEBUG:root:--Added SocketHandler for: blog_app
+DEBUG:root:Found DATABASE setting - creating session for DB: mojo_blog
+INFO:root:Starting up tornadio server on port '8001'
+INFO:root:Entering IOLoop...</pre>
+</div>
+<p>If you navigate to <tt class="docutils literal"><span class="pre">http://localhost:8000</span></tt> you should see the Mojo welcome page. <em>Congratulations, you are running Mojo!</em></p>
+</div>
</div>
@@ -64,9 +151,19 @@
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
+ <h3><a href="../index.html">Table Of Contents</a></h3>
+ <ul>
+<li><a class="reference internal" href="#">Quickstart: Using Mojo for the first time</a><ul>
+<li><a class="reference internal" href="#installation">Installation</a></li>
+<li><a class="reference internal" href="#your-first-project">Your first project</a></li>
+<li><a class="reference internal" href="#setup-the-app">Setup the App</a></li>
+</ul>
+</li>
+</ul>
+
<h4>Previous topic</h4>
- <p class="topless"><a href="intro.html"
- title="previous chapter">An introduction to Mojo</a></p>
+ <p class="topless"><a href="../index.html"
+ title="previous chapter">Mojo - a framework for Tornado</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="apps.html"
title="next chapter">What are apps</a></p>
@@ -105,7 +202,7 @@
<a href="apps.html" title="What are apps"
>next</a> |</li>
<li class="right" >
- <a href="intro.html" title="An introduction to Mojo"
+ <a href="../index.html" title="Mojo - a framework for Tornado"
>previous</a> |</li>
<li><a href="../index.html">Mojo 0.1 documentation</a> &raquo;</li>
</ul>
View
33 Documentation/_build/html/index.html
@@ -26,7 +26,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="Mojo 0.1 documentation" href="#" />
- <link rel="next" title="An introduction to Mojo" href="docs/intro.html" />
+ <link rel="next" title="Quickstart: Using Mojo for the first time" href="docs/quickstart.html" />
</head>
<body>
<div class="related">
@@ -39,7 +39,7 @@
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
- <a href="docs/intro.html" title="An introduction to Mojo"
+ <a href="docs/quickstart.html" title="Quickstart: Using Mojo for the first time"
accesskey="N">next</a> |</li>
<li><a href="#">Mojo 0.1 documentation</a> &raquo;</li>
</ul>
@@ -52,12 +52,31 @@
<div class="section" id="mojo-a-framework-for-tornado">
<h1>Mojo - a framework for Tornado<a class="headerlink" href="#mojo-a-framework-for-tornado" title="Permalink to this headline">¶</a></h1>
+<p>Mojo is a framework that makes it easy and quick to build Tornado projects that scale.</p>
+<p>Some key features of Mojo:</p>
+<ul class="simple">
+<li>A lightweight and flexible ORM that makes developing easy</li>
+<li>ORM is based off a &#8216;backend&#8217; system, enabling you to write your own backend and extend the ORM to other databases without altering your code</li>
+<li>Authentication and session mixins so you don&#8217;t need to roll-your-own implementation or third parties</li>
+<li>Integration with wtForms, with the ability to use your Models as Forms and to populate models from Form data</li>
+<li>Modular structure so you can add functionality to your project on an app by app basis</li>
+<li>Prettier debugging output</li>
+<li>SocketIO support baked in with TornadIO2</li>
+<li>Project and app-creation templates that make it easy to set up new projects</li>
+</ul>
+<p>The project is heavily influenced by Django, developers familiar with django will find some of the conventions in Mojo
+very familiar.</p>
+<p>To get acquainted with Mojo and get started, see the quick-start guide.</p>
<div class="section" id="contents">
<h2>Contents:<a class="headerlink" href="#contents" title="Permalink to this headline">¶</a></h2>
<div class="toctree-wrapper compound">
<ul>
-<li class="toctree-l1"><a class="reference internal" href="docs/intro.html">An introduction to Mojo</a></li>
-<li class="toctree-l1"><a class="reference internal" href="docs/quickstart.html">Quickstart: Using Mojo for the first time</a></li>
+<li class="toctree-l1"><a class="reference internal" href="docs/quickstart.html">Quickstart: Using Mojo for the first time</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="docs/quickstart.html#installation">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="docs/quickstart.html#your-first-project">Your first project</a></li>
+<li class="toctree-l2"><a class="reference internal" href="docs/quickstart.html#setup-the-app">Setup the App</a></li>
+</ul>
+</li>
<li class="toctree-l1"><a class="reference internal" href="docs/apps.html">What are apps</a></li>
<li class="toctree-l1"><a class="reference internal" href="docs/urls.html">Routing pages with URL&#8217;s</a></li>
<li class="toctree-l1"><a class="reference internal" href="docs/models.html">Using the ORM and Models in your apps</a></li>
@@ -125,8 +144,8 @@
</ul>
<h4>Next topic</h4>
- <p class="topless"><a href="docs/intro.html"
- title="next chapter">An introduction to Mojo</a></p>
+ <p class="topless"><a href="docs/quickstart.html"
+ title="next chapter">Quickstart: Using Mojo for the first time</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/index.txt"
@@ -159,7 +178,7 @@
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
- <a href="docs/intro.html" title="An introduction to Mojo"
+ <a href="docs/quickstart.html" title="Quickstart: Using Mojo for the first time"
>next</a> |</li>
<li><a href="#">Mojo 0.1 documentation</a> &raquo;</li>
</ul>
View
BIN  Documentation/_build/html/objects.inv
Binary file not shown
View
2  Documentation/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({objects:{"Mojo.Auth.SessionManager":{Reset_session:[3,1,1,""],Setup_session:[3,1,1,""],SessionManager:[3,2,1,""]},"Mojo.Backends":{base_interface:[6,0,1,""]},"Mojo.Auth.Mixins.MojoAuthMixin":{MojoAuthMixin:[9,2,1,""]},"Mojo.ObjectMapper":{FieldPrototype:[14,0,1,""],Fields:[14,0,1,""]},"Mojo.ObjectMapper.ModelPrototype":{EmbeddedModelField:[14,2,1,""],Model:[14,2,1,""]},"Mojo.ObjectMapper.FieldPrototype":{Field:[14,2,1,""]},"Mojo.SocketHandlers.BaseSocketHandler":{MojoSocketHandler:[2,2,1,""]},"Mojo.ObjectMapper.Fields.ObjectIDField":{base_type:[14,4,1,""]},"Mojo.Backends.base_interface.CollectionModelInterface":{find_one:[6,3,1,""],insert:[6,3,1,""],save:[6,3,1,""],find:[6,3,1,""],"delete":[6,3,1,""]},"Mojo.Auth.Mixins":{MojoAuthMixin:[9,0,1,""]},"Mojo.ObjectMapper.Fields.BooleanField":{get_value:[14,3,1,""],base_type:[14,4,1,""]},"Mojo.ObjectMapper.FieldPrototype.Field":{validate:[14,3,1,""],get_value:[14,3,1,""],validate_type:[14,3,1,""],validate_is_null:[14,3,1,""]},"Mojo.Auth.SessionManager.SessionManager":{"_get_session_key":[3,3,1,""],"_decode_session":[3,3,1,""],"_set_session_key":[3,3,1,""],"_is_session_valid":[3,3,1,""],get_session_cookies:[3,3,1,""],"_logout":[3,3,1,""],"_is_logged_in":[3,3,1,""],"_login":[3,3,1,""],"_encode_session":[3,3,1,""],"_create_new_session":[3,3,1,""]},"Mojo.ObjectMapper.Fields.FloatField":{base_type:[14,4,1,""]},"Mojo.Auth.AuthManager":{authenticate:[3,1,1,""],remove_from_group:[3,1,1,""],make_random_password:[3,1,1,""],login:[3,1,1,""],is_member_of:[3,1,1,""],set_password:[3,1,1,""],add_to_group:[3,1,1,""]},"Mojo.ObjectMapper.Fields.ListField":{base_type:[14,4,1,""]},"Mojo.ObjectMapper.Fields.IntegerField":{base_type:[14,4,1,""]},"Mojo.Auth.Helpers":{login_assistant:[3,1,1,""],logout_assistant:[3,1,1,""]},"Mojo.ObjectMapper.Fields":{DateTimeField:[14,2,1,""],ListField:[14,2,1,""],IntegerField:[14,2,1,""],StringField:[14,2,1,""],FloatField:[14,2,1,""],ObjectIDField:[14,2,1,""],BooleanField:[14,2,1,""]},"Mojo.Auth.Mixins.SessionMixins.SessionMixin_Async":{get_session_key:[9,3,1,""],set_session_key:[9,3,1,""],get_session_object:[9,3,1,""],session:[9,4,1,""],get_user_from_db:[9,3,1,""],save_session_object:[9,3,1,""],create_new_session:[9,3,1,""]},"Mojo.ObjectMapper.Fields.StringField":{base_type:[14,4,1,""]},"Mojo.ObjectMapper.Fields.DateTimeField":{base_type:[14,4,1,""]},"Mojo.SocketHandlers":{BaseSocketHandler:[2,0,1,""]},"Mojo.Auth.Mixins.SessionMixins.SessionMixin_Sync":{get_session_key:[9,3,1,""],set_session_key:[9,3,1,""],get_session_object:[9,3,1,""],session:[9,4,1,""],get_user_from_db:[9,3,1,""],save_session_object:[9,3,1,""],create_new_session:[9,3,1,""]},"Mojo.Auth.models":{Profile:[3,2,1,""],Session:[3,2,1,""],Group:[3,2,1,""],User:[3,2,1,""]},"Mojo.Auth":{models:[3,0,1,""],Helpers:[3,0,1,""],AuthManager:[3,0,1,""],SessionManager:[3,0,1,""]},"Mojo.Auth.Mixins.SessionMixins":{SessionMixin_Async:[9,2,1,""],SessionMixin_Sync:[9,2,1,""]},"Mojo.RequestHandlers.MojoHandler":{MojoRequestHandler:[7,2,1,""]},"Mojo.ObjectMapper.ModelPrototype.EmbeddedModelField":{base_type:[14,4,1,""]},"Mojo.ObjectMapper.ModelPrototype.Model":{validate:[14,3,1,""],insert:[14,5,1,""],delete_bulk:[14,5,1,""],delete_bulk_async:[14,5,1,""],find_one:[14,5,1,""],insert_async:[14,5,1,""],get_value:[14,3,1,""],find_one_async:[14,5,1,""],save_async:[14,3,1,""],find_async:[14,5,1,""],save:[14,3,1,""],delete_async:[14,3,1,""],find:[14,5,1,""],"delete":[14,3,1,""]},"Mojo.Backends.base_interface":{CollectionModelInterface:[6,2,1,""],SessionInterface:[6,2,1,""]},"Mojo.RequestHandlers":{MojoHandler:[7,0,1,""]},"Mojo.Auth.Mixins.MojoAuthMixin.MojoAuthMixin":{get_current_user:[9,3,1,""]}},terms:{represent:[3,14],all:[3,7,2,6,14],chain:14,queri:[3,14],global:2,managem:9,follow:6,lookup:3,profil:3,decid:6,specif:[3,14,2,6,9],depend:[3,14],advantag:[14,9],current_us:[3,9],mojorequesthandl:[7,6,9],base64:3,friendli:14,init:3,collectionmodelinterfac:6,get_user_from_db:9,under:14,base_typ:14,digit:3,sourc:14,everi:[3,7],string:[3,14],straightforward:9,fals:[3,14,6],on_messag:2,this_us:6,retriev:14,relev:[3,14,6],cool:7,list:[3,14,6],"try":[14,6],item:14,cooki:[3,2,9],tru:3,round:3,direct:[7,6],design:[3,6,9],pass:2,port:6,compat:9,index:0,what:[0,14,6,12],this_field:14,section:3,abl:6,current:[3,6,9],delet:[14,6],"_get_valu":14,last_login:3,modelprototyp:[14,6],"new":[3,14,6,9],ascii:3,method:[3,14,9],full:[14,9],gener:[3,2],here:[14,2],behaviour:14,met:14,let:14,address:3,socketconnectionhandl:2,valu:[3,14,9],login_assist:[3,9],search:0,base_interfac:6,mojo_set:7,on_clos:2,datetim:14,base:[0,2,3,6,9,14],make_random_password:3,another_field:14,chang:[3,14,6],via:[6,9],appli:3,app:[0,4,12],prefer:9,is_authent:3,schemaless:14,api:0,instal:[3,6],coercion:14,mongo:[3,14],from:[3,14,2,6,9],describ:6,would:14,stringfield:14,two:[14,2,6,9],date_join:3,next:9,sessionobj:3,find_one_async:[14,6],call:[3,14,2,6],recommend:6,msg:2,simpler:2,type:[0,14],minor:6,more:[3,7,14],to_insert:14,wrapper:[6,9],site:2,function_nam:6,flag:3,indic:[3,0],hold:9,basesockethandl:2,must:14,none:[2,3,6,9,7,14],endpoint:2,join:3,hour:3,socketio:[0,13],alia:14,setup:[2,6],work:9,kwarg:[7,14,6,9],can:[3,7,2,6,14],sessionmixin_sync:[7,9],purpos:[14,9],def:[14,7,2,6,9],overrid:[14,2,6,9],"_is_session_valid":3,quickstart:[11,0],objectid:[3,14],give:7,process:3,insert_async:14,templat:[6,9],minimum:14,want:[3,7,14],onlin:2,multipl:[3,14],secur:[3,9],anoth:[3,2],snippet:6,how:3,instead:[7,6,9],simpl:[14,2,9],this_session_valu:9,map:14,overridden:14,after:3,variant:14,befor:14,mixin:[3,0,9,7],date:3,end:[14,6],data:[3,14,2,6,9],essenti:[3,6],expiry_dai:3,explicit:14,validate_is_nul:14,callback:9,maintain:3,allow:[3,14],subtyp:14,order:[3,6],help:3,allow_empti:14,"abstract":6,familli:9,through:[3,7,6],mainli:[3,14],whatever_field:14,paramet:[3,14,6],write:6,style:[14,6,9],group:3,render:[7,6,9],nifti:9,chosen:[3,14],"__class__":14,mytestmodel:14,persist:[3,9],depopul:2,main:[3,14,9],easier:[3,7],finer:14,non:[3,14,6,9],"return":[3,14,6,9],thei:[7,14,9],python:[],som:14,safe:6,dai:3,auth:[0,2,3,6,9,10],framework:[3,0,2,14],db_name:6,funciton:9,now:14,introduct:[0,8],name:[3,6],authent:[3,9],easili:6,each:[14,9],fulli:[6,9],unicod:14,mean:14,wrap:9,expect:[14,6],our:14,event:2,out:[3,14],variabl:[7,14,9],ictionari:[],shown:14,accomplish:3,typecast:14,content:0,rewrit:6,print:[14,6],correct:14,integr:[3,14,6],written:6,manipul:3,standard:[14,7,2,9],quick:9,reason:6,orm:[0,14,4,9],dictionari:[14,2,6],alongsid:[3,9],get_session_cooki:3,omit:14,synchron:[3,9],initialis:[3,9],datetimefield:[3,14],thing:[3,14],length:14,retain:6,my_data:14,bakend:[],assign:[14,6,9],first:[11,0,6,9],oper:[14,9],directli:[3,14],onc:3,sessioninterfac:6,unlik:14,alreadi:9,messag:2,blank:3,mojo:[0,2,3,6,5,7,8,9,10,11,13,14],hood:14,new_password:3,differ:[14,6],strict:14,associ:6,interact:6,linenothreshold:[],system:3,least:6,tradition:14,max_length:14,similarli:9,logged_in:[3,2,9],conveni:2,store:[3,14,2,9],schema:6,adher:6,option:[3,14],asyncmongo:6,namespac:14,tool:[3,6],broadcast:2,sraightforward:6,part:[3,14,6,9],accompani:3,"_logout":3,than:14,serv:7,target:9,provid:[3,9],remov:[3,14],requesthandl:[3,0,9,7],logout_assist:3,structur:14,charact:[3,14],project:[7,6],classmethod:14,mojohandl:[7,9],minut:3,treanslat:6,seri:3,save_async:14,fieldprototyp:14,validate_max_length:14,"_async":6,ani:[3,7,6,9],find_on:[3,14,6,9],raw:14,expir:3,have:[14,6,9],tabl:0,need:[3,7,14],"null":14,objectmapp:[0,14,6],engin:[6,9],built:14,thisus:[3,14,9],inform:[3,6,9],self:[2,3,6,9,7,14],client:2,note:14,mix:3,without:[14,6,9],take:[3,14,6,9],which:[14,6,9],bcrypt:3,singl:14,uppercas:3,login_assit:3,sure:6,integerfield:14,get_current_us:[3,9],tornado:[3,0,6,9,7],"504e0439a9ee2f04a0835a92":3,object:[3,7,14,6,9],most:[],regular:[6,9],automodul:[],contain:14,"class":[2,3,6,9,7,14],tradit:6,don:7,url:[0,1,7],"_return_model_object":6,request:[3,7,2,9],doe:3,declar:7,determin:3,"_id":3,dot:14,max_valu:14,text:14,"__str__":14,random:3,new_sess:3,session:[0,2,3,6,9,7],get_session_kei:9,"_login":3,fine:14,find:[14,6],redirect:9,access:[7,14,6,9],onli:[3,2,6],coerc:14,activ:3,state:3,should:[3,14,9],dict:[3,14],meant:3,hit:3,min_valu:14,get:[3,7,14,6,9],sesionmanag:3,return_dict:6,cannot:3,"_set_session_kei":3,gen:[14,6,9],requir:[3,14,2],remove_from_group:3,mapper:[14,6],enabl:[14,2,6,9],yield:[14,6,9],across:3,stuff:7,common:[2,9],save_session_object:9,delete_async:14,set:[2,3,6,9,7,14],creator:6,on_open:2,model_inst:14,see:[3,14,9],arg:[14,6,9],fail:9,close:6,setup_sess:3,statu:[3,2],extend:[3,14],databas:[3,7,14,6,9],tend:6,enough:6,"import":[3,14,2,9],awai:6,email:3,attribut:3,kei:[3,2,9],conjunct:3,entir:14,len:14,objectidfield:14,find_async:14,come:[14,9],"__unicode__":14,get_valu:14,both:6,last:3,easi:[3,14,6,9],session_model:[3,9],admin:9,similar:6,against:3,groupobj:3,etc:6,instanc:14,grain:14,context:9,logic:14,mani:[7,6],login:[3,7,9],whole:9,load:9,simpli:9,point:7,instanti:14,shortcut:3,path:6,throughout:14,backend:[0,6,5,9],flooat:[],user_id:2,evalu:14,is_superus:3,sessionmixin_async:[6,9],three:3,been:14,json:3,much:2,basic:[7,14,6],popul:2,valueerror:14,field:[3,0,14],life:7,expiry_hour:3,floatfield:14,valididti:3,togeth:14,els:[3,14,9],"case":[3,9],get_argu:9,properti:[7,14,6,9],batch:14,valud:3,defin:14,"while":[3,6],intro:[],outcom:3,abov:[14,6],error:[7,9],sessionmixin:[3,7,9],chat:2,helper:[3,0,9],readi:3,them:[3,14],itself:9,test_valu:9,"__init__":14,asyncmongobackend:6,parent:14,is_member_of:3,develop:[7,6],perform:3,alphabet:3,make:[3,7,2,6,9],belong:3,same:[3,14],member:3,embeddedmodelfield:14,html:[7,6,9],decod:3,authmanag:[3,0],set_session_kei:9,document:[3,14,6],behav:14,referenc:6,nest:14,assist:9,driver:[3,7,6,9],loginhandl:9,solut:14,sessionmanag:[3,9],rais:14,user:[3,14,2,6,9],implement:[14,6,9],expand:[7,14],task:[14,2,6,9],off:3,machineri:9,well:14,inherit:14,exampl:[3,14,6,9],thi:[2,3,6,9,7,8,14],model:[0,3,4,9,6,14],mojoauthmixin:[3,7,6,9],rout:[0,1],validate_typ:14,identifi:9,just:6,when:[3,14],userobj:3,web:[6,9],curent_us:3,expos:[14,2,6,9],also:[3,14,9],set_password:3,shoul:3,get_session_object:9,littl:14,"_get_session_kei":3,add:[3,14,6],valid:[3,14],embeddedfield:14,input:[3,14,6],har:6,save:[3,14,6,9],modul:[0,2,3,6,9,10],match:3,real:[0,13],applic:[7,9],request_handl:3,around:[14,6,9],format:6,world:[14,9],bit:6,password:[3,9],recurs:14,insert:[14,6],"_setup_connect":6,like:14,success:3,reset_sess:3,signal:2,manual:9,integ:14,server:[7,6],collect:[14,9],paramat:[3,14],either:[3,9],martin:6,output:14,is_async:6,manag:[3,0,2,9,7],underli:14,uder:3,suppli:9,some:[7,2,14],back:[14,6,9],intern:[3,14],logged_in_sess:2,librari:3,add_to_group:3,listfield:[3,14],leak:9,avoid:3,definit:[3,14],subclass:[14,7,2,6,9],usernam:[3,14,6,9],exisitng:3,refer:7,run:14,"_encode_sess":3,usag:[3,14,2,6,9],collection_nam:6,host:6,to_delet:14,"__name__":14,post:9,"super":[3,14],"throw":14,handi:7,expiri:3,socket:2,bahva:[],page:[0,1,9],commit:14,produc:14,block:[3,14,6,9],tornadio2:2,own:[3,14,6],"float":14,encod:[3,9],bound:14,automat:[3,2,9],appropri:[3,6],down:6,empti:14,expiry_minut:3,ensur:[14,6,9],bson:14,storag:14,your:[0,2,4,9,6,7,14],log:[3,2,9],wai:[14,9],support:6,"long":3,custom:14,avail:[2,6,9],start:7,handler:7,interfac:6,includ:[0,14,6],lot:7,strictli:14,"_db":[7,6],"function":[3,7,14,6,9],create_new_sess:9,delete_bulk_async:14,form:14,offer:[14,6,9],forc:6,serverhelp:[],shorter:14,pagehandl:7,"true":[3,14],reset:3,made:2,flavour:9,consist:[3,14,9],possibl:14,"default":[3,0,14,9],mojosockethandl:2,maximum:14,troubl:14,asynchron:[3,14,6,9],highlight:[],embed:[3,14],booleanfield:[3,14],emit:2,connect:[2,6],socketconnect:2,featur:9,uid:9,creat:[3,14,6,9],sesison:[3,9],"int":14,dure:6,doesn:3,repres:[3,14],current_sess:2,sockethandl:[0,2],exist:[3,14],rule:14,file:[7,6],"_is_logged_in":3,pip:6,ship:6,check:[3,14,2,9],again:3,encrypt:3,new_model_inst:14,titl:[],boot:6,new_valu:9,session_valu:9,"_decode_sess":3,other:[14,6],bool:14,rememb:2,test:6,you:[3,7,2,6,14],pymongo:[14,6],mongodb:[14,6],asyncmongo_backend:6,thishandl:6,track:3,establish:14,delete_bulk:14,session_data:3,"_create_new_sess":[3,9],session_id:[3,2,9],klass:14,time:[3,0,11],hello:[14,9],prototyp:6},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method","4":"py:attribute","5":"py:classmethod"},titles:["Mojo - a framework for Tornado","Routing pages with URL&#8217;s","Mojo.SocketHandlers","Mojo.Auth","Using the ORM and Models in your apps","Using the Mojo backends","Mojo.Backends","Mojo.RequestHandlers","An introduction to Mojo","Mojo.Auth.Mixins","Using Mojo&#8217;s Auth module","Quickstart: Using Mojo for the first time","What are apps","Real Mojo: SocketIO","Mojo.ObjectMapper"],objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"],"4":["py","attribute","Python attribute"],"5":["py","classmethod","Python class method"]},filenames:["index","docs/urls","docs/api/SocketHandlers","docs/api/Auth","docs/models","docs/backends","docs/api/Backends","docs/api/RequestHandlers","docs/intro","docs/api/Mixins","docs/authentication","docs/quickstart","docs/apps","docs/socketio","docs/api/ObjectMapper"]})
+Search.setIndex({objects:{"Mojo.Auth.SessionManager":{Reset_session:[3,1,1,""],Setup_session:[3,1,1,""],SessionManager:[3,2,1,""]},"Mojo.Backends":{base_interface:[6,0,1,""]},"Mojo.Auth.Mixins.MojoAuthMixin":{MojoAuthMixin:[8,2,1,""]},"Mojo.ObjectMapper":{FieldPrototype:[13,0,1,""],Fields:[13,0,1,""]},"Mojo.ObjectMapper.ModelPrototype":{EmbeddedModelField:[13,2,1,""],Model:[13,2,1,""]},"Mojo.ObjectMapper.FieldPrototype":{Field:[13,2,1,""]},"Mojo.SocketHandlers.BaseSocketHandler":{MojoSocketHandler:[2,2,1,""]},"Mojo.ObjectMapper.Fields.ObjectIDField":{base_type:[13,4,1,""]},"Mojo.Backends.base_interface.CollectionModelInterface":{find_one:[6,3,1,""],insert:[6,3,1,""],save:[6,3,1,""],find:[6,3,1,""],"delete":[6,3,1,""]},"Mojo.Auth.Mixins":{MojoAuthMixin:[8,0,1,""]},"Mojo.ObjectMapper.Fields.BooleanField":{get_value:[13,3,1,""],base_type:[13,4,1,""]},"Mojo.ObjectMapper.FieldPrototype.Field":{validate:[13,3,1,""],get_value:[13,3,1,""],validate_type:[13,3,1,""],validate_is_null:[13,3,1,""]},"Mojo.Auth.SessionManager.SessionManager":{"_get_session_key":[3,3,1,""],"_decode_session":[3,3,1,""],"_set_session_key":[3,3,1,""],"_is_session_valid":[3,3,1,""],get_session_cookies:[3,3,1,""],"_logout":[3,3,1,""],"_is_logged_in":[3,3,1,""],"_login":[3,3,1,""],"_encode_session":[3,3,1,""],"_create_new_session":[3,3,1,""]},"Mojo.ObjectMapper.Fields.FloatField":{base_type:[13,4,1,""]},"Mojo.Auth.AuthManager":{authenticate:[3,1,1,""],remove_from_group:[3,1,1,""],make_random_password:[3,1,1,""],login:[3,1,1,""],is_member_of:[3,1,1,""],set_password:[3,1,1,""],add_to_group:[3,1,1,""]},"Mojo.ObjectMapper.Fields.ListField":{base_type:[13,4,1,""]},"Mojo.ObjectMapper.Fields.IntegerField":{base_type:[13,4,1,""]},"Mojo.Auth.Helpers":{login_assistant:[3,1,1,""],logout_assistant:[3,1,1,""]},"Mojo.ObjectMapper.Fields":{DateTimeField:[13,2,1,""],ListField:[13,2,1,""],IntegerField:[13,2,1,""],StringField:[13,2,1,""],FloatField:[13,2,1,""],ObjectIDField:[13,2,1,""],BooleanField:[13,2,1,""]},"Mojo.Auth.Mixins.SessionMixins.SessionMixin_Async":{get_session_key:[8,3,1,""],set_session_key:[8,3,1,""],get_session_object:[8,3,1,""],session:[8,4,1,""],get_user_from_db:[8,3,1,""],save_session_object:[8,3,1,""],create_new_session:[8,3,1,""]},"Mojo.ObjectMapper.Fields.StringField":{base_type:[13,4,1,""]},"Mojo.ObjectMapper.Fields.DateTimeField":{base_type:[13,4,1,""]},"Mojo.SocketHandlers":{BaseSocketHandler:[2,0,1,""]},"Mojo.Auth.Mixins.SessionMixins.SessionMixin_Sync":{get_session_key:[8,3,1,""],set_session_key:[8,3,1,""],get_session_object:[8,3,1,""],session:[8,4,1,""],get_user_from_db:[8,3,1,""],save_session_object:[8,3,1,""],create_new_session:[8,3,1,""]},"Mojo.Auth.models":{Profile:[3,2,1,""],Session:[3,2,1,""],Group:[3,2,1,""],User:[3,2,1,""]},"Mojo.Auth":{models:[3,0,1,""],Helpers:[3,0,1,""],AuthManager:[3,0,1,""],SessionManager:[3,0,1,""]},"Mojo.Auth.Mixins.SessionMixins":{SessionMixin_Async:[8,2,1,""],SessionMixin_Sync:[8,2,1,""]},"Mojo.RequestHandlers.MojoHandler":{MojoRequestHandler:[7,2,1,""]},"Mojo.ObjectMapper.ModelPrototype.EmbeddedModelField":{base_type:[13,4,1,""]},"Mojo.ObjectMapper.ModelPrototype.Model":{validate:[13,3,1,""],insert:[13,5,1,""],delete_bulk:[13,5,1,""],delete_bulk_async:[13,5,1,""],find_one:[13,5,1,""],insert_async:[13,5,1,""],get_value:[13,3,1,""],find_one_async:[13,5,1,""],save_async:[13,3,1,""],find_async:[13,5,1,""],save:[13,3,1,""],delete_async:[13,3,1,""],find:[13,5,1,""],"delete":[13,3,1,""]},"Mojo.Backends.base_interface":{CollectionModelInterface:[6,2,1,""],SessionInterface:[6,2,1,""]},"Mojo.RequestHandlers":{MojoHandler:[7,0,1,""]},"Mojo.Auth.Mixins.MojoAuthMixin.MojoAuthMixin":{get_current_user:[8,3,1,""]}},terms:{represent:[3,13],all:[2,3,6,7,10,13],code:0,chain:13,osx:10,queri:[3,13],global:2,managem:8,runserv:10,abil:0,follow:[10,6],content:0,decid:6,depend:[3,13],current_us:[3,8],mojorequesthandl:[7,6,8],base64:3,friendli:13,init:3,collectionmodelinterfac:6,get_user_from_db:8,under:13,base_typ:13,digit:3,sourc:13,everi:[3,7],string:[3,13],straightforward:8,fals:[3,13,6],on_messag:2,this_us:6,affect:10,strang:10,cool:7,hous:10,list:[3,13,6],"try":[13,6],item:13,cooki:[3,2,8],tru:3,round:3,direct:[7,6],design:[3,6,8],pass:2,download:10,bake:0,port:[10,6],compat:8,index:0,what:[10,0,13,6,11],this_field:13,section:[3,10],abl:[10,6],"while":[3,6],current:[3,6,8],delet:[13,6],"_get_valu":13,last_login:3,modelprototyp:[13,6],helloworldapp:10,"new":[0,3,6,8,10,13],ascii:3,method:[3,13,8],full:[13,8],gener:[3,2],here:[10,13,2],behaviour:13,met:13,let:[10,13],address:3,socketconnectionhandl:2,valu:[3,13,8],login_assist:[3,8],search:0,base_interfac:6,mojo_set:7,reason:6,host:6,datetim:13,orm:[0,13,4,8],make_random_password:3,another_field:13,chang:[3,10,13,6],via:[6,8],appli:3,app:[10,0,4,11],prefer:8,is_authent:3,schemaless:13,api:0,instal:[3,0,10,6],coercion:13,unit:10,mongo:[3,13],from:[0,2,3,6,8,10,13],describ:6,would:13,stringfield:13,two:[13,2,6,8],date_join:3,next:8,sessionobj:3,find_one_async:[13,6],call:[3,13,2,6],usr:10,recommend:[10,6],msg:2,expiri:3,type:[10,0,13],start:[10,0,7],minor:6,more:[3,7,10,13],to_insert:13,alphabet:3,function_nam:6,flag:3,indic:[3,0],hold:8,basesockethandl:2,must:13,none:[2,3,6,8,7,13],endpoint:2,join:3,hour:3,socketio:[0,12],alia:13,setup:[10,0,2,6],work:[10,8],itself:8,can:[0,2,3,6,7,10,13],sessionmixin_sync:[7,8],purpos:[13,8],root:10,def:[13,7,2,6,8],overrid:[13,2,6,8],"_is_session_valid":3,favourit:10,quickstart:[10,0],objectid:[3,13],give:[10,7],process:3,insert_async:13,templat:[10,0,6,8],minimum:13,want:[3,7,10,13],onlin:2,keep:10,blog_app:10,multipl:[3,13],secur:[3,8],anoth:[3,10,2],write:[0,6],how:3,instead:[7,6,8],simpl:[13,2,8],this_session_valu:8,map:13,overridden:13,mojo_blog:10,after:3,variant:13,them:[3,13],befor:13,mac:10,socket:2,mixin:[3,0,8,7],retain:6,mai:10,end:[13,6],associ:6,essenti:[3,6],third:0,classmethod:13,explicit:13,validate_is_nul:13,django:0,callback:8,maintain:3,allow:[3,13],enter:10,order:[3,6],least:6,help:3,allow_empti:13,familli:8,through:[3,7,6],flexibl:0,mainli:[3,13],whatever_field:13,paramet:[3,13,6],snippet:6,style:[13,6,8],group:[3,10],render:[7,6,8],nifti:8,chosen:[3,13],"__class__":13,relev:[3,10,13,6],window:10,html:[7,6,8],mytestmodel:13,persist:[3,8],depopul:2,main:[3,10,13,8],alter:0,finer:13,non:[3,13,6,8],"return":[3,13,6,8],thei:[10,7,13,8],python:10,encod:[3,8],safe:6,dai:3,auth:[0,2,3,6,8,9],"break":10,framework:[3,0,2,13],db_name:6,funciton:8,now:13,introduct:[],name:[3,6],valud:3,authent:[3,0,8],easili:[10,6],exampl:[3,13,6,8],each:[10,13,8],debug:[10,0],fulli:[10,6,8],unicod:13,mean:13,individu:10,ensur:[10,13,6,8],"static":10,expect:[13,6],mojo_manag:10,our:13,event:2,out:[3,10,13],variabl:[7,13,8],ictionari:[],shown:13,accomplish:[3,10],typecast:13,influenc:0,profil:3,rewrit:6,print:[13,6],correct:13,common:[2,8],navig:10,state:3,manipul:3,standard:[13,7,2,8],quick:[10,0,8],on_clos:2,base:[0,2,3,6,8,10,13],dictionari:[13,2,6],basi:0,projct:10,acquaint:0,get_session_cooki:3,delete_async:13,omit:13,synchron:[3,8],success:3,static_url:10,initialis:[3,8],datetimefield:[3,13],thing:[3,13],length:13,place:10,router:10,my_data:13,bakend:[],assign:[13,6,8],first:[10,0,6,8],oper:[13,8],directli:[3,10,13],onc:[3,10],dure:6,independ:10,sessioninterfac:6,date:[3,10],unlik:13,alreadi:8,done:10,wrapper:[6,8],blank:3,installed_app:10,open:10,mojo:[0,2,3,6,5,7,8,9,10,12,13],hood:13,differ:[10,13,6],convent:0,projectnam:10,data:[0,2,3,6,8,13],interact:6,linenothreshold:[],system:[3,0],messag:2,tradition:13,max_length:13,similarli:8,logged_in:[3,2,8],conveni:2,store:[3,13,2,8],schema:6,adher:6,option:[3,13],asyncmongo:6,namespac:13,tool:[3,6],broadcast:2,sraightforward:6,part:[3,13,6,8],accompani:3,"_logout":3,termin:10,than:13,png:10,machineri:8,serv:7,target:8,provid:[3,8],remov:[3,13],requesthandl:[3,0,8,7],logout_assist:3,structur:[10,0,13],charact:[3,13],project:[10,0,6,7],expiry_dai:3,mojohandl:[7,8],minut:3,treanslat:6,seri:[3,10],save_async:13,well:13,validate_max_length:13,is_member_of:3,ani:[3,7,6,8],find_on:[3,13,6,8],raw:13,expir:3,have:[10,13,6,8],tabl:[10,0],need:[3,0,10,13,7],"_async":6,objectmapp:[0,13,6],engin:[6,8],built:[10,13],thisus:[3,13,8],inform:[3,6,8],self:[2,3,6,8,7,13],note:[10,13],mix:3,discret:10,take:[3,10,13,6,8],which:[13,6,8],bcrypt:[3,10],singl:13,uppercas:3,ioloop:10,sure:[10,6],distribut:10,integerfield:13,get_current_us:[3,8],tornado:[0,3,6,8,7,10],"504e0439a9ee2f04a0835a92":3,subtyp:13,most:[],regular:[6,8],automodul:[],deploi:10,"class":[2,3,6,8,7,13],tradit:6,don:[0,7],url:[10,0,1,7],"_return_model_object":6,request:[3,7,10,2,8],wtform:[10,0],doe:3,declar:7,prettier:0,determin:3,"_id":3,dot:13,max_valu:13,text:13,"__str__":13,random:3,new_sess:3,session:[0,2,3,6,8,7,10],get_session_kei:8,"_login":3,fine:13,find:[0,13,6],make:[0,2,3,6,8,7,10],redirect:8,access:[10,7,13,6,8],onli:[3,2,6],coerc:13,locat:10,activ:3,written:6,should:[3,10,13,8],dict:[3,13],folder:10,meant:3,reset:3,hit:3,min_valu:13,variou:10,get:[0,3,6,8,7,10,13],familiar:0,sesionmanag:3,solut:13,return_dict:6,cannot:3,"_set_session_kei":3,gen:[13,6,8],requir:[3,10,2,13],remove_from_group:3,mapper:[13,6],enabl:[13,0,2,6,8],yield:[13,6,8],email:3,stuff:7,integr:[3,0,13,6],contain:[10,13],where:10,view:10,set:[0,2,3,6,8,7,10,13],creator:6,on_open:2,model_inst:13,see:[3,0,10,13,8],arg:[13,6,8],fail:8,close:6,setup_sess:3,statu:[3,2],kei:[3,0,2,8],helper:[3,0,10,8],databas:[0,3,6,8,7,10,13],someth:10,tend:6,enough:[10,6],"import":[3,10,13,2,8],awai:[10,6],across:3,attribut:3,ui_modul:10,extend:[3,0,13],conjunct:3,nbame:10,entir:13,len:13,objectidfield:13,find_async:13,come:[13,8],"__unicode__":13,get_valu:13,both:6,last:3,expos:[13,2,6,8],session_model:[3,8],admin:8,booleanfield:[3,13],howev:10,against:3,groupobj:3,etc:6,tutori:10,grain:13,context:8,logic:13,mani:[7,6],eth:10,whole:8,load:[10,8],simpli:[10,8],point:7,instanti:13,littl:13,suppli:8,path:[10,6],typic:10,guid:0,backend:[0,6,5,8],flooat:[],user_id:2,creat:[3,10,13,6,8],is_superus:3,sessionmixin_async:[6,8],three:3,been:13,json:3,much:2,basic:[7,13,6],popul:[0,2],valueerror:13,life:7,imag:10,expiry_hour:3,floatfield:13,valididti:3,togeth:13,input:[3,13,6],"case":[3,8],look:10,get_argu:8,packag:10,properti:[7,13,6,8],batch:13,easier:[3,7],defin:13,invok:10,sockethandl:[10,0,2],outcom:3,abov:[13,6],error:[7,8],login:[3,7,8],real:[0,12],sessionmixin:[3,7,8],file:[10,7,6],advantag:[10,13,8],readi:3,"_is_logged_in":3,site:[10,2],kwarg:[7,13,6,8],lightweight:0,test_valu:8,"__init__":13,around:[13,6,8],parent:13,"null":13,develop:[0,6,7],welcom:10,perform:3,parti:0,new_password:3,belong:3,same:[3,13],member:3,embeddedmodelfield:13,instanc:13,decod:3,authmanag:[3,0],set_session_kei:8,document:[3,13,6],behav:13,session_valu:8,http:10,referenc:[10,6],nest:13,assist:8,driver:[3,7,6,8],loginhandl:8,decompress:10,sessionmanag:[3,8],rais:13,user:[2,3,6,8,10,13],implement:[0,13,6,8],expand:[7,13],lib:10,task:[13,2,6,8],off:[3,0],gloabl:10,fieldprototyp:13,inherit:13,without:[10,0,13,6,8],client:2,command:10,thi:[2,3,6,8,7,10,13],model:[0,3,4,8,6,10,13],mojoauthmixin:[3,7,6,8],rout:[0,1],validate_typ:13,identifi:8,just:6,boot:6,modular:0,userobj:3,heavili:0,uid:8,web:[10,6,8],curent_us:3,easi:[3,0,13,6,8],also:[3,13,8],recurs:13,shoul:3,get_session_object:8,usernam:[3,13,6,8],shortcut:3,"_get_session_kei":3,add:[3,0,13,6],other:[10,0,13,6],embeddedfield:13,els:[3,13,8],har:6,save:[3,10,13,6,8],modul:[0,2,3,6,8,9,10],match:3,build:0,bin:10,applic:[10,7,8],request_handl:3,asyncmongobackend:6,format:6,amp:10,bit:6,password:[3,8],set_password:3,python2:10,linux:10,insert:[13,6],"_setup_connect":6,like:[10,13],specif:[3,13,2,6,8],reset_sess:3,signal:2,manual:8,integ:13,server:[10,7,6],collect:[13,8],paramat:[3,13],either:[3,8],martin:6,output:[0,13],is_async:6,manag:[0,2,3,8,7,10],underli:13,login_assit:3,uder:3,creation:0,some:[0,2,13,7],back:[13,6,8],intern:[3,13],logged_in_sess:2,librari:3,add_to_group:3,virtualenv:10,throughout:13,listfield:[3,13],leak:8,avoid:3,definit:[3,10,13],subclass:[13,7,2,6,8],save_session_object:8,exisitng:3,localhost:10,refer:7,object:[3,7,13,6,8],run:[10,13],"_encode_sess":3,usag:[3,13,2,6,8],collection_nam:6,step:10,to_delet:13,found:10,"__name__":13,post:8,"super":[3,13],"throw":13,handi:7,simpler:2,sbin:10,zip:10,world:[13,8],bahva:[],page:[10,0,1,8],includ:[0,13,6],commit:13,produc:13,block:[3,13,6,8],tornadio2:[10,0,2],own:[3,0,13,6],"float":13,som:13,bound:13,automat:[3,10,2,8],appropri:[3,10,6],down:[10,6],empti:13,expiry_minut:3,wrap:8,bson:13,bool:13,storag:13,your:[0,2,4,8,6,7,10,13],log:[3,2,8],wai:[10,13,8],area:10,support:[10,0,6],"long":3,custom:13,avail:[10,2,6,8],strict:13,handler:[10,7],interfac:6,editor:10,lot:7,strictli:13,"_db":[7,6],asset:10,"function":[0,3,6,8,7,10,13],create_new_sess:8,delete_bulk_async:13,form:[0,13],offer:[10,13,6,8],forc:6,serverhelp:[],shorter:13,pagehandl:7,line:10,"true":[3,13],congratul:10,info:10,made:[10,2],flavour:8,consist:[3,13,8],possibl:13,"default":[3,0,13,8],mojosockethandl:2,maximum:13,troubl:13,asynchron:[3,13,6,8],opein:10,highlight:[],embed:[3,13],similar:6,emit:2,connect:[2,6],socketconnect:2,featur:[0,8],alongsid:[3,8],evalu:13,sesison:[3,8],"int":13,retriev:13,"abstract":6,doesn:3,repres:[3,13],current_sess:2,intro:[],exist:[3,13],session_id:[3,2,8],chat:2,logo:10,pip:6,ship:6,check:[3,13,2,8],again:3,encrypt:3,new_model_inst:13,titl:[],when:[3,10,13],new_valu:8,field:[3,0,13],"_decode_sess":3,valid:[3,13],lookup:3,rememb:2,test:[10,6],you:[0,2,3,6,7,10,13],pymongo:[13,6],roll:0,mongodb:[13,6],asyncmongo_backend:6,thishandl:6,scale:0,track:3,establish:13,veri:0,delete_bulk:13,session_data:3,"_create_new_sess":[3,8],directori:10,rule:13,klass:13,time:[3,0,10],mynewproject:10,tornadio:10,hello:[13,8],prototyp:6},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method","4":"py:attribute","5":"py:classmethod"},titles:["Mojo - a framework for Tornado","Routing pages with URL&#8217;s","Mojo.SocketHandlers","Mojo.Auth","Using the ORM and Models in your apps","Using the Mojo backends","Mojo.Backends","Mojo.RequestHandlers","Mojo.Auth.Mixins","Using Mojo&#8217;s Auth module","Quickstart: Using Mojo for the first time","What are apps","Real Mojo: SocketIO","Mojo.ObjectMapper"],objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"],"4":["py","attribute","Python attribute"],"5":["py","classmethod","Python class method"]},filenames:["index","docs/urls","docs/api/SocketHandlers","docs/api/Auth","docs/models","docs/backends","docs/api/Backends","docs/api/RequestHandlers","docs/api/Mixins","docs/authentication","docs/quickstart","docs/apps","docs/socketio","docs/api/ObjectMapper"]})
View
23 Documentation/docs/apps.rst
@@ -1,3 +1,22 @@
-What are apps
-=============
+Mojo Apps
+=========
+
+When developing with Mojo, it's more elegant to modularise functionality into Apps, and this is the default behaviour
+of the Mojo server loader.
+
+Apps serve as a collection of RequestHandlers, URL Mappings, Models and Templates that make up a set of functionality
+in your project.
+
+To get started with an app in your project, you can use the ``mojo_manager.py`` helper application that will auto create
+your project folder for you::
+
+ python mojo_manager.py -a [YOUR_APP_NAME]
+
+This will create an app folder with certain key files:
+
+- ``models.py``: This is where you define your models which can be used with your database and forms
+- ``socket_handlers.py``: This is where you define your SocketIO behaviour, each app has it's own dedicated (multiplexed) channel under ``/[appname]Socket`` to separate out functionality
+- ``ui_modules.py``: The ui_modules you might or mihjgt not be using
+- ``urls.py``: The URL mappings for your request handlers
+- ``views.py``: A list of your ``RequestHandler`` classes that handle your app functionality
View
4 Documentation/docs/intro.rst
@@ -1,4 +0,0 @@
-An introduction to Mojo
-=======================
-
-This is the introduction
View
145 Documentation/docs/models.rst
@@ -1,3 +1,144 @@
-Using the ORM and Models in your apps
-=====================================
+The Mojo ORM and Models
+=======================
+
+To make working with databases easier, and to ensure a consistent set of tools when saving and moving data, Mojo
+uses models to define validation and data structures, and then uses these to set up how data will look in the database.
+
+Currently, Mojo only supports MongoDB, but we are hoping to add support for Redis and CouchDB soon. We actively encourage
+contributors, so anyone feeling the urge to help us write a new backend for their favourite datastore can drop us a line
+in our Google Group.
+
+What are Models?
+----------------
+
+For anyone familiar with Django, Mojo Models will seem very similar, and take heavy influence from the framework. Models
+are a way for you to organise and structure your data as python objects so you can transparently use them (without a
+data store) in your application.
+
+Models are very simple - they are a defined class, with a series of fields that you can use to represent your data and the
+various validation methods you would like run against those fields before the object is written to the database.
+
+Why Models?
+-----------
+
+Because our first database to support was MongoDB, it became apparent that what was really missing was a good way to
+enforce structure and a certain degree of validation on stored data. Being Schema-less, it becomes very easy to not
+validate stored input due to the extra burden of writing the validation code, as well as not manging schema evolutions
+as schemas change over the lifecycle of your project.
+
+Models make this process easiewr by pre-defining data types, relations and object properties prior to saving, while exposing
+all the benefits of having a neat python object to represent your data set without resporting to direct database access.
+
+Do I have to use Models?
+------------------------
+
+Not at all, you can completely ignore the ORM and model structure in your project and directly access your database using your
+favourite driver.
+
+Using Models
+============
+
+To implement a model for your app, simply define it in the ``models.py`` file in your app directory::
+
+ from Mojo.ObjectMapper.ModelPrototype import Model
+ from Mojo.ObjectMapper.Fields import *
+ import datetime
+
+ #This is a non-database class, not stored in the DB but embedded in the BlogPost class below
+ #the key difference is the lack of an _id field
+ class Tag(Model):
+ tag_name = StringField()
+
+ #a simple model to hold blog posts
+ class BlogPost(Model):
+ _id = ObjectIDField()
+ title = StringField(allow_empty=False)
+ slug = StringField(allow_empty=False)
+ post_intro = StringField()
+ post_body = StringField()
+ date_published = DateTimeField(default=datetime.datetime.now())
+ tags = ListField(of=Tag)
+ visible = BooleanField(default=True)
+
+In the above example we've defined two models, the first ``Tag`` model is a straightforward class that is **not** a database object
+the key distinction here is the lack of the ``_id`` field (this is only relevant to the MongoDB backend as it requires an ID to be
+explicitly defined).
+
+The second model ``BlogPost`` is the real model, and lists a series of fields to represent data types, fields can be anything, so
+long as they subclass the ``Mojo.ObjectMapper.FieldPrototype.Field`` object.
+
+Accessing model data
+^^^^^^^^^^^^^^^^^^^^
+
+You can access the above model quite easily in your code::
+
+ new_minimal_post = BlogPost({
+ 'title':u'a new post',
+ 'slug' : 'newpost'
+ })
+
+ #access some properties
+ print new_minimal_post.title
+ > a new post
+
+ #save it (assuming synchronous DB backend):
+ thispost = new_minimal_post.save()
+
+ print thispost._id
+ > 50571e5f3d941cdc4487bdf1
+
+Models can be assigned data in dictionary format as part of their initialisation, or empty and then using dot-notation
+for each of their properties. So, in the example above, the following would work just as well::
+
+ new_minimal_post = BlogPost()
+ new_minimal_post.title = u'a new post'
+ new_minimal_post.slug = 'newpost'
+
+ #access some properties
+ print new_minimal_post.title
+ > a new post
+
+ #save it (assuming synchronous DB backend):
+ thispost = new_minimal_post.save()
+
+ print thispost._id
+ > 50571e5f3d941cdc4487bdf1
+
+``Model`` objects are dictionaries, so if you print out or access them in any way, they should behave in the same way as a
+stamdard python ``dict`` object.
+
+Saving, Updating, Finding and Deleting
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Saving is very straightforward in mojo, and as can be seen from the example above, can easily be accomplished with the ``save()``
+instance method.
+
+The main read/write operations of a model are as follows:
+
+- ``save()``: Called on an instance of the model, this will attempt to save the data to the database, if the object has an initialised ``_id`` value then it will be updated, otherwise it will perform an insert
+- ``delete()``: Called on an instance of the model, thjis will delete it from the database
+- ``find()``: Called on the Model object (class method), will use the criteria passed to find to return a list of instantiated model instances
+- ``find_one()``: Called on the model object (class method), will use the criteria passed to find a single model object
+- ``delete_bulk([list])``: Pass a list of objects ot this function for a bulk delete operation
+
+Both the ``find()`` and ``find_one()`` operations take MongoDB style ``dict`` objects as request parameters and follow the pymongo style of queries.
+
+Asynchronous operations
+^^^^^^^^^^^^^^^^^^^^^^^
+
+One of the most appealing aspects of Tornado is it's ability to work asynchronously, and Mojo takes that to heart, ensuring taht you can just as well
+use the asynchronous style of development with the ORM and Models.
+
+To use the Asynchronous driver, make sure that you have changed it in your ``settings.py`` file::
+
+ DATABASE = {
+ 'backend': 'Mojo.Backends.AsyncmongoBackend.asyncmongo_backend',
+ 'name': 'YOUR_DB_NAME',
+ 'host': '127.0.0.1',
+ 'port': 27017
+ }
+
+To start using it in your code, all models make an ``_async`` version of all operations available, that can be used with
+traditional callback-style async handling or Tornado's ``gen`` module style (for more readable code)::
+
View
99 Documentation/docs/quickstart.rst
@@ -1,3 +1,102 @@
Quickstart: Using Mojo for the first time
=========================================
+This is a quick-start tutorial that will get you set up and running with Mojo for the first time.
+
+Installation
+------------
+
+1. Download the Mojo distribution
+2. Decompress the zip file
+3. Make sure you have installed the required support packages: ``Tornado``, ``TornadIO2``, ``bcrypt`` and ``wtforms``
+4. From the command line in the new folder run ``python setup.py install``
+
+This should install Mojo into your python path. However, there is one more step that you may need to do to fully
+take advantage of Mojo's helper apps, and that is to make ``mojo_manager`` available in your ``PATH``, for linux and Mac OSX users,
+this can be accomplished by doing something like::
+
+ ln /usr/bin/python2.7/Lib/site-packages/Mojo/mojo_manager.py /usr/sbin/mojo_manager.py
+ chmod +x /usr/sbin/mojo_manager.py
+
+On windows, adding the Mojo site-packages directory should be enough to give gloabl access to ``mojo_manager``
+
+Once you've done that, you should be able to test your installation by opeining a python window and typing::
+
+ import Mojo
+
+If there are no import errors then you shoulod be ready to get started.
+
+*Note:* It is recommended to deploy Mojo in something like virtualenv to ensure you can easily keep it (and your app)
+up to date without affecting your main Python setup and other projects.
+
+Your first project
+------------------
+
+Mojo sets up it's projects as a project folder that contains a series of Apps, these apps are independent from one another
+and offer a way to group different functional areas of your app away into discrete units. The typical Mojo project will have a
+folder structure that looks like::
+
+ --[ProjectName]
+ ----[static]
+ ----[Apps]
+ ------[App 1]
+ --------[templates]
+ --------models.py
+ --------ui_modules.py
+ --------urls.py
+ --------views.py
+ ------[App 2]
+ ------[App 3]
+ ----settings.py
+ ----runserver.py
+
+A quick run down of what each of these files and folders are:
+
+* ``[ProjectName]``: Your projct folder, this houses all the apps, modules settings and server for your tornado project
+* ``[static]``: All your static assets can be placed in here and they will be referenced automatically when you use the ``static_url("images/logo.png")`` built in tornado function
+* ``[Apps]``: Houses all of your individual apps, these break down into a series of base files that make your app work:
+
+ * ``[App 1]/models.py``: This is your model definition file, here you set out what database tables you want to use
+ * ``[App 1]/ui_modules.py``: Your UI Modules for Tornado are housed here, these are automatically loaded so they can be used directly from your templates
+ * ``[App 1]/urls.py``: The URL's for this app, ampping to the relevant Request Handlers
+ * ``[App 1]/views.py``: The request handlers that will manage the various app's functions
+
+* ``settings.py``: All the settings for your application
+* ``runserver.py``: This, strangely enough, runs your web server
+
+To create your first app, you simply need to invok ethe mojo_manager application,
+this will create your project folder as follows::
+
+mojo_manager.py -p MyNewProject
+cd MyNewProject
+mojo_manager.py -a HelloWorldApp
+
+That's it, all the files you need to get started should be created and in nbamed appropriately.
+
+Setup the App
+-------------
+
+To get started, lets set up your settings.py to get your first server up and running. Open ``settings.py`` in your favourite editor
+and make sure the ``INSTALLED_APPS`` section looks like this::
+
+ INSTALLED_APPS = [
+ 'HelloWorldApp',
+ ]
+
+Once you've made the change, simply save the file and open up your terminal window in the directory where ``runserver.py`` is located, then
+type the following::
+
+ python runserver.py
+
+You should see::
+
+ Starting Mojo tornado server.
+ DEBUG:root:Setting up url routers:
+ DEBUG:root:--Added URL's for: blog_app
+ DEBUG:root:--Adding UI Modules for blog_app
+ DEBUG:root:--Added SocketHandler for: blog_app
+ DEBUG:root:Found DATABASE setting - creating session for DB: mojo_blog
+ INFO:root:Starting up tornadio server on port '8001'
+ INFO:root:Entering IOLoop...
+
+If you navigate to ``http://localhost:8000`` you should see the Mojo welcome page. *Congratulations, you are running Mojo!*
View
65 Documentation/docs/views.rst
@@ -0,0 +1,65 @@
+Mojo Views
+==========
+
+Mojo views are where you will write most of your application and page handling logic. In the ``views.py`` file, you will
+sub-clas the MojoRequestHandler class to create your application.
+
+The MojoRequestHandler is a slightly modified version of the basic Tornado RequestHandler that makes the local templates available to
+the interpreter and adds support for prettier error formatting, it is also required to make the ``SessionMixin`` and ``AuthMixin``
+classes to work as they depend on the ``MojoRequestHandler`` base class.
+
+*Note:* It completely possible to develop with Mojo using standard ``equestHandlers``, simply subclass them as you would normally
+and use them in your ``urls.py``
+
+Views Quick-start:
+------------------
+
+To write your first view, subclas the MojoRequestHandler class, type thi into your view handler::
+
+ from Mojo.RequestHandlers.MojoHandler import MojoRequestHandler
+
+ class HelloWorldHandler(MojoRequestHandler):
+ def get(self, *args, **kwargs):
+ self.render('hello.html')
+
+And then mak sure it is accessible in your ``urls.py`` file::
+
+ from views import *
+
+ urlpatterns = [
+ #Place your URL Routes / RequestHandler mappings in here for this app, e.g.
+ ('/', HelloWorldHandler),
+ ]
+
+You will also need to actually create the template file, ``hello.html``, it could lok somwthing like this::
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+ <html>
+ <head>
+ <title>Hello from Mojo!</title>
+ </head>
+ <body>
+ <h1>Hi there, I'm a template inside Mojo!</h1>
+ <p>This is a tempalte file that is stored in your apps template directory.</p>
+ </body>
+ </html>
+
+Save this file to your app ``templates`` directory and make sure that your app is listed in the ``settings.py`` ``INSTALLED_APPS``
+ setting::
+
+ INSTALLED_APPS = [
+ 'HelloWorldApp',
+ ]
+
+Now you just need to run your server, in a command line window, in your project directory type::
+
+ python runserver.py
+
+If your server is already running, and you have ``DEBUG=True`` set in your ``settings.py`` file, it should automatically restart when you save
+the above changes.
+
+When you navigate to ``http://localhost:8000/`` you should see your template being rendered out...
+
+The MojoRequestHandler behaves the same way as the Tornado request handler, we recommend the reader check the Tornado documentation
+to get fully up to speed with what the capabilities are of ``RequestHandler`` objects.
View
20 Documentation/index.rst
@@ -6,15 +6,33 @@
Mojo - a framework for Tornado
==============================
+Mojo is a framework that makes it easy and quick to build Tornado projects that scale.
+
+Some key features of Mojo:
+
+- A lightweight and flexible ORM that makes developing easy
+- ORM is based off a 'backend' system, enabling you to write your own backend and extend the ORM to other databases without altering your code
+- Authentication and session mixins so you don't need to roll-your-own implementation or third parties
+- Integration with wtForms, with the ability to use your Models as Forms and to populate models from Form data
+- Modular structure so you can add functionality to your project on an app by app basis
+- Prettier debugging output
+- SocketIO support baked in with TornadIO2
+- Project and app-creation templates that make it easy to set up new projects
+
+The project is heavily influenced by Django, developers familiar with django will find some of the conventions in Mojo
+very familiar.
+
+To get acquainted with Mojo and get started, see the quick-start guide.
+
Contents:
---------
.. toctree::
:maxdepth: 2
- docs/intro.rst
docs/quickstart.rst
docs/apps.rst
+ docs/views.rst
docs/urls.rst
docs/models.rst
docs/backends.rst
View
6 Mojo/ServerHelpers/RunServer.py
@@ -101,12 +101,14 @@ def init_run_server(ProjectModule):
routes.extend(urls.urlpatterns)
logging.debug("--Added URL's for: %s" % (appName))
+ loaded_ui_modules_list = []
for appName in project_settings.INSTALLED_APPS:
logging.debug("--Adding UI Modules for %s" % appName)
ui_module_string = 'from Apps.%s import ui_modules' % (appName)
exec(ui_module_string)
- ui_modules = ui_modules
+ #TODO: This won't work with multiple apps, as it is only imported once!!
+ loaded_ui_modules_list.append(ui_modules)
thisSocketRouter = setup_socket_handler_routers(module_name, project_settings.INSTALLED_APPS)
@@ -123,7 +125,7 @@ def init_run_server(ProjectModule):
BACKEND_COLLECTION = Collection
- application = DynaMojoTornadoApplication(project_settings, thisSocketRouter, routes, ui_modules, db_session)
+ application = DynaMojoTornadoApplication(project_settings, thisSocketRouter, routes, loaded_ui_modules_list, db_session)
application.listen(project_settings.LISTEN_PORT)
tornadio2.SocketServer(application)

0 comments on commit a05548a

Please sign in to comment.
Something went wrong with that request. Please try again.