1. Raw Django
Django project 구조
project/
manage.py
project/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
- 프로젝트를 생성하면 다음과 같은 파일구조로 만들어진다.
- 프로젝트와 같은 이름의 폴더가 내부에 생기고,
manage.py
파일이 생긴다. - 해당 폴더는 프로젝트의 실제 패키지 폴더이다. 그 안에
settings.py
파일을 비롯한 기본 파일이 생성된다.
manage.py
파일
사용 예시
- migrate
python manage.py migrate
- runserver
python manage.py runserver
- startapp
python manage.py startapp <new-app-name>
Concepts in Django
Serialization?
하나의 포맷으로 정 리된 데이터를 다른 데이터 포맷으로 'translate' 하는것. 예) sql 형식? 으로 정리된 텍스트 데이터를 Django format 으로 만들기.
migration?
Django model 을 database schema 형식으로 변환해 db에 적용하는 작업.
model?
the single, definitive source of information about your data.
It contains the essential fields and behaviors of the data you’re storing.
- 보통, 한 model이 하나의 db table의 형식을 대변하다.
- 각 모델은 django.db.models.Model 클래스를 상속받아 작성된다.
- 모델의 attribute 는 db 의 각 field를 대변한다.
- Django는 db 에서 각 데이터필드를 query 로 접근할 수 있는 API를 생성, 제공한다.
Concepts in Python
globals()
global scope parameter를 알려준다.
y = 30
>>> globals()
{..., 'y': 30} #Python이 자동적으로 만들 글로벌 변수도 표시되지만 생략
namespace?
a collection of currently defined symbolic names along with information about the object that each name references.
You can think of a namespace as a dictionary in which the keys are the object names and the values are the objects themselves.
namespace 는 4가지 종류가 있다. 각 종류에 따라 변수의 lifetime이 다르다.
- Built-In
console에
dir(__builtins__)
치면 볼 수 있는, Python 자체의 object들. 실행될 때 만들어지고, interpreter가 종료될 때 까지 살아있음.
[
'ArithmeticError', 'AssertionError', 'AttributeError', ...
'False', ...,'RuntimeError', ..., 'True', ...
'_', '__build_class__', '__debug__', '__doc__', '__import__',
'__loader__', '__name__', '__package__','__spec__', ...,
'dict', ..., 'super', 'tuple', ...
]
-
Global main program 수준에서 정의된 변수들. program body가 실행될 때 만들어지고, interpreter가 종료될 때 까지 살아있음.
-
Enclosing, Local 어딘가 안에 enclosed 되어 정의된 변수들. 그 공간이 전부 실행되면 사라진다.
see also. scope
각 변수는 해당 설정된 공간에서만 찾을 수 있다. 예를 들어, local 한 namespace는 그 local 을 빠져나와선 찾을 수 없다. 반대로, global한 namespace는 어디에서든 찾을 수 있다. NOTE.해당 scope에서 찾을 수 없으면 그 다음 외부 scope 로 넓혀서 찾는다!
함수의 중첩
def outer(x):
def inner():
print x
return inner
print1 = outer(1)
print2 = outer(2)
print1() #1
print2() #2
Python은 Function closure 기능을 가지고 있어, 함수가 선언 될 때의 scope를 기억하고 있는다.
Decorator?
적절히 조정하어 함수를 생성하는 함수. parameter전달된 함수에 맞추어 새로운 함수를 리턴해준다.
>>> def outer(some_func):
... def inner():
... print "before some_func"
... ret = some_func() #1
... return ret + 1
... return inner
>>> def foo():
... return 1
>>> decorated = outer(foo) #2
>>> decorated()
before some_func
2
foo를 실행하면 1이 반환되지만 outer에을 씌운 foo는 그것에 +1을 하여 2를 반환하고 있다. 말하자면 decorated는 foo의 데코레이터판(foo + 어떠한 처리)라고 할 수 있다. 출처
변수로 준 함수에 어떤 것을 입혀(decorate)해서 다시 반환하는 함수.
@ 표현법.
@를 붙여 wrapper 이름을 써준다.
decorated = outer(foo)
#위의 표현을 다음과 같이 쓴다.
@outer
def decorated(foo):
...
for in if
?
r''
?
*args
?
Python에서, 그 수가 정해져 있지 않은 parameter들을 받을 때 asterisk를 붙여 전부 받을 수 있다.
def two(x, y, *args):
print x, y, args
two('a', 'b', 'c') # a b ('c',)
see also. **kwargs
"명시적으로 지정하지 않은 파라미터는 kwargs이라는 이름의 사전으로 저장된다."
리스트형이 아니고, 사전형으로 전달됨.
def foo(**kwargs):
print kwargs
foo() # {}
foo(x=1, y=2) # {'y': 2, 'x': 1}