Inertia

django

Spring, Django, Ruby on Rails 등등 수많은 웹 프레임워크가 있다. 이 중 내가 이번에 선택한 것은 django이다. 그 이유는

  • admin 이 그냥 생기고(model을 정의만 하면…)
  • python 에 비교적 익숙하고
  • community가 발달되어서 3rd party app(django에서의 앱은 하나의 동자적인 기능을 하는 모듈이라고 보면 된다)이 많이 있다. Oauth2 authentication이라든가, markdown editor라든지…

MVC에서, M은 Model, V는 View(Template) C는 urls.py가 담당하게 된다.

Model

1
2
3
4
5
6
7
8
9
10
class Problem(models.Model):
problem = models.CharField(max_length=200)
pub_date = modesl.DateTimeField('date published')

def __unicode__(self):
return self.problem

# create new isntance & save to DB
new_instance = Problem(problem='which one is better?')
new_instance.save()

Controller

urls.py를 request url을 regex로 각 뷰로 dispatch한다.

1
2
3
4
5
6
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

View(Template)

우리가 서버로 사용하는 것은 Django이고 실제로 웹사이트의 사용자가 보게 되는 것은 html이다. 그러면 django object를 html로 변환하는 과정이 필요하게 마련인데, 이것을 해주는 것이 template 되겠다.

object는 handle bar형식으로 표현이 되고, 그 외의 것은 {% tag %} 로 표현이 된다. 아래의 예제에서 extends, block, for, endfor, endblock 등이 되겠다.

신선했던 것은 template도 상속관계를 가질수 있다는 것. 그래서 전체적인 구조(block)는 base.html에서 잡아두고, override 하고 싶은 부분만 extends해서 커스터마이징 할 수 있다. 실제로도 아주 편한 피쳐임.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{% raw %}
{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1>

{% for story in story_list %}
<h2>
<a href="{{ story.get_absolute_url }}">
{{ story.headline|upper }}
</a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}
{% endraw %}

revision history

  • 2016-4-15 draft
  • 2016-5-10 controller, view 업데이트