micro(lightweight) django
TRANSCRIPT
![Page 1: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/1.jpg)
Micro Djangoor Lightweigth
![Page 2: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/2.jpg)
Background
![Page 3: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/3.jpg)
Django vs Flaskbottle
~14K ★★★★★★★★★★★★★★
~13K ★★★★★★★★★★★★★
ORM poo !!!
Templates poo !!!
38 Mb (25 Mb contrib)70K SLOC
1.4 + 1.8 + 1.8 Mb (7.5 orm)6 + 9 + 10 K SLOC (+ 50 orm
request and app context
![Page 4: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/4.jpg)
Django Micro?
![Page 5: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/5.jpg)
Structurelessmanage.py
if __name__ == "__main__":
os.environ.setdefault( "DJANGO_SETTINGS_MODULE" , "settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
![Page 6: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/6.jpg)
StructurelessЗагрузка setting(https://docs.djangoproject.com/en/1.8/topics/settings/#using-settings-without-setting-django-settings-module)
if not settings.configured:
settings.configure(
DEBUG=DEBUG,
SECRET_KEY =SECRET_KEY,
ROOT_URLCONF =__name__,
...
)
![Page 7: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/7.jpg)
Structurelessurlconf
urlpatterns = (
url(r'^$', lambda r: JsonResponse({ 'App': 'Simple’})),
)
![Page 8: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/8.jpg)
Simple appimport os
import sys
from django.conf import settings
...
if not settings.configured:
settings.configure(
ROOT_URLCONF =__name__,
...
)
urlpatterns = (url(r'^$', lambda r: JsonResponse({ 'A simple app must be' : 'simple'})),)
if __name__ == "__main__":
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
![Page 9: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/9.jpg)
OMG ORM! Failed!Traceback:..
...
django.core.exceptions.ImproperlyConfigured: Unable to detect the app label
for model "Task." Ensure that its module, "__main__", is located inside an
installed app.
![Page 10: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/10.jpg)
OMG ORM! Failed! INSTALLED_APPS =(
...
'__main__'
),
Traceback:..
...
django.core.exceptions.ImproperlyConfigured: Unable to detect the app label
for model "Task." Ensure that its module, "__main__", is located inside an
installed app.
![Page 11: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/11.jpg)
OMG ORM! Failed!execute_from_command_line -> django.setup()
if not settings.configured:
settings.configure(
...
)
from django.apps import apps
apps.populate(settings.INSTALLED_APPS)
class Model(models.Model):
...
![Page 12: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/12.jpg)
OMG ORM! Successfully!if not settings.configured:
settings.configure(
...
MIGRATION_MODULES ={'__main__': 'migrations'},
INSTALLED_APPS =(
...
'__main__'
),
)
...
![Page 13: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/13.jpg)
Through AppConfigclass App(AppConfig):
label = APP_LABEL
app = App('name', sys.modules[__name__])
...
INSTALLED_APPS=(
app
),
...
class Task(models.Model):
class Meta:
app_label = APP_LABEL
...
![Page 14: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/14.jpg)
Through sys.modulesPyCon 2015 David Beazley - Modules and Packagesfrom types import ModuleType
import django
class Settings(ModuleType):
DEBUG = False
...
sys.modules['settings'] = Settings
os.environ.setdefault( "DJANGO_SETTINGS_MODULE" , "settings")
django.setup()
![Page 15: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/15.jpg)
Freedom (- Django ORM)...
from sqlite3 import dbapi2 as sqlite3
def get_db():
rv = sqlite3.connect('tasks.db', check_same_thread=False)
rv.row_factory = sqlite3.Row
return rv
def view(request):
db = get_db()
cur = db.execute('SELECT * FROM task WHERE task.session_id=$1 order by id desc',
[request.session.session_key, ])
tasks = cur.fetchall()
return JsonResponse({task['id']: {'body': task['body'], 'title': task['title'], 'active':
task['is_active']} for task in tasks})
![Page 16: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/16.jpg)
SQLAlchemyfrom sqlalchemy import create_engine
...
engine = create_engine('sqlite:///tasks.db', convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False,
bind=engine))
class Task(Base):
__tablename__ = 'task'
...
def view(request):
tasks = Task.query.filter(Task.session_id == request.session.session_key)
return JsonResponse({task.id: {'body': task.body, 'title': task.title, 'active':
task.is_active} for task in tasks})
![Page 17: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/17.jpg)
Peeweeimport peewee
db = peewee.SqliteDatabase('tasks.db')
class Task(peewee.Model):
...
def view(request):
tasks = Task.select().where(Task.session_id == request.session.session_key)
return JsonResponse({task.id: {'body': task.body, 'title': task.title, 'active':
task.is_active} for task in tasks})
![Page 18: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/18.jpg)
Route [email protected](r'^tasks/$', methods=['GET'])
def _all(request):
...
@app.route(r'^tasks/$', methods=['POST'])
@app.route(r'^tasks/add/$', methods=['POST'])
def add(request):
...
![Page 19: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/19.jpg)
ДаНет
![Page 20: Micro(Lightweight) Django](https://reader030.vdocuments.us/reader030/viewer/2022020219/55cb6058bb61eb7b528b45b2/html5/thumbnails/20.jpg)
Ссылки
Вопросы???Доклад Django Minus Django - http://www.youtube.com/watch?v=aFRH-oHcbn8Мой репозиторий с примерами - https://goo.gl/6q6IRPimportd - https://goo.gl/SwzhLLДоклад Егора Назаркина - Flask: Гордость и предубеждение - https://goo.gl/i3Hv5EОбсуждение в блоге Ивана Сагалаева (маниакальный веблог) - http://goo.gl/Vh497ysettings.configure - https://goo.gl/WfyTSEBenchmarks - http://goo.gl/pBpmmj, http://goo.gl/C8TFz5PyCon 2015 David Beazley - Modules and Packages - http://www.youtube.com/watch?v=0oTh1CXRaQ0