작성
·
488
2
게시판 글 리스트 하던중 검색에서 부터 에러가 발생하였습니다.
두곳 find 값을 {}로 하고 save하고 창을 띄우면 우선 창은 뜸니다
그런데 자동적으로 검색창 안에 None이라고 떠있습니다.
파이썬 이라고 검색하면 우선 검색은 되는데 터미널에 '$regex': None
검색어인 파이썬 이라고 떠야 하는 것을 알고 있습니다.
그리고 주소창에 keyword=파이썬이라고 우선 뜨지만 페이지를 변경하거나 상새페이지로 이동하면
keyword=파이썬이란 글이 유지되지 않고 사라집니다
동영상 강의대로 keyword=keyword, search=search page=page 각각 다 추가하였는데 이런 현상이 발생됩니다.
lists에 있는 find 두속에 {}를 지우고 query집어넣으면 에러 창이 뜹니다.
pymongo에 문재란거 같은대 내용으로썬 잘 이해가 안가는 내용입니다.
run.py 에 view method 맨 아래 search=search에 에러표기도 되었습니다.
60분짜리 강의여서 coding도 많았고 좀 많은 문제가 발생한거 같습니다.
확실히 기역하는것은 검색부터 문제가 시작되었고 find(query)라고 에러창도 뜨기 시작한것입다.
아래에 run.py에 lists부분과 list.html에 search function쪽 제가 코딩을 업로드 해놨습니다.
답변 2
1
pymongo.errors.OperationFailure: $regex has to be a string
는 regex 는 문자열이어야 한다 뭐 그런 뜻으로 보시면 될 것 같습니다. 위의 상황에서 검색어를 입력하지 않은 경우
keyword = request.args.get("keyword", type=str)
이렇게만 하면 keyword 값이 존재 하지 않는 경우 keyword 변수에는 None 값이 들어가게 됩니다. 그로인해 find() 함수 호출시 검색 조건에 None 이 기입되어있을테고 그래서 파이몽고가 None 을 입력받았기 때문에 오류가 발생하고 None 이 아닌 문자열 값을 넘겨달라는 오류 입니다.
keyword = request.args.get("keyword", "", type=str)
위와 같은 식으로 기본값을 "" 빈 문자열로 설정하면 해당 문제는 해결되리라 보여집니다.
그리고 view 에 워닝으로 표기되는 search 값은 해당 밑줄에서 마우스 오버를 해보시면 오류의 원인이 나옵니다 그 부분을 참고하셔야 할듯 합니다. 단순 pylint 의 경고성 표기인지 오류인지 위의 스샷만 봐서는 알 수가 없을듯 합니다.
"파이썬" 검색시에 페이지를 변경하거나 상세페이지를 들어가면 값이 사라진다고 하셨는데 페이지 변경이 어떤걸 말씀하시는지 몰라 그 부분은 정확한 답을 드리기가 어렵겠고 상세페이지를 들어가면 값이 사라지는건 상세페이지로 링크를 하게 되는 경우
<!--반복되는 구간-->
{% for data in datas %}
<tr>
<td>{{(tot_count + 1) - (loop.index + ((page - 1) * limit))}}</td>
<td><a href="{{url_for('board.board_view', idx=data._id, page=page, search=search, keyword=keyword)}}">{{data.title}}</a></td>
<td>{{data.name}}</td>
<td>{{data.pubdate | formatdatetime}}</td>
<td>{{data.view}}</td>
</tr>
{% endfor %}
<!--반복되는 구간 끝-->
그러니까 위의 리스트가 출력되는 html 에서 board_view 링크에 search 와 keyword 값이 제대로 설정되어있는지부터 확인해보셔야 할듯 합니다. 브라우저에서 해당 검색 결과 리스트를 출력해놓은 상태에서 마우스 우클릭 > 소스보기를 하시면
위의 이미지에서처럼 search 와 keyword 값이 소스보기상에 나타나야 합니다. 여기서 문제가 없다면 py 파일의 view 함수에서 해당 search, keyword 변수값이 제대로 request 되는지 확인해보셔야 합니다.
def board_view(idx):
#idx = request.args.get("idx")
if idx is not None:
page = request.args.get("page")
search = request.args.get("search")
keyword = request.args.get("keyword")
print("페이지:{} 대상:{} 검색어:{}".format(page, search, keyword))
board = mongo.db.board
# data = board.find_one({"_id": ObjectId(idx)})
data = board.find_one_and_update({"_id": ObjectId(idx)}, {"$inc": {"view": 1}}, return_document=True)
위의 코드에서처럼 print 문을 활용하여 값이 제대로 넘어왔는지 확인해보시길 바랍니다.
0