micro(lightweight) django

20
Micro Django or Lightweigth

Upload: grigory-petrov

Post on 12-Aug-2015

4.513 views

Category:

Software


3 download

TRANSCRIPT

Page 1: Micro(Lightweight) Django

Micro Djangoor Lightweigth

Page 2: Micro(Lightweight) Django

Background

Page 3: Micro(Lightweight) Django

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

Django Micro?

Page 5: Micro(Lightweight) Django

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

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

Structurelessurlconf

urlpatterns = (

url(r'^$', lambda r: JsonResponse({ 'App': 'Simple’})),

)

Page 8: Micro(Lightweight) Django

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

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

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

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

OMG ORM! Successfully!if not settings.configured:

settings.configure(

...

MIGRATION_MODULES ={'__main__': 'migrations'},

INSTALLED_APPS =(

...

'__main__'

),

)

...

Page 13: Micro(Lightweight) Django

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

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

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

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

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

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

ДаНет

Page 20: Micro(Lightweight) Django

Ссылки

Вопросы???Доклад 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