Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Flask admin vs. DIY

5,586 views

Published on

Published in: Technology

Flask admin vs. DIY

  1. 1. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Flask-Admin vs. DIY Dokenzy 2013. 7. 30
  2. 2. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 경고 저는 flask-admin를 안써요.
  3. 3. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 준비 $ pythonbrew use 2.7.3 $ pythonbrew venv create fladmin $ pythonbrew venv use fladmin
  4. 4. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 설치 ▶ Flask ▶ Flask-Admin ▶ SQLAlchemy ▶ Flask-SQLAlchemy ▶ WTForms ▶ Flask-WTForms
  5. 5. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 시작하기 전에… ▶ http://flask-admin.readthedocs.org/en/latest/ ▶ I attempted to make it as flexible as possible. ▶ Administrative pieces are built as classes with view methods.
  6. 6. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 시작 1 from flask import Flask 2 from flask.ext.admin import Admin 3 4 app = Flask(__name__) 5 6 admin = Admin(app) 7 # admin = Admin(app, name=’Admin page Title’) 8 9 # admin = Admin(name=’Admin page Title’) 10 # admin.init_app(app) 11 12 app.run()
  7. 7. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . View ▶ BaseView ▶ ModelView
  8. 8. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . BaseView 1 from flask.ext.admin import Admin, BaseView, expose 2 3 class System(BaseView): 4 @expose('/') 5 def index(self): 6 return self.render(os.path.join('admin', 'system.html')) 7 @expose('/settings/') 8 def settings(self): 9 return self.render(os.path.join('admin', 'settings.html')) 10 @expose('/contacts/') 11 def contacts(self): 12 return self.render(os.path.join('admin', 'contacts.html')) 13 14 admin.add_view(System(name='settings', endpoint='settings', category='Setting') 15 admin.add_view(System(name='contacts', endpoint='contacts', category='Setting') 16 admin.add_view(System(name='system', endpoint='sos', category='Setting'))
  9. 9. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . BaseView ▶ @expose('/') 필수 ▶ @expose(url, methods) ▶ lowercased 클래스 이름이 기본 endpoint ▶ 여러 개의 메소드가 있어도 항상 ‘/’만 호출된다. http://stackoverflow.com/questions/15699303/ setting-up-admin-views-with-flask-admin-module.
  10. 10. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . ModelView 1 from flask.ext.admin.contrib.sqlamodel import ModelView 2 admin = Admin(app) 3 admin.add_view(ModelView(User, db.session))
  11. 11. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . ModelView ▶ SQLAlchemy, MongoEngine, Peewee, PyMongo ▶ Override(properties, methods) ▶ column_filters = None ▶ column_searchable_list = ('name', 'email') ▶ create_view
  12. 12. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Temlates 상속 ▶ {% extends 'admin/master.html' %} Flask Core ▶ head_meta, title, head_css, head, … Models ▶ model_menu_bar, model_list_table, …
  13. 13. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Authentication 1 class MyView(BaseView): 2 def is_accessible(self): 3 return login.current_user.is_authenticated()
  14. 14. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Examples https://github.com/mrjoes/flask-admin/blob/master/examples/
  15. 15. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Run 오류 발생 Failed to create model. __init__() takes exactly 2 arguments (1 given) Failed to create model. __init__() takes exactly 3 arguments (1 given) Failed to create model. __init__() takes exactly 4 arguments (1 given) Failed to create model. __init__() takes exactly 5 arguments (1 given) Failed to create model. __init__() takes exactly 6 arguments (1 given)
  16. 16. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... .
  17. 17. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Run 해결방법 1. 모델 클래스의 __init__() 수정 2. flask-admin을 패치
  18. 18. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Flask-Admin 패치 Source 1 try: 2 model = self.model()
  19. 19. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Flask-Admin 패치 Patch /site-packages/flask_admin/contrib/sqlamodel/view.py 1 values = {} 2 for k in form.data.iterkeys(): 3 try: 4 value = unicode(form.data[k]) 5 except: 6 value = form.data[k] 7 values[k] = value 8 9 try: 10 model = self.model(**values)
  20. 20. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 그래도 저는 안씁니다. ▶ 커스터마이징이 많아지면 extension을 쓰는 이유가 없어진다. ▶ 매니저 등급 구분 기능이 없다. ▶ 관리자 메뉴에서 편집한 내용이 원래 레코드에 반영이 안된다. 어쩌라고…?
  21. 21. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Do it yourself ▶ ORM을 쓰면 할만하다. ▶ DB 모델을 싹 갈아치울 일은 거의 없다. ▶ 관리자 UI는 유행이나 이벤트로부터 자유롭다.
  22. 22. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 끝 Demo

×