본문 바로가기

분류 전체보기

(221)
[Flask] Jinja2 템플릿을 이용한 이메일 생성 플라스크는 텍스트 기반의 문서를 다루기 위해 Jinja라는 템플릿 엔진을 포함한다. 플라스크가 Jinja와 통합한 주된 이유는 HTML 문서를 생성하기 위해서이다. render_template() 같은 함수는 Jinja 템플릿과 주어진 테스트를 사용해 응답을 만든다. Jinja는 꼭 HTML 이나 다른 태그 기반의 문서만 사용할 수 있는 것은 아니고, 텍스트 기반이라면 어떤 문서도 만들 수 있다. 다음은 이메일 템플릿의 예시이다. Date: {{date}} From: {{from}} Subject: {{subject}} To: {{to}} Content-Type: text/plain Hello {{name}}, We have received your payment! Below is the list of ..
[백준 16234번] 인구이동(C++) 풀이 https://www.acmicpc.net/problem/16234 16234번: 인구 이동 N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모 www.acmicpc.net 풀이 더보기 복잡한 2차원 영역을 1차원으로 변환한 후 bfs 알고리즘을 이용하여 문제 해결하였습니다. 위 사진 처럼 각 국경선이 열린 경우 점선으로 표시가 되는데 이를 나타내기 위해서 2차원 영역을 1차원으로 변환하는 게 좋다.(구현이 가능하지만 복잡해지기 때문에) 각 2차원 좌표에 차례대로 번호를 붙여 1차원 좌표로 변환한다. 2차원 좌표를 1차원 좌표로 변환하는 코드는 다음과 ..
[프로그래머스] 문자열 압축(Python 풀이) - 2020 KAKAO BLIND RECRUITMENT https://programmers.co.kr/learn/courses/30/lessons/60057 코딩테스트 연습 - 문자열 압축 데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문 programmers.co.kr 더보기 문제 설명 데이터 처리 전문가가 되고 싶은 **"어피치"**는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습..
[Docker] Docker Compose ports/expose(컨테이너 간 통신) 컨테이너 간 통신(ports/expose) Docker Compose에서 컨테이너가 공개하는 포트는 ports로 지정합니다. '호스트 머신의 포트 번호:컨테이너의 포트 번호'를 지정하거나, 컨테이너의 포트번호만 지정합니다. 컨테이너의 포트 번호만 지정한 경우는 호스트 머신의 포트는 랜덤한 값 공개 포트 지정 YAML은 xx:yy 형식을 시간으로 해석하므로 포트 번호를 설정할 때는 반드시 ""를 사용합니다. ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001" 컨테이너 내부에만 공개하는 공개 포트 지정 호스트 머신에 대한 포트를 공개하지 않고 링크 기능을 사용하여 연결하는 컨테이너에게만 포트를 공개할 때는 expose 를 지정합니다. exp..
[Docker] Docker Compose links(컨테이너 간 연결) 컨테이너 간 연결(links) 다른 컨테이너에 대한 링크 기능을 사용하여 연결하고 싶을 때는 links 를 사용하여 연결한 컨테이너명을 설정합니다. links: - logserver - logserver:log01 logserver라는 이름의 컨테이너와 링크시키고 싶을 때는 다음과 같이 지정합니다. links: - logserver 컨테이너명과는 별도로 앨리어스명을 붙이고 싶을 때는 '서비스명:앨리어스명'으로 지정합니다. links: - logserver:log01 또한 서비스 간의 의존관계는 depends_on 을 사용하여 지정할 수 있습니다. depends_on 은 서비스를 시작하는 순서도 지정할 수 있습니다.
[Python] 프로퍼티(Property)-getter, setter, deleter 프로퍼티(property) - 인스턴스 메서드를 인스턴스 변수와 같이 다룸 프로그램을 작성하다 보면 인스턴스 변수의 값을 사용하거나 확인하고 싶은 경우가 있습니다. 예를들어 전자상거래 프로그램에서 할인을 할 때 할인 후 가격은 원래 가격에서 계산해서 반환해야하며, 할인율(%)에 음숫값이나 100을 넘는 값을 설정했을 때는 에러처리를 해야합니다. 파이썬에서는 이런 요청을 실현하기 위한 구조로서 프로퍼티(property) 를 제공합니다. 다음 코드는 실제 프로퍼티 를 사용한 예제입니다. class Book: def __init__(self, raw_price): if raw_price book = Book(2000) >>> book.discounts # 초기 할인율 0 0 >>> book.price # 초기..
[Python] Flask Signal (Blinker) 시그널 플라스크는 시그널(signal) 라이브러리인 Blinker 를 통합한다. 이 라이브러리는 특정 이벤트를 '구독' 했다가 이벤트가 발생했을 때 필요한 함수를 실행한다. 여기서 말하는 이벤트는 고유한 이름표를 갖고 blinker.signal 클래스를 통해 생성된 인스턴스이다. 플라스크 0.12는 요청을 처리하는 과정 중 중요한 순간마다 총 10개의 시그널을 발생시킨다. (시그널은 다음 사이트 참고) 시그널은 connect 함수를 사용해서 특정 이벤트를 등록할 수 있다. 시그널은 코드가 시그널의 send 함수를 호출하면 트리거된다. send 함수는 추가적인 인수를 받아서 모든 등록된 함수에 데이터를 전달한다. 다음 예제에서는 request_finished 시그널에 finished 함수를 등록한다. 우선..
[Python] Flask 전역 공간 (Flask.g) 전역 공간 flask.g 변수에는 모든 전역 정보가 포함돼있고, 원하는 어떤 속성이든 여기에 설정할 수 있다. 플라스크에서 @app.before_request 데코레이터는 요청이 만들어지고 뷰에 전달하기 직전에 호출할 함수가 있을 때 사용한다. before_request 를 사용하는 일반적인 경우는 전역 공간에 값을 저장할 때 이다. before_request 를 사용하면 컨텍스트 안에서 요청되는 모든 함수는 g 변수를 사용해서 데이터를 얻을 수 있다. 다음 예시를 보자 from flask import Flask, jsonify, g, request app = Flask(__name__) @app.before_request def authenticate(): # request.authorization u..
[Python] Flask Session 저장, 불러오기, 삭제 session 객체 플라스크가 각각의 클라이언트 요청에 대해 고유한 request 객체를 만드는 것과 같이 session 객체 역시 각 요청에 대해 고유하게 생성됩니다. session 객체는 딕셔너리와 비슷하며, 플라스크가 사용자 측의 쿠키에 직렬화합니다. 세션에 포함된 데이터는 JSON 형태로 나타나며, zlib를 사용해서 압축되고 최종적으로 base64로 인코딩 됩니다. 세션이 직렬화될 때는 itsdangerous 라이브러리가 애플리케이션 레벨에 정의된 secret_key 값을 사용해 컨테츠를 서명합니다. 서명에는 HMAC과 SHA1를 사용합니다. 이 서명은 데이터에 접미사로 추가되며, 데이터에 서명된 비밀 키를 알지 못하면 클라이언트가 쿠키에 저장된 데이터를 변조할 수 없게 합니다. 데이터 자체는 ..
[Python] Flask url_for 함수 url_for 함수 플라스크의 라우팅 시스템에서 흥미 있는 또 다른 기능은 url_for() 함수 입니다. 이 함수는 주어진 뷰의 실제 URL을 반환합니다. 변수와 컨버터에서 사용한 예제를 사용하겠습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 # app.py from flask import Flask, jsonify, request from werkzeug.routing import BaseConverter, ValidationError ​ USERS = {'1': 'Tom', '2': 'John'} IDS = {val: id for id,..