[Python #13] [Django #6] 내 포스팅 검색

pixabay

오늘은 내게 제일 필요한 기능, 내 포스팅 검색 기능을 구현해본다.

일단 간단하게 태그, 제목, 내용 세 가지 옵션에서 입력한 키워드가 포함된 모든 글을 검색하는 기능을 만들어 보자.
query는 dict 포맷으로 그 안에는 tags, titles, texts 세 가지 키를 넣고, 모두 리스트로 받는다.

        query = {
            'tags': [],
            'titles': [],
            'texts': []
        }

초기 로직은 1) 빈 리스트 생성 후 2) 내 포스팅 목록에서 키워드가 포함된 글만 추출하여 리스트에 저장하는 거였는데... 문제가 많다. tags, titles, texts 세 조건을 조금만 잘 못 체크해도 같은 글을 중복으로 저장할 수 있다는 것이다. 그럼 리스트가 아닌 집합으로 하면 될 것 같아 해 봤지만 dict은 집합에 추가할 수 없는 듯하다. 또한 불필요한 코드가 많아질 것 같다.

그럼 로직을 반대로 해보는 건?
tags, titles, texts의 모든 값이 글에 포함되지 않을 경우 글을 포스팅 목록에서 지워버리는 것이다. 첫 로직보다 훨씬 간단할 것 같다.

  1. 불러온 포스팅 목록의 복사본을 반복문으로 돌린다.
  2. 조건에 맞지 않는 글일 경우 목록에서 제거한다.
    • tags: query와 글 모두 리스트이므로, 두 리스트의 교집합으로 참 거짓 판단. not 키워드를 사용하여 반대로 판단.
    • titles: query는 list이고, 글 타이틀은 String이기 때문에 for문을 또 돌려야 할 판. 다행히 python 내장 함수 all로 간단하게 만들 수 있었다. 이 또한 not 키워드로 반대로 판단한다.
    • texts: titles와 같은 로직이다. 이 세 조건을 and로 연결하면 성공. if 문이 좀 길어지는 게 거슬리기는 하지만 전문가가 아니니 그냥 넘어가자.
      👇
import json
from steem import Steem


def tag_list(json_metadata: str):
    metadata = json.loads(json_metadata)
    if metadata:
        return metadata['tags']
    else:
        return []


def search_blogs(query: dict, account: str = 'june0620'):

    s = Steem()
    blogs = s.get_blog(account, 0, 400)
    for blog in blogs[:]:
        blog_data = blog['comment']
        title = blog_data['title'].lower()
        body = blog_data['body'].lower()
        tags = tag_list(blog_data['json_metadata'])
        q_titles = query['titles']
        q_texts = query['texts']
        q_tags = query['tags']
        if not set(q_tags) & set(tags) and all(q_title not in title for q_title in q_titles) and all(q_text not in body for q_text in q_texts):
            blogs.remove(blog)
    return blogs


메인 함수는 대충 된 것 같다. 간단하게 테스트해 봤는데 문제가 보이지 않는다.
그럼 페이지에 쏴 볼까나? UI는 아직 안 만들어서 기존 페이지를 조금 수정해서 해보자. 검색어도 일단 수동으로 입력한다. 👇

        query = {
            'tags': ['django', 'music'],
            'titles': ['온워드', '炸鸡腿'],
            'texts': ['사랑하겠습니다', '몸빵잼']
        }


👇 다행히 잘 돌아간다. 키워드를 바꿔가며 테스트해 봤는데 아직까지는 문제가 없어 보인다. UI를 빨리 만들어 내가 가장 필요로 했던 기능을 맘껏 써봐야겠다. 나중에는 좀 더 복잡한 조건도 추가해 봐야겠다.


[Cookie 😅]
Python 3.7.4
Django 2.2.4
steem-python 1.0.1
goorm IDE 1.3

Sort:  

[US$18.50](▼39%)[Xiaomi]🚨2020 최신 항바이러스 필터 입고!!🚨 샤오미 공기청정기 필터 / 미에어 필터 / 고효율 정화 / 활성탄 필터 / 포름알데히드 제거 / 고밀도 헤파필터 / 무료배송

WWW.QOO10.COM

@june0620 transfered 1.0 KRWP to @krwp.burn. voting percent : 0.74%, voting power : 78.77%, steem power : 1890930.93, STU KRW : 1200.
@june0620 staking status : 60 KRWP
@june0620 limit for KRWP voting service : 0.12 KRWP (rate : 0.002)
What you sent : 1.0 KRWP
Refund balance : 0.88 KRWP [46264884 - bf687a882781a0e6356bd6b019023201ea210065]

Coin Marketplace

STEEM 0.15
TRX 0.03
JST 0.025
BTC 12156.53
ETH 378.09
USDT 1.00
SBD 0.99