Python/Django

Django 기본

noodle-dev 2020. 2. 14. 15:29

HTTP: stateless protocol

process 생성 - 파이썬 메모리 올리고 - 제거하고 -> 05ch

url mapping 자동으로 해준다.

소켓은 내가 url을 책임지고 호출해야 한다. 웹서버가 안 해

@app.rate(./...) 이렇게 명시를 했다.

큰 규모의 웹서비스를 만들기 위해서는 플라스크는 너무 간단하고 비효율적이다.

쟝고는 현실적으로 사용가능한 웹프로그램. 어느정도 가볍다.

MVC & MTV

모든 어플리케이션은 MVC 설계 방법?

MVC

  • Model : 안전하게 데이터를 저장

연속성이 있는 데이터를 어떻게 저장할 것인지. 별도의 모듈을 만들어 데이터 모델링. DB도 나름의 모델링 방법을 가지고 데이터베이스와 연결.

  • View : 데이터를 적절하게 유저에게 보여준다.

사용자에게 데이터를 어떻게 보여줄지. (graph, template, ...)

  • Control, Template (Django) : 사용자의 입력과 이벤트에 반응하여 model과 view를 업데이트

모델과 뷰를 서로 연결시켜주는 작업.

그런데 장고에서는 이름을 조금 바꾸었다.

MTV

기존의 V는 컨트롤러에 가깝(연결)지만, 장고에서의 V는

Project, App

Project

App : 전체적인 세팅 관련

Practice

초기 설정

프로젝트 구성

reload 기능 자동으로.

컴파일 에러가 발생해도 죽지 않아. manage.py 동작 중이어서 그 안에서 서버모듈이 중단된다해도 ㄱㅊ

동적으로 서비스가 추가되어도 다 인식해

  • console
django-admin #설명서
cd mysite
python manage.py runserver
python manage.py startapp myapp #프로젝트 하위구조. 생성도 어드민에서 하는 게 아니라, manage.py를 가지고 하위 앱을 만드는 것.

python manage.py migrate        #DB initialization

DB 구조가 변경되었을 경우 migration 필요. field 추가 및 삭제 등... (글이 아니고)

초기 설정

  • settings.py

    • template directory setting
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': ['templates'],
    • static directory setting
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [        #static folder의 물리적은 경로
            os.path.join(BASE_DIR, 'static'),
    ]

urls

  • mysite/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls'))
]

뒤에 urls는 통상적으로.

전역적인 세팅은 mysite 폴더 안에.

쟝고는 대부분 지역변수/함수를 사용하도록 설계되어 있다.

  • myapp/urls.py
from django.urls import path
from . import views     #from 다음에는 폴더명. import 다음에는 함수명이나

urlpatterns = [
    path('', views.index),
    path('test/main', views.test),
]

views

  • myapp/views.py
def test(request):
    out = {'s':
               {'img':'test.png'}
           }
    return render(request, 'template.html', out)
    #쟝고에서는 딕셔너리로만 데이터 전달 가능.

views.py : 어떤 템플릿을 연결해줄지 정리해주는 역할.

Web Service

상대 경로

항상 경로를 생각해야 해. current 어디인지

<form action="login" method="get">    <!--localhost:8000/static/login-->
<form action="/login" method="get">    <!--localhost:8000/login-->

상대경로. current에 있는 login(localhost:8000/static/login)으로 연결된다.

절대경로는 /로 시작.

경로가 파이썬에서는 서버기준, 브라우저에서는 실행되는 웹주소 기반이다.

세팅하면 login.html을 다른 폴더에 넣을 수 있지만,

오늘 수업에서는 static/login.html 으로 할 것임

전체적인 프로세스는 쟝고가 운영하니 current directory는 BASE_DIR 이다.

./dirname

BASE_DIR 는 앱의 베이스가 아니라 프로젝트의 base directory를 가리킨다.

Redirect

return HttpResponse("login FAIL<a href='/static/login.html'>돌아가기</a>")

주소창: http://localhost:8000/login?id=d&pwd=d

return service(request)

주소창: http://localhost:8000/login?id=d&pwd=d

새로고침(F5)하면 다시 로그인 요청을 하는 것이다.

새로고침하면 서비스 페이지가 오는게 논리적이다. (이미 로그인이 되어있는데)

return redirect('/service')

주소창: http://localhost:8000/service

리다이렉트: 브라우저에게 서비스파일 다시 요청해달라고 요청

페이지에서 페이지로 이동할 때에는 브라우저에 요청해서 간접적으로 이동해야 한다.

새로고침하면 http://localhost:8000/service 요청

리다이렉트란, 입력을 login으로 받아서 출력 끝내놓고, 다시 입력을 서비스 페이지로 바꾸는 것이다. -> 요청한 페이지와 출력한 페이지가 항상 같다는 보장을 해주면서 페이지와 페이지를 이동할 수 있는 방법이다.

another issue) 로그인 안 한 상태에서 service page 요청하면 service page 들어가져.

-> 사용자 인증 과정 필요하다. 비인가된 사용자들이 서비스페이지에 요청을 직접적으로 하면 안 되도록.

  • HTML Redirection
<head>
    <meta http-equiv="refresh" content="0;URL='http://www.example.com/'" />
</head>

브라우저는 0초 후에 요청된 url을 다시 요청한다.

리다이렉트 파이썬에서 구현하면 아래와 같다.

HttpResponse("""
    <script>
        window.location.href = "/service"
    </script>
""")

session

세션과 쿠키는 거의 동일한 개념인데, 어떤 메모리이다.

namevalue 상의 데이터를, 쿠키는 그 공간을 client에, 세션은 server 상에 저장하는 것이다. 보안상 세션이 더 유리하다.

세션은 자동으로 유저별로 구분해서 준다. user마다 전용 세션 공간이 할당된다.

internet explorer로 들어오고 chrome으로 들어오면 둘 세션 값이 다르다.

face recognition: multi classes problem

face verification: binary class problem