WebFramework

# my_serializer.py

from rest_framework import serializers
from 모델 경로 import myModel

class ListSerializer(serializers.Serializer):
    myIds = serializers.ListField(child=serializers.CharField())
# my_view.py

from rest_framework.views import APIView
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi

class MyView(APIView):
    @swagger_auto_schema(
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            properties={
                'myId_list':openapi.Schema(
                    type=openapi.TYPE_ARRAY,
                    items=openapi.Schema(type=openapi.TYPE_STRING)
                )
            }
        )
    )
    def post(self, request):
        return myService.myRest(request)
# my_service.py

def myRest(request):
    myId_list = request.data.get('myId_list')

    serializer = MySerializer(data={'myIds':myId_list})

    if serializer.is_valid():
        return Response({'message': msg}, status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

'WebFramework > [Django]' 카테고리의 다른 글

[Django] APIView CRUD 예제 코드  (0) 2023.08.23
[Django] extends와 include  (0) 2023.07.26
[Django] Class Based View, Funtion Based View  (0) 2023.07.24
[Django] docker-Django 접속하기  (0) 2023.07.11

[FastAPI] SQLAlchemy 요소

2023. 8. 8. 15:08

💡 create_engine

SQLAlchemy에서 데이터베이스와의 연결을 설정하고 엔진 생성

데이터베이스의 종류와 위치, 사용자 인증 정보 등을 포함하여 연결에 필요한 정보를 제공

 

💡 sessionmaker

세션은 데이터베이스와의 상호작용을 추적하고 제어하는 데 사용됨

sessionmaker는 세션 객체를 생성하는 팩토리를 생성하는 역할을 함

sessionmaker를 사용하여 데이터베이스 세션을 생성하면 해당 세션을 통해 데이터베이스와의 작업을 수행할 수 있음

 

* 팩토리 메서드 *

객체 생성을 캡술화하는 디자인 패턴 중 하나

SQLAlchemy에서 sessionmaker()는 세션 객체를 생성하는 펙토리 메서드 역할

 

💡 session

실제 데이터베이스와의 상호작용을 담당하는 객체

sessionmaker를 사용하여 생성된 세션 팩토리를 통해 세션을 생성하고, 

세션을 통해 데이터의 조회, 추가, 수정, 삭제 등의 작업을 수행할 수 있음

 

 

1. 팩토리 생성

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 데이터베이스 연결 정보
DATABASE_URL = "sqlite:///./test.db"

# 엔진 생성
engine = create_engine(DATABASE_URL)

# 팩토리 생성
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

2. 세션 객체 생성 및 사용

from sqlalchemy.orm import Session
from fastapi import FastAPI, Depends

app = FastAPI()

# 팩토리 메서드(SessionLocal)를 호출하여 세션 객체 생성
def get_db():
    db = SessionLocal()
    try:
    	# 세션 객체를 리소스로서 제공
        yield db
    finally:
        db.close()

@app.post("/items/")
async def create_item(item: Item, db: Session = Depends(get_db)):
    # db 사용하여 작업 수행
    db.add(item)
    db.commit()
    db.refresh(item)
    return item

get_db()

Depends(get_db)를 사용하여 의존성을 주입하면, FastAPI가 세션을 관리하며 요청 핸들러에서 사용할 수 있도록 해줌

 

세션 객체를 리소스로서 제공한다는 것은

세션 객체를 필요로 하는 함수나 메서드에서 세션을 쉽게 사용할 수 있도록 관리하는 것을 의미

 

세션 객체는 데이터베이스와의 연결을 나타내는 중요한 자원

그렇기 때문에 세션을 생성하고 닫는 과정을 중복해서 처리하지 않고,

필요한 곳에서 쉽게 사용할 수 있도록 만드는 것이 좋음

 

리소스로서 제공된 세션 객체는 필요한 작업을 수행한 뒤에는 자동으로 정리되어 닫히게 됨

이를 통해 개발자는 세션 관리에 대한 복잡한 작업을 최소화하고,

안전하고 효율적인 데이터베이스 작업을 수행할 수 있음

[Django] extends와 include

2023. 7. 26. 13:10

 

Django 템플릿 시스템에서 사용되는 두 가지 기능을 정리하고자 한다.

 

💡 extends

extends는 장고의 템플릿 상속 기능을 나타낸다.

 

이 기능을 사용하면 기본 템플릿(부모 템플릿)을 만들고,

이를 확장하여 추가적인 내용을 포함하는 템플릿(자식 템플릿)을 만들 수 있다.

 

이를 통해 템플릿의 재사용성을 높이고 코드의 중복을 방지할 수 있다.

 

<!-- 부모 템플릿 -->

<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}기본 제목{% endblock %}</title>
</head>
<body>
    <div class="container">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>
<!-- 자식 템플릿 -->

{% extends "base.html" %}

{% block title %}확장된 제목{% endblock %}

{% block content %}
    <h1>확장 템플릿</h1>
    <p>기본 템플릿을 확장한 내용</p>
{% endblock %}

자식 템플릿은 extends를 사용해 기본 템플릿을 상속하고, 

{% block %} 태그를 통해 기본 템플릿의 블록을 재정의하거나 새로운 블록을 추가할 수 있다.

 

💡 include

include는 다른 템플릿 파일을 현재 템플릿에 포함시키는 기능이다.

이를 사용해 템플릿 파일의 재사용성을 높일 수 있으며,

특정 부분을 별도의 템플릿 파일로 분리하여 코드를 조직화할 수 있다.

 

예를 들어, 반복되는 HTML 코드를 별도의 템플릿 파일로 분리하고,

여러 곳에서 이를 재사용하고자 할 때 사용할 수 있다.

 

<!-- 반복되는 템플릿 파일 (sub_template.html) -->
<div class="item">
    <h2>{{ title }}</h2>
    <p>{{ content }}</p>
</div>
<!-- 메인 템플릿 파일 -->
<!DOCTYPE html>
<html>
<head>
    <title>메인 페이지</title>
</head>
<body>
    <div class="container">
        {% for item in items %}
            {% include 'sub_template.html' with title=item.title content=item.content %}
        {% endfor %}
    </div>
</body>
</html>

include는 {% include %} 태그를 사용하여 다른 템플릿 파일을 포함하며,

필요에 따라 추가적인 데이터를 넘겨줄 수도 있다.

[Web] SSR과 CSR

2023. 7. 25. 17:54

 

 

SSR과 CSR은 웹 애플리케이션의 프론트엔드 렌더링 방식을 설명하는 용어이다.

 

 📌 렌더링

웹 개발에서 렌더링은 서버가 생성한 데이터를 클라이언트 (웹 브라우저)에게 전달하여

해당 데이터를 가지고 웹 페이지를 생성하고 보여주는 것을 의미

 

웹 페이지를 사용자가 볼 수 있는 형태로 변환하는 과정을 말함

 

일반적으로 렌더링은 다음과 같은 흐름으로 전달된다.

 

1. SSR or CSR

 먼저 웹 페이지의 HTML, CSS, JavaScript 등의 코드가 서버에서 생성될지, 클라이언트에서 동적으로 생성될지 결정됨

이를 SSR 또는 CSR 방식으로 구현

 

2.  HTML 생성

SSR / CSR에 따라 HTML 생성 (아래 설명)

 

3. CSS와 Javascript 적용

생성된 HTML 문서에는 CSS와 JavaScript 등의 코드가 포함되어 있음

CSS는 웹 페이지의 스타일과 레이아웃을 정의

JavaScript는 웹 페이지의 동작과 상호작용을 담당

 

4. 웹 브라우저에서 렌더링

생성된 HTML, CSS, JavaScript 코드는 사용자의 웹 브라우저에 의해 해석되고 렌더링됨

웹 브라우저는 HTML 문서를 파싱하여 DOM (Document Object Model) 트리를 구성하고,

CSS를 적용하여 레이아웃을 결정하고, JavaScript를 실행하여 웹 페이지를 동적으로 만들어 냄

 

5. 사용자에게 시각적으로 보여주기

최종적으로 웹 브라우저에 의해 렌더링된 결과물이 사용자에게 시각적으로 보여짐

사용자는 이를 통해 웹 페이지를 이용하고 상호작용할 수 있음

 


💡 SSR (Server-Side-Rendering)

1. 클라이언트 (브라우저)가 서버에 페이지 요청을 보냄

 

2. 서버는 요청을 받아 해당 페이지에 필요한 데이터를 데이터베이스 등으로부터 가져와서 
HTML 템플릿에 데이터를 적용하여 렌더링함

 

3. 서버는 렌더링된 HTML을 클라이언트에게 전달함

 

4. 클라이언트는 받은 HTML을 브라우저에 렌더링하여 사용자에게 보여줌

 

 

SSR은 서버 측에서 웹 페이지의 뷰를 구성하고 렌더링하여 클라이언트에게 전달하는 방식

서버에서 데이터와 뷰를 조합하여 클라이언트에게 전달하기 때문에
초기 로딩속도가 빠르고 SEO(Search Engine Optimization)에 유리

 

장점

검색 엔진 최적화가 용이하므로 SEO에 유리함

초기 로딩 속도가 빠르고 사용자에게 빠른 콘텐츠 표시가 가능함

단점

서버 측에서 뷰를 렌더링하므로 서버 부하가 커질 수 있음

전체 페이지가 매번 새로고침되므로 사용자 경험에 제약이 있을 수 있음

 


💡 CSR (Client-Side-Rendering)

1. 클라이언트 (브라우저)가 서버에 페이지 요청을 보냄

 

2. 서버는 클라이언트에게 필요한 HTML과 빈 페이지를 전달함

 

3. 클라이언트는 받은 HTML을 렌더링하고, 필요한 데이터를 AJAX 요청 등으로 서버에 다시 요청함

 

4. 서버는 요청을 받아 데이터를 JSON 형태로 클라이언트에게 저달함

 

5. 클라이언트는 받은 데이터를 이용하여 페이지를 동적으로 렌더링함

 

 

CSR은 서버로부터 빈 페이지를 받은 뒤, 클라이언트 측에서 JavaScript를 사용하여 데이터를 받고 렌더링하는 방식

클라이언트 측에서 뷰를 조합하므로 서버 부하가 줄어들지만 초기 로딩 속도가 느리고 SEO에 취약함

 

장점

서버 부하가 감소하므로 대규모 애플리케이션에 적합

빠른 사용자 경험을 제공할 수 있음

단점

초기 로딩 속도가 느릴 수 있고, 초기 페이지 렌더링에 빈 페이지가 나타날 수 있음

검색 엔진 최적화에 취약하며, SEO를 위한 추가적인 작업이 필요

 

'WebFramework' 카테고리의 다른 글

[Interface] WSGI, ASGI  (0) 2023.06.02

💡 CBV

 

Django에서는 클래스 기반 뷰 (Class Based View)를 사용해 

일반적인 웹 개발 작업을 보다 쉽고 구조화된 방식으로 처리할 수 있다.

 

이러한 CBV는 'View'를 직접 상속받을 수도 있지만,

Django에서는 뷰의 특정 기능을 더 간편하게 구현할 수 있도록 다양한 CBV를 제공한다.

 

각 뷰를 비교해 보자.

 

View 클래스

기본적인 HTTP 메서드(GET, POST, PUT, DELETE 등)에 대한 처리를 직접 구현해야 함

모든 동작을 직접 제어하고자 할 때 사용

매우 유연하지만 기본 동작들을 모두 직접 구현해야 하므로 코드 양이 많아질 수 있음

 

1. 필요한 HTTP메서드에 해당하는 메서드를 오버라이딩

2. 뷰에서 필요로 하는 데이터를 가져와 템플릿으로 전달

3. 원하는 템플릿 파일을 렌더링하여 HTTP 응답으로 반환

from django.http import HttpResponse
from django.views.generic import View

class MyView(View):
    def get(self, request):
        # GET 요청에 대한 처리를 여기에 작성합니다.
        return HttpResponse("This is a GET request")

    def post(self, request):
        # POST 요청에 대한 처리를 여기에 작성합니다.
        return HttpResponse("This is a POST request")

 

ListView 클래스

데이터 목록을 보여주는 뷰에 사용

데이터베이스에서 쿼리셋을 가져와 템플릿으로 전달하는 작업을 간편하게 처리

목록 페이지를 렌더링하는 데 필요한 기능들이 이미 구현되어 있음

DetailView 클래스

단일 데이터의 상세 정보를 보여주는 뷰에 사용

특정 데이터를 데이터베이스에서 가져와 템플릿으로 전달하는 작업을 간편하게 처리

상세 정보 페이지를 렌더링하는 데 필요한 기능들이 이미 구현되어 있음

CreateView, UpdateView, DeleteView 등

데이터의 생성, 수정, 삭제를 처리하는 뷰에 사용

form을 사용하여 데이터를 입력하고 데이터베이스에 저장하는 작업을 간편하게 처리

각가의 기능에 필요한 동작들이 이미 구현되어 있음

 

 


💡 FBV

 

Function Based View를 사용해 뷰를 구현할 수도 있다.

FBV는 단순한 함수로 뷰를 구현하는 방식이다.

 

간단하고 직관적인 방식으로 뷰를 구현할 수 있기 때문에 쉽게 접근할 수 있다.

뷰를 함수로 정의하고, 해당 함수에서 요청 (request)을 처리하고 응답 (response)을 반환하는 방식이다.

from django.http import HttpResponse

def my_view(request):
    # 요청에 대한 처리를 여기에 작성합니다.
    return HttpResponse("This is a function-based view")

위 예제 코드에서 볼 수 있듯

FBV는 요청(request) 객체를 인자로 받는 기반으로 동작한다.

 

Django에서 FBV를 작성할 때, 뷰 함수는 반드시 최소한 하나의 인자로 'request' 객체를 받아야 한다.

'request' 객체는 웹 요청에 대한 정보를 담고 있으며,

클라이언트로부터 서버로 전달된 데이터, 세션 정보, 사용자 정보 등을 포함한다.

'WebFramework > [Django]' 카테고리의 다른 글

[Django] APIView CRUD 예제 코드  (0) 2023.08.23
[Django] Serializer에 List 정의하기  (0) 2023.08.23
[Django] extends와 include  (0) 2023.07.26
[Django] docker-Django 접속하기  (0) 2023.07.11

개발 환경

python3.8을 컨테이너로 올린 후 컨테이너 내부에 Django 설치해 사용

10100:8000으로 포트 포워딩

 

개발 서버 구동 후 접속

기본적으로 프로젝트를 생성 후 아래 명령어를 통해 개발 서버를 구동한다.

python manage.py runver

이에 대한 출력은 아래와 같다.

127.0.0.1:8000으로 접속하면 웹 사이트에 접속할 수 있다.

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
April 02, 2022 - 10:13:10
Django version 4.0.3, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

 

 

나는 python을 컨테이너로 올리고 10100 포트를 사용해야하므로

localhost:10100으로 접속했다.

 

하지만 웹 사이트에 접속하니 정상 실행이 되지 않는다!

 

 

Django는 기본적으로 개발 서버를 실행할 때 localhost만을 수신 대상으로 설정한다.

보안상의 이유로 기본적으로 외부로부터의 요청을 수신하지 않도록 설계되었다.

 

따라서 포트 포워딩을 통해 내가 보낸 요청이 컨테이너까지는 전달이 됐지만

컨테이너 내부의 localhost(루프백 인터페이스)와 포트 포워딩된 호스트의 10100포트 간

통신이 이루어지지 않은 것이다.

 

이를 해결하기 위해 Django의 runserver 명령을 실행할 때

IP주소를 0.0.0.0으로 지정하여 외부 인터페이스에서의 요청을 수신할 수 있도록 설정하면 된다.

 

python manage.py runserver 0.0.0.0:8000

위 명령어로 서버를 실행시키고

localhost:10100으로 접속 시 정상 작동 한다.

[Interface] WSGI, ASGI

2023. 6. 2. 15:57

💡 WSGI (Web Server Gateway Interface) 💡

파이썬 웹 어플리케이션과 웹 서버 간의 표준 인터페이스

주로 HTTP 프로토콜을 다루는 데 사용

다른 프로토콜을 지원하기 위해 별도의 처리 방법이 필요

 

WSGI 서버

WSGI 인터페이스를 구현한 웹 서버

WSGI 서버에는 Gunicorn, uWSGI 등이 있음

 

*  WSGI 인터페이스를 구현한다 *

- WSGI를 준수하는 웹 프레임워크를 사용하여 웹 어플리케이션을 개발했다

 

따라서 WSGI를 지원하는 웹 프레임워크를 사용하면 해당 프레임워크의 규칙과 규격에 따라 어플리케이션을 작성하고

이를 웹 서버에 연결하여 실행할 수 있음

 


💡 ASGI (Asynchronous Server Gateway Interface) 💡

파이썬의 비동기 웹 어플리케이션과 웹 서버간의 표준 인터페이스

WSGI보다 효율적인 처리를 제공

HTTP 외 다양한 프로토콜 지원

웹 어플리케이션 프레임워크(FastAPI, Django 등) ↔ 웹 서버 간의 통신을 담당

 

ASGI 서버

ASGI 어플리케이션(ASGI 인터페이스를 따르는 웹 어플리케이션=FastAPI, Django 등)을 실행하기 위한 서버

ASGI 서버에는 Uvicorn이 있음

 


💡 웹 프레임워크 비교 💡

Django

초기 버전은 WSGI에 맞춰짐

3.1 이후 버전부터는 ASGI를 통해 비동기 처리 가능

Starlette

ASGI 기반 경량 웹 프레임워크

FastAPI

Starlette 프레임워크를 기반으로 개발 (Starlette 기능 확장)

Flask

 

WSGI 지원

Python의 기본 모듈인 Werkzeung, Jinja2 기반으로 개발

Sanic

ASGI 기반

비동기 처리를 강조하는 웹 프레임워크

'WebFramework' 카테고리의 다른 글

[Web] SSR과 CSR  (0) 2023.07.25

우선 sqlalchemy 2.x에 버그가 있는 것 같음

AttributeError: 'Engine' object has no attribute 'execute'

pip install --force-reinstall 'sqlalchemy<2.0.0'

 


 

database = create_engine(app.config['DB_URL'], encoding = 'utf-8')

raise TypeError(
TypeError: Invalid argument(s) 'encoding' sent to create_engine(), using configuration MySQLDialect_mysqlconnector/QueuePool/Engine.  Please check that the keyword arguments are appropriate for this combination of components.

database = create_engine(app.config['DB_URL'], connect_args= {'encoding' : 'utf-8')

 

 

참고: https://docs.sqlalchemy.org/en/20/core/engines.html#custom-dbapi-args

 

 

 

'WebFramework > [Flask]' 카테고리의 다른 글

[Flask] Jinja2 사용법  (0) 2023.01.20
[Flask] Bootstrap 사용하기 (로그인)  (0) 2023.01.20
[Flask] 간단한 로그인 구현 (HTML, GET)  (0) 2023.01.20
[Flask] GET 사용법  (0) 2023.01.20
[Flask] httpi 설치  (0) 2023.01.20