create account

[Python #14] [Django #7] 내 포스팅 검색 #2 by june0620

View this thread on: hive.blogpeakd.comecency.com
· @june0620 ·
$1.84
[Python #14] [Django #7] 내 포스팅 검색 #2
pixabay
https://cdn.pixabay.com/photo/2019/05/14/17/07/web-development-4202909_1280.png

[지난 시간](https://steemit.com/hive-101145/@june0620/python-13-django-6)에 구현한 검색을 좀 더 다듬어 봤다. 사용하다 보니 문제가 보였기 때문이다. tag, title, body 값을 모두 넣으면 조건에 맞는 모든 결과가 검색되는데 생각해보니 내가 의도한 바와는 조금 다르다. 즉 tag or title or body로 연산된 것. 

보통 이 세 개값을 동시에 사용하여 검색할 경우, tag가 포함된 글목록에서 title 혹은 body값이 포함되어 있는 글을 추가로 검색하기 위해서다. 즉 tag and (title or body). 

그럼 바꿔보자. 바꾸는 김에 python의 클래스로 구현해 보자. 아직까지 클래스가 어떤 점에서 더 좋은지는 모르겠지만 일단 해보자. (#python초보#어렵다어려워)

##### services.py

1. 검색 클래스를 services.py 내에 생성 후 전역 변수 account, q_titles, q_texts, q_tags, blogs 설정 
2. __init__ 함수로 기본 인자 query를 dict으로 설정 및 전역변수에 값 할당
3. search_posts 함수에 검색 기능 추가. tag 값이 없거나 혹은 매칭 되는 값이 있을 경우에만 추가로 title 혹은 body 값 체크, 값이 매칭될 경우 새 list에 추가
4. title과 body 값 체크는 하나의 함수에 넣기에 가독성이 떨어지므로 is_keywords_contains로 분리
5. 글의 태그 값 추출을 위한 get_tags 함수 생성

```
import json
from steem import Steem


class Search:
    s = Steem()
    account = 'june0620'
    q_titles = []
    q_texts = []
    q_tags = []
    blogs = []

    def __init__(self, query: dict):
        self.q_titles = query['titles']
        self.q_texts = query['texts']
        self.q_tags = query['tags']
        self.blogs = self.s.get_blog(self.account, 0, 400)

    def search_posts(self):
        s_blogs = []
        for blog in self.blogs[:]:
            blog_data = blog['comment']
            title = blog_data['title'].lower()
            body = blog_data['body'].lower()
            tags = self.get_tags(blog_data['json_metadata'])
            if not self.q_tags or set(self.q_tags) & set(tags):
                if self.is_keywords_contains(title, body):
                    s_blogs.append(blog)
        return s_blogs

    def is_keywords_contains(self, title: str = [], body: str = []):
        if any(q_title in title for q_title in self.q_titles):
            return True
        if any(q_text in body for q_text in self.q_texts):
            return True
        return False

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

```
![](https://cdn.steemitimages.com/DQmbEpGTwUDzwmECJT12w2fQgpTKERTYcUUJQM34jENqCjM/image.png)

##### views.py 

django의 ListView를 상속받아 queryset에 검색된 목록을 넣어주고 html에 뿌려준다. 
```
from django.http import HttpResponse
from django.views.generic import ListView
from .services import Search
from steem import Steem

s = Steem()


def main_view(request):
    data = s.get_account('june0620')
    response = HttpResponse()
    response.write(data)
    return response


class posts(ListView):
    template_name = 'album.html'
    context_object_name = 'all_posts'

    def get(self, request, *args, **kwargs):
        # self.queryset = s.get_blog(kwargs['account'], entry_id=0, limit=100)
        query = {
            'tags': ['kr'],
            'titles': ['python'],
            'texts': ['사랑하겠습니다']
        }
        se = Search(query=query)
        self.queryset = se.search_posts()
        return super().get(request, *args, **kwargs)
```

![](https://cdn.steemitimages.com/DQmbXLZvspSFdpEbstMw34PAQa3P8MmFWBiFamLDSrGvDGm/image.png)

##### Results

간단하게 테스트해보니 잘 되는 듯하다. (나중에는 django의 test 기능도 좀 써봐야겠다.) 
![](https://cdn.steemitimages.com/DQmUdGzz9HsnXQKMK3ZDnLf7gpYmWkCTJQKU31RqUCxXzZg/image.png)

***

**[Cookie 😅]**
Python 3.7.4
Django 2.2.4
steem-python 1.0.1
goorm IDE 1.3
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
properties (23)
authorjune0620
permlinkpython-14-django-7-2
categoryhive-132971
json_metadata{"app":"peakd/2020.08.3","format":"markdown","tags":["kr","dev","whalepower","dblog","palnet","python","goorm"],"users":["june0620"],"links":["https://steemit.com/hive-101145/@june0620/python-13-django-6"],"image":["https://cdn.pixabay.com/photo/2019/05/14/17/07/web-development-4202909_1280.png","https://cdn.steemitimages.com/DQmbEpGTwUDzwmECJT12w2fQgpTKERTYcUUJQM34jENqCjM/image.png","https://cdn.steemitimages.com/DQmbXLZvspSFdpEbstMw34PAQa3P8MmFWBiFamLDSrGvDGm/image.png","https://cdn.steemitimages.com/DQmUdGzz9HsnXQKMK3ZDnLf7gpYmWkCTJQKU31RqUCxXzZg/image.png"]}
created2020-08-29 06:21:12
last_update2020-08-29 06:21:12
depth0
children0
last_payout2020-09-05 06:21:12
cashout_time1969-12-31 23:59:59
total_payout_value0.970 HBD
curator_payout_value0.866 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length3,438
author_reputation118,592,211,436,406
root_title"[Python #14] [Django #7] 내 포스팅 검색 #2"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id99,334,558
net_rshares6,423,921,912,876
author_curate_reward""
vote details (55)