2. 2016.07.08 Django 와 Flask 2
목차
0. 공통 ( 가상 환경 구축 )
1. 웹 사이트 프로젝트 시작하기
2. Django 뷰와 Flask 뷰 차이
3. Django Form 과 WTForms
4. Django 와 Flask 로 중대형 사이트 구축
5. Django 와 Flask 와 Route 구현
6. Django 와 Flask 와 데이터 모델 구현
7. Django 와 Flask 의 데이터 모델 검증
8. Django 와 Flask 의 URL 구현 차이
9. Django 와 Flask 의 필터 , Reusable Component
3. 2016.07.08 Django 와 Flask 3
0. 공통 ( 가상 환경 구축 )
& 모든 파이썬 프로젝트는 반드시 파이썬 가상환경 구축
& Python 2.x, 3.x = virtualenv
& Python 3.x = pyvenv
& Virtualenv 를 더 쉽게 = Virtualenvwrapper
그 외 ..
Conda, pyenv, autoenv
4. 2016.07.08 Django 와 Flask 4
웹 사이트 프로젝트 시작하기
Django:
$ django-admin startproject <project_name>
Flask:
$ mkdir -p project_name/project_name
$ touch project_name/project_name/__init__.py
5. 2016.07.08 Django 와 Flask 5
Django 뷰와 Flask 뷰 차이
Django:
- CBV(Class Based Views)
- FBV(Function Based Views)
Flask:
- Pluggable View(View, MethodView)
- Function View
6. 2016.07.08 Django 와 Flask 6
Django 뷰와 Flask 뷰 차이
Django:
- CBV(Class Based Views)
Example
from django.conf.urls import url
from django.views.generic import TemplateView
urlpatterns = [
url(r'^about/$',
TemplateView.as_view(template_name="about.html")),
]
7. 2016.07.08 Django 와 Flask 7
Django 뷰와 Flask 뷰 차이
Django:
- FBV(Function Based Views)
Example
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^datetime/$', views.current_datetime)
]
8. 2016.07.08 Django 와 Flask 8
Django 뷰와 Flask 뷰 차이
Flask View:
- Pluggable View(View)
Example
from flask.views import View
class ShowUsers(View):
def dispatch_request(self):
users = User.query.all()
return render_template('users.html', objects=users)
app.add_url_rule('/users/',
view_func=ShowUsers.as_view('show_users'))
9. 2016.07.08 Django 와 Flask 9
Django 뷰와 Flask 뷰 차이
Flask View:
- Pluggable View(Method View)
Example
class UserAPI(MethodView):
decorators = [user_required]
def get(self, user_id):
pass
def post(self):
# create a new user
pass
def delete(self, user_id):
# delete a single user
pass
10. 2016.07.08 Django 와 Flask 10
Django 뷰와 Flask 뷰 차이
Flask View:
- Function Based View
Example
@app.route('/users/')
def show_users(page):
users = User.query.all()
return render_template('users.html', users=users)
11. 2016.07.08 Django 와 Flask 11
Django Form 과 WTForms
Django Models 객체를 통해 Template 에서 호출
Example
Model:
from django.db import models
class Question(models.Model):
tag = models.CharField(max_length=200)
Template:
{{ form.tag.label_tag }} {{ form.tag }}
12. 2016.07.08 Django 와 Flask 12
Django Form 과 WTForms
WTForms 를 통해 템플릿 구축하기
Example
from wtforms import Form, StringField, validators
class RegistrationForm(Form):
username = StringField('Username',
[validators.Length(min=4, max=25)])
email = StringField('Email Address', [validators.Length(min=6,
max=35)])
13. 2016.07.08 Django 와 Flask 13
Django Form 과 WTForms
WTForms 를 통해 템플릿 구축하기
Example
{% macro render_field(field) %}
<dt>{{ field.label }}
<dd>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}
14. 2016.07.08 Django 와 Flask 14
Django 와 Flask 로 중대형 사이트 구축
Django 로 구축하기
$ django-admin startproject <project_name>
$ cd project_name
$ ./manage.py startapp <app_name>
Flask 로 구축하기
$ mkdir -p <project_name>/<project_name>
$ touch <project_name>/<project_name>/__init__.py
1) Blueprint 모듈 만들어서 추가
2) url 만 정의된 파일 작성해서 임포트하기
15. 2016.07.08 Django 와 Flask 15
Django 와 Flask 와 Route 구현
Django:
urls.py 구현
urlpatterns 변수 재정의
urlpatterns = [
url(r'^datetime/$', views.current_datetime)
]
Flask:
function: app.add_url_rule, app.register_blueprint
decorator: app.route
16. 2016.07.08 Django 와 Flask 16
Django 와 Flask 와 데이터 모델 구현
Django
Model File
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
Result: <Model Result>
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
17. 2016.07.08 Django 와 Flask 17
Django 와 Flask 와 데이터 모델 구현
Flask - Database File
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:////tmp/test.db',
convert_unicode=True)
db_session =
scoped_session(sessionmaker(autocommit=False,
autoflush=False, bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
def init_db():
import yourapplication.models
Base.metadata.create_all(bind=engine)
18. 2016.07.08 Django 와 Flask 18
Django 와 Flask 와 데이터 모델 구현
Flask - Model File
from sqlalchemy import Column, Integer, String
from yourapplication.database import Base
class User(Base):
__tablename__ = 'users'
first_name = Column(String(30), nullable=False)
last_name = Column(String(30), nullable=False)
19. 2016.07.08 Django 와 Flask 19
Django 와 Flask 의 데이터 모델 검증
Django
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
def validate_even(value):
if value % 2 != 0:
raise ValidationError(
_('%(value)s is not an even number'),
params={'value': value},
)
from django.db import models
class MyModel(models.Model):
even_field = models.IntegerField(validators=[validate_even])
20. 2016.07.08 Django 와 Flask 20
Django 와 Flask 의 데이터 모델 검증Django - View 에서 처리
form = MyModel(request.POST)
검증 : form.is_valid()
유효성을 통과한 데이터 : form.cleaned_data
에러 내용 : form.erros
Flask - View 에서 처리
form = MyModel(request.form)
검증 : form.validate()
검증이 완료된 데이터 객체 복사해오기 : populate_obj
에러 내용 : form.erros
21. 2016.07.08 Django 와 Flask 21
Django 와 Flask 의 URL 구현 차이
Django
Backend: reverse, reverse_lazy 함수 사용
Template: {% url %} 태그 사용
Flask
Backend 와 Template 모두 url_for(end_point,
**kwargs) 사용
22. 2016.07.08 Django 와 Flask 22
Django 와 Flask 의 필터 , Reusable
Component
Django
- Custom Tag
- Custom Filter
Flask Filter
- Custom Tag( 단 , Extension 클래스 상속 구현 )
- Custom Filter
- Reusable Component(macro)
23. 2016.07.08 Django 와 Flask 23
Django 와 Flask 의 필터 , Reusable
Component
Django - Custom Tag
from django import template
register = template.Library()
@register.simple_tag
def my_tag(a, b, *args, **kwargs):
warning = kwargs['warning']
profile = kwargs['profile']
...
return ...
24. 2016.07.08 Django 와 Flask 24
Django 와 Flask 의 필터 , Reusable
Component
Django - Custom Filter
from django import template
register = template.Library()
@register.filter(is_safe=True)
def add_xx(value):
return '%sxx' % value
25. 2016.07.08 Django 와 Flask 25
Django 와 Flask 의 필터 , Reusable
Component
Flask - Custom Filter, Global Function
@app.template_filter('filter_name')
def int_add(d, b):
return d+b
@app.template_global('global_name')
def int_minus(d, b):
return d-b
Flask - Custom Variable
@app.context_processor
def utility_processor():
return dict(name='fastcampus')
26. 2016.07.08 Django 와 Flask 26
Django 와 Flask 의 필터 , Reusable
Component
Flask – Reusable Component (Macro)
{% macro input(name, value='', type='text', size=20) -
%}
<input type="{{ type }}" name="{{ name }}" value="{{
value|e }}" size="{{ size }}">
{%- endmacro %}
{{ input('tt') }}
27. 2016.07.08 Django 와 Flask 27
백엔드 개발자가 가져야 할 스탠스
1) 테스트케이스 작성과 회귀 테스트
- Flask는 test_client 메서드로 테스트 브라우저 생성
- 회귀 테스트는 travis-CI, Jenkins-CI 사용 권장
2) 소스 저장소 일원화
- 회사에서 사용하는 저장소 일원화(ex, Gitlab, BitBucket
등)
3) 외부 라이브러리 조사 및 정리
- 프로그램 개발 과정에서 새로운 라이브러리의 사용이나
기존에 사용된 라이브러리의 사용방법이나 문제사항을 정
리한 기술 노트(오프라인 및 온라인 도구 사용-위키, 에버노
트, 원노트 등)
28. 2016.07.08 Django 와 Flask 28
백엔드 개발자가 가져야 할 스탠스
4) 그리고 동료들과 끊임없는 대화와 배려를 통한 협업
무엇보다 백엔드 개발자로서 백엔드 프로그램을 안정적으
로 유지할 수 있도록
개발 PC → 테스트 서버 → 스테이지 서버 → 운영 서버
로 나눠서 작업할 수 있도록 팀에 제안 및 이끌어야 합니다.