News Link
뉴스/아티클 URL을 저장하고, 제목/요약/대표 이미지를 추출해 카드 형태로 보여주는 Flask 웹앱입니다.
구성
app.py: Flask 서버, DB 연결, 메타데이터 추출, APItemplates/index.html: 초기 화면(SSR) + 모달 UIstatic/app.js: 무한 스크롤(30개 단위), URL 붙여넣기 파싱, 추가/갱신static/styles.css: 스타일static/placeholder.svg: 이미지 없을 때 표시용
요구사항
- Python 3.x
- PostgreSQL
- (권장) 미니콘다 환경:
ncue
설치
pip install -r requirements.txt
환경변수(.env)
프로젝트 루트에 .env 파일을 만들고 아래 값을 설정하세요. (.env는 git에 커밋되지 않습니다)
DB_HOST=...
DB_PORT=5432
DB_NAME=...
DB_USER=...
DB_PASSWORD=...
TABLE=news_link
옵션(선택):
PORT=8021
DB_SCHEMA=public
DEFAULT_AUTHOR_ID=1
DEFAULT_PAGE_SIZE=30
MAX_PAGE_SIZE=60
CACHE_TTL_SECONDS=3600
FAILED_TTL_SECONDS=300
DB 스키마
TABLE(기본 news_link) 테이블에 아래 컬럼이 필요합니다.
idurlcreated_at
예시(참고):
CREATE TABLE IF NOT EXISTS news_link (
id SERIAL PRIMARY KEY,
url TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
실행
python app.py
기본 접속 주소:
http://localhost:8021
API
GET /links?limit=30&offset=0- 30개 단위로 링크를 가져옵니다(프론트 무한 스크롤).
- 응답:
items: 링크 배열next_offset: 다음 요청 offsethas_more: 다음 페이지 존재 여부
POST /links- body:
{ "url": "https://..." } - URL을 DB에 저장하고 메타데이터를 추출해 반환합니다.
- body:
동작 메모
- 초기 화면은 DB에서 첫 페이지(기본 30개) 만 가져와 SSR로 즉시 렌더링합니다.
- 메타데이터 추출은 캐시를 사용합니다(성공/실패 TTL 각각 적용).
ncue.net 연동 (ref 전달)
ncue.net의 /go에서 아래와 같이 전달되는 값을 받아 author_id(text)에 저장합니다.
- 로그인 사용자:
ref_type=email&ref=<email> - 비로그인 사용자:
ref_type=ip&ref=<ip>
이 값은 최초 진입 시 쿼리스트링으로 들어오며, 이후 요청에서도 유지되도록 서버가 쿠키로 저장합니다.
Description
Languages
Python
58.1%
JavaScript
24%
HTML
15.6%
Shell
1.2%
CSS
1.1%