• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

.나요에러가 구문 {{result.pubdate|formatdatetime}}

20.01.24 10:14 작성 조회수 161

2

안녕하세요.

view.html에서는 잘되었는데...

{{result.pubdate|formatdatetime}}

list.html에서는

{{result.pubdate}}

formatdatetime

이부분이 들어가면 dict 에러가 발생 합니다.

@app.template_filter("formatdatetime")
def format_datetime(value):
    if value is None:
        return ""

    now_timestamp = time.time()
    offset = datetime.fromtimestamp(now_timestamp) - datetime.utcfromtimestamp(now_timestamp)
    value = datetime.fromtimestamp(int(value) / 1000) + offset
    return value.strftime('%Y-%m-%d %H:%M:%S')

@app.route("/list")
def lists():
    # 페이지 값 ( 값이 없는 경우 기본값은 1)
    page = request.args.get("page"1type=int)
    # 한페이지당 몇개의 게시물을 출력할지 설정
    limit = request.args.get("limit"10type=int)
    
    search = request.args.get("search", -1type = int)
    keyword = request.args.get("keyword"type = str)
    
    #최종적으로 완성된 쿼리를 만들 변수
    query = {}
    
    #검색어 상태를 추가할 리스트 변수
    search_list = []
    
    if search == 0:
        search_list.append({"title":{"$regex":keyword}})
    elif search == 1:
        search_list.append({"contents":{"$regex":keyword}})
    elif search == 2:
        search_list.append({"title":{"$regex":keyword}})
        search_list.append({"contents":{"$regex":keyword}})
    elif search == 3:
        search_list.append({"name":{"$regex":keyword}})
        
    # 검색 대상이 한개라도 존재할 경우 query 변수에 $or 리스트를 쿼리 합니다.
    if len(search_list) > 0:
        query = {"$or" : search_list}


    board = mongo.db.board
    datas = board.find({}).skip((page - 1) * limit).limit(limit)

    # 게시물의 총 갯수
    tot_count = board.find({}).count()
    
    # 마지막 페이지의 수를 구합니다.
    last_page_num = math.ceil(tot_count / limit)
    
    # 페이지 블럭을 5개씩 표기
    block_size = 5
    
    # 현재 불럭의 위치
    block_num = int((page - 1) / block_size)
    
    # 블럭의 시작 위치
    block_start = int((block_size * block_num) + 1)
    
    # 블럭의 끝 위치
    block_last = math.ceil(block_start + (block_size - 1))
    
    return render_template(
        "list.html"
        datas = datas,
        limit = limit, 
        page = page,
        block_start = block_start,
        block_last = block_last,
        last_page_num = last_page_num
       )

혹시 오타가 있을까봐. 

소스까지 넣어봤습니다.

답변 11

·

답변을 작성해보세요.

1

print(type(value))

로 value 값의 타입을 한번 출력해보시길 바랍니다. 

1

제 개인적인 의견을 드리자면 이쪽 분야 전공이 아니라 어렵다는 말보다는 익숙하지 않아서 어렵다는게 더 어울릴수도 있고 아니면 목표를 너무 크고 높게 잡았거나 급한 마음을 갖으셔서 그럴수도 있지 않을까 생각해봅니다. 보통 이정도 과정을 오프라인 학원에서 수강을 하게 되면 6개월 정도의 과정으로 진행할텐데 그걸 단기간에 끝내셨다는거 자체가 대단한거일 수도 있습니다. 

저는 개인적으로 프로그래밍 분야는 어렵고 쉽고 보다는 재미있냐 없냐의 관점에서 보는게 맞다고 생각됩니다. 물론 사람마다 기호화 관심이 다르기 때문에 모든 사람들이 프로그래밍을 재미있어 할꺼라 생각되진 않지만 세상 만사가 모르면 어렵고 알면 쉬운거기 때문에 어렵다 쉽다의 관점으로 접근하기엔 다소 위험성이 있지 않을까 생각됩니다. ^^;;;

몽고DB는 다른 RDBMS 에 비해 하드웨어에 좀 더 민감한 부분이 많습니다. 특히나 메모리를 많이 타는것 같습니다. DB용량으로 30기가면 어떻게 보면 많은 데이터는 아닐수도 있고 많은 데이터라고 볼 수도 있겠습니다만 몽고DB가 구동중인 하드웨어를 모르니 어떻다 답을 드리기는 어렵습니다. 데이터의 성질과 find 쿼리역시 중요한 요소가 될 수 있을것 같습니다. 말씀하신데로 find 쿼리에 여러가지 필터링을 해서 테스트를 해보시는게 좋을듯 합니다. 또한 몽고DB 데이터에 인덱스를 활용하는 방법도 있습니다. 혹은 DB 구조를 아예 다시 설계하는게 좋은 경우도 종종 있습니다. 너무 방대한 분야며 노하우적인 분야라서 어려울수도 있습니다만 사실 IT 분야가 항상 이런 봉착한 문제를 해결하는게 대부분이라... ^^;;;

https://docs.mongodb.com/manual/tutorial/optimize-query-performance-with-indexes-and-projections/

몽고DB 공식 사이트인데 영문으로 나오나 요즘은 구글 번역기가 훌륭하여 어느정도 맥락은 잡을 수 있을꺼라 생각됩니다. 저는 몽고DB에 대한 정보를 대부분 구글링을 통해 얻거나 공식사이트를 많이 참조하는 편 입니다.

1

남박사님.. 수십번. 들여다 보고.. 또 들여다 보고 해서.. 

강의 수강 완료 했습니다. 

마지막 부분 이미지랑 파일 업로드 부터 뒷부분은 모두 생략 했습니다.  ( 강의는 모두 들었구요~~ )

이쪽 분야 전공이 아니라 어렵네요..

flask 다뤄서 몽고 db 데이터 뿌려 보는것만 해보려고 시작했는데.. 

배우면 배울수록.. 이쪽은 하면 안되겠다는 생각만 드네요. ~~~~~

따로 공부하고 있는 몽고DB 서버에서 내용 불러와서 화면에 뿌리는것 까지는 성공을 했습니다.

그런데.. 몽고DB 용량이 30기가 정도 되는데.. find를 하니깐 시간이 어마어마 하게 걸리고 있습니다.

아마 쿼리 부분을 날자 별로 설정하여 검색을 하는게 맞을것 같은데요.. 

참고할만한 좋은 사이트 추천해주시면.. 열공하도록 하겠습니다. ^^*

1

제가 직접 한번 돌려봤으면 좋을듯 합니다. DB도 문제 없고 코드도 별 문제 없어 보이는데 왜 그런 오류가 나는지 내용만 봐서는 알기가 힘들듯 합니다. 귀찮으시겠지만 사용하신 코드를 전체 압축하셔서 업로드 해주시면 확인해보도록 하겠습니다.

1

안녕하세요... 

답변 감사합니다. 소스는 여러번 보고 따라했는데..

오타는 없는것 같습니다.

        <!-- 반복되는 구간 -->
        {% for data in datas %}
        <tr>
            <td>{{loop.index + ((page - 1) * limit)}}</td>
            <td><a href="{{url_for('board_view',idx=data._id)}}">{{data.title}}</a></td>
            <td>{{data.name}}</td>
            <td>{{data.pubdate}}</td>
            <td>{{data.view}}</td>
        </tr>
        {% endfor %}
        <!--반복되는 구간 끝 -->

위와 같이 넣었을때는 정상 적으로 출력이 됩니다.

data.pubdate|formatdatetime

위부분만 들어가면 저렇게 나오는것 같습니다.

하나씩 다시 체크해보도록 하겠습니다.

1

'dict object' has no attribute 'pubdate' 

위 오류는  dict 자료형인 data에 pubdate 라는 항목이 없다고 나오는 오류 입니다. 실제 데이터베이스에 pubdate 가 정상적으로 존재하는지 혹은 대소문자에는 오류가 없는지 먼저 확인해보시길 바랍니다. 올려주신 코드에는 별 문제가 없습니다.

1

안녕하세요.

프로그램은 동일하게 했습니다.

    <tbody>
        <!-- 반복되는 구간 -->
        {% for data in datas %}
        <tr>
            <td>{{loop.index + ((page - 1) * limit)}}</td>
            <td><a href="{{url_for('board_view',idx=data._id)}}">{{data.title}}</a></td>
            <td>{{data.name}}</td>
            <td>{{data.pubdate|formatdatetime}}</td>
            <td>{{data.view}}</td>
        </tr>
        {% endfor %}
        <!--반복되는 구간 끝 -->
    </tbody>
</table>

오류가 나는 화면 입니다.

1

view.html 에서 처럼 {{result.pubdate | formatdatetime}} 이렇게 쓰시는게 맞습니다. {{ A | B }} 처럼 쓰셔야 A의 데이터를 B의 필터를 사용해서 표기하게 됩니다. 그런데 list.html 에서 

{{result.pubdate}}

formatdatetime

이렇게만 쓰셨는데 실제 어떻게 사용하셨다는건지를 모르겠습니다. html 파일에 대한 내용도 올려주셔야 알 수 있을듯 합니다. 

0

가후님의 프로필

가후

2021.02.07

근데또 궁금증이 생기네요

@app.template_filter("formatdatetime")
def format_datetime(value):
    if value is None:
        return ""

이렇게 value가 None 일때는 "" 공백을 리턴하기로 되어있는데

왜 오류가 나는지 , 이걸또 이해 못하겠네요..

0

가후님의 프로필

가후

2021.02.07

자문자답합니다...

제 로우 데이터가 50개뿐이 없는줄알았는데, 여러번 반복되어서

650개 가까이 되었네요

자료를 살펴보니 pubdate 에 값이 안들어가있는 

로우를 발견하여 삭제하니 잘됩니다.. 

저와같이 처음하는 초보분들도 있을거 같아서, 해결되었지만

창피한 질문을 했던걸 지우지 않고

함께, 해결책도 남겨놓아 봅니다.

0

가후님의 프로필

가후

2021.02.07

이거 해결하셨나요? 저도 같은 오류가 나네요.

{{data.pubdate | formatdatetime}}

위코드는  오류나고

{{data.pubdate}}

이코드는 오류나지 않네요

그리고, mongodb 에도

pubdate 전부 값  들어가있구요.. 

오타찾아봐도 없고

view.html은 파일에서는 잘되는걸봐서는

다른분들도 같은 오류 격으신분이 있으실텐데 어떻게 해결하셨을까요 

해결하신분들 도움좀 주세요