인프런 커뮤니티 질문&답변

Bokhee Hong님의 프로필 이미지
Bokhee Hong

작성한 질문수

남박사의 파이썬으로 실전 웹사이트 만들기

게시판만들기 - 글 리스트

왜 list창으로 넘어가지 않나요?

작성

·

481

·

수정됨

0

  •  로그인, 글쓰기 모두 이상 없는데... list 클릭 시 하기처럼 Error 가 발생합니다

  • OS는 윈도우10 Mongodb 4.2.22 입니다

    파일 "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", 2551 행, 안으로 __call__

        def __call__(self, environ: dict, start_response: t.Callable) -> t.Any:
            """The WSGI server calls the Flask application object as the
            WSGI application. This calls :meth:`wsgi_app`, which can be
            wrapped to apply middleware.
            """
            return self.wsgi_app(environ, start_response)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  • 파일 "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", 2531 행, 안으로 wsgi_app

                try:
                    ctx.push()
                    response = self.full_dispatch_request()
                except Exception as e:
                    error = e
                    response = self.handle_exception(e)
                               ^^^^^^^^^^^^^^^^^^^^^^^^
                except:  # noqa: B001
                    error = sys.exc_info()[1]
                    raise
                return response(environ, start_response)
            finally:
  • 파일 "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", 2528 행, 안으로 wsgi_app

            ctx = self.request_context(environ)
            error: t.Optional[BaseException] = None
            try:
                try:
                    ctx.push()
                    response = self.full_dispatch_request()
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                except Exception as e:
                    error = e
                    response = self.handle_exception(e)
                except:  # noqa: B001
                    error = sys.exc_info()[1]
  • 파일 "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", 1825 행, 안으로 full_dispatch_request

                request_started.send(self)
                rv = self.preprocess_request()
                if rv is None:
                    rv = self.dispatch_request()
            except Exception as e:
                rv = self.handle_user_exception(e)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            return self.finalize_request(rv)
     
        def finalize_request(
            self,
            rv: t.Union[ft.ResponseReturnValue, HTTPException],
  • 파일 "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", 1823 행, 안으로 full_dispatch_request

     
            try:
                request_started.send(self)
                rv = self.preprocess_request()
                if rv is None:
                    rv = self.dispatch_request()
                         ^^^^^^^^^^^^^^^^^^^^^^^
            except Exception as e:
                rv = self.handle_user_exception(e)
            return self.finalize_request(rv)
     
        def finalize_request(
  • 파일 "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", 1799 행, 안으로 dispatch_request

                and req.method == "OPTIONS"
            ):
                return self.make_default_options_response()
            # otherwise dispatch to the handler for that endpoint
            view_args: t.Dict[str, t.Any] = req.view_args  # type: ignore[assignment]
            return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     
        def full_dispatch_request(self) -> Response:
            """Dispatches the request and on top of that performs request
            pre and postprocessing as well as HTTP exception catching and
            error handling.
  • 파일 "D:\PM_WebService\run.py", 137 행, 안으로 lists

            query = {"$or": search_list}
     
        board = mongo.db.board
        datas = board.find(query).skip((page-1) * limit).limit(limit)
     
        tot_count = board.find(query).count()
                    ^^^^^^^^^^^^^^^^^^^^^^^
        last_page_num = math.ceil(tot_count / limit)
     
        block_size = 5
        block_num = int((page-1) / block_size)
        block_start = int((block_size * block_num) + 1)

답변 8

0

Bokhee Hong님의 프로필 이미지
Bokhee Hong
질문자

그럼 강의했을 때 몽고db 버전을 올려주시면 설치해 보겠습니다

남박사님의 프로필 이미지
남박사
지식공유자

몽고DB 4.2.2 를 사용중이시면 그건 그냥 둬보시고, pymongo 를 강의 버전에서 사용한 3.9.0 버전으로 설치해보시는것도 방법이 되지 않을까 합니다. 작성자님의 환경을 최대한 비슷하게 구현해서 테스트 했을때 몽고DB 4.2.2 + pymongo 3.9.0에서 문제 없이 구동 되는 것까지는 제가 확인했습니다.ongo==3.9.0

pip install pymongo==3.9.0

기존 pymongo를 제거한 후 위 버전을 설치해보시고, 제가 테스트를 해보긴 했으나 환경이 100% 일치한다는 장담은 할 수 없으니 문제가 발생하면 다시 질문 주시기 바랍니다. 아니면 디스코드 아이디 남박사#4445 로 문의주시기 바랍니다.

0

남박사님의 프로필 이미지
남박사
지식공유자

네, 답답하신 심정 이해갑니다만 현재 강의는 몽고디비 4.x 버전을 기준으로 하지 않습니다. 그래서 되도록 강의 환경과 동일한 환경을 구축하시는걸 강의 초반에 당부드리는 이유기도 합니다. 참고로 몽고디비는 3.9 버전을 기점으로 상당히 많은 내용과 개념이 변경되었습니다.

버전업에는 단순히 어떤 함수명이 변경되는 수준이 아니라 개념 자체가 바뀌는 경우도 많습니다. 그래서 실제 서비스를 운영할때도 프로그램이 버전업 되었다고해서 실제 서비스 중인 프로그램을 절대 쉽게 업그레이드 하지 않습니다. 이런 버전업은 단순히 스마트폰의 펌웨어를 최신버전으로 업그레이드 하는 관점과는 완전 다른 부분입니다. 그러기에 그 모든 버전에 따라 강의 내용을 수정할 수가 없는 부분도 있습니다.

지금 사용중이신 버전에서 단순히 count()함수를 count_documents()로 변경해서 되는 부분이 있고 안되는 부분도 많습니다만 그리고 지금 올려주신

pymongo.errors.ServerSelectionTimeoutError: mongo:27017: [Errno 11001] getaddrinfo failed, Timeout: 30s, T

위 오류의 내용은 count()함수와 count_documents()함수로 인해 발생하는 문제가 아니라 몽고디비 서버가 반응하지 않아 타임아웃이 발생한 오류로 보입니다. getaddrinfo함수가 failed 되었다는 이야기는 이는 서버가 동작하지 않아서 생기는 문제일수도 있고 접속 URI 문자열의 주소 혹은 포트로 접속할 수 없어서 생기는 문제입니다. 물론 안타깝게도 왜 그런 문제가 생겼는지는 제가 환경까지 알 수 없기 때문에 뭐라고 답변을 드릴 수가 없습니다.

이제 공부를 시작하시는 입장에선 모든 오류가 다 답답하고 힘드시겠지만 최대한 강의와 동일한 환경에서 자세한 정보를 주셔야 제가 답변을 해드릴 수 있습니다. 물론 프로그래밍은 수학 문제가 아니기 때문에 문제에 정답을 드릴 수 없을 때가 많습니다.

저로서는 충분히 생각해보고 어떤 가능성에 대한 방향을 제시해 드리지만 때로 제가 드린 답변으로 해결 되지 않을 수도 있습니다.

0

Bokhee Hong님의 프로필 이미지
Bokhee Hong
질문자

아래 3개 모두 count()를 count_documents() 로 변경했는데도 안됩니다.

-Board.py

tot_count = board.find(query).count_documents()

-list.html

% if datas.count_documents() > 0 %}

-member

.pycnt = members.count_documents({"email": email})

 

* Restarting with stat

* Debugger is active!

* Debugger PIN: 931-800-023

127.0.0.1 - - [23/Mar/2023 18:52:27] "POST /member/join HTTP/1.1" 500 -

Traceback (most recent call last):

File "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", line 2551, in call

return self.wsgi_app(environ, start_response)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", line 2531, in wsgi_app

response = self.handle_exception(e)

^^^^^^^^^^^^^^^^^^^^^^^^

File "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", line 2528, in wsgi_app

response = self.full_dispatch_request()

^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", line 1825, in full_dispatch_request

rv = self.handle_user_exception(e)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", line 1823, in full_dispatch_request

rv = self.dispatch_request()

^^^^^^^^^^^^^^^^^^^^^^^

File "D:\PM_WebService\venv\Lib\site-packages\flask\app.py", line 1799, in dispatch_request

return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "D:\PM_WebService\main\member.py", line 24, in member_join

cnt = members.count_documents({"email": email})

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "D:\PM_WebService\venv\Lib\site-packages\pymongo\collection.py", line 1842, in count_documents

return self._retryable_non_cursor_read(_cmd, session)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "D:\PM_WebService\venv\Lib\site-packages\pymongo\collection.py", line 1847, in retryablenon_cursor_read

with client._tmp_session(session) as s:

File "C:\Program Files\Python311\Lib\contextlib.py", line 137, in enter

return next(self.gen)

^^^^^^^^^^^^^^

File "D:\PM_WebService\venv\Lib\site-packages\pymongo\mongo_client.py", line 1757, in tmpsession

s = self._ensure_session(session)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "D:\PM_WebService\venv\Lib\site-packages\pymongo\mongo_client.py", line 1740, in ensuresession

return self.__start_session(True, causal_consistency=False)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "D:\PM_WebService\venv\Lib\site-packages\pymongo\mongo_client.py", line 1685, in __start_session

self._topology._check_implicit_session_support()

File "D:\PM_WebService\venv\Lib\site-packages\pymongo\topology.py", line 538, in checkimplicit_session_support

self._check_session_support()

File "D:\PM_WebService\venv\Lib\site-packages\pymongo\topology.py", line 554, in checksession_support

self._select_servers_loop(

File "D:\PM_WebService\venv\Lib\site-packages\pymongo\topology.py", line 238, in selectservers_loop

raise ServerSelectionTimeoutError(

pymongo.errors.ServerSelectionTimeoutError: mongo:27017: [Errno 11001] getaddrinfo failed, Timeout: 30s, Topology Description: <TopologyDescription id: 641c213a2c8965dc7b56a160, topology_type: Unknown, servers: [<ServerDescription ('mongo', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('mongo:27017: [Errno 11001] getaddrinfo failed')>]>

127.0.0.1 - - [23/Mar/2023 18:52:28] "GET /member/join?__debugger__=yes&cmd=resource&f=style.css HTTP/1.1" 304 -

127.0.0.1 - - [23/Mar/2023 18:52:29] "GET /member/join?__debugger__=yes&cmd=resource&f=debugger.js HTTP/1.1" 304 -

127.0.0.1 - - [23/Mar/2023 18:52:29] "GET /member/join?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 304 -

127.0.0.1 - - [23/Mar/2023 18:52:30] "GET /member/join?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 304 -

0

Bokhee Hong님의 프로필 이미지
Bokhee Hong
질문자

참고로 Mongodb 4.2.24 입니다 최근에 6.XXX 사용하다 강의 내용 보고 비슷한 버전으로 Down 했는데...

0

Bokhee Hong님의 프로필 이미지
Bokhee Hong
질문자

막연하게 어디 부분 이라고만 힌트를 주고 찾아보라고 하면 뭐하러 수강 한가요? 저처럼 초보자들은 접근도 못하겠네요

0

Bokhee Hong님의 프로필 이미지
Bokhee Hong
질문자

상위 버전에서 변경된 부분은 최근에 수강자들에게 공지를 해줘야 하는 것 아닌가요? 소스를 어디를 변경해야 한다던지 아니면 변경된 소스를 수정해서 업로드 하던지

 

0

Bokhee Hong님의 프로필 이미지
Bokhee Hong
질문자

하기처럼 수정한가요? run.py에서

tot_count = board.count_documents()

0

남박사님의 프로필 이미지
남박사
지식공유자

tot_count = board.find(query).count()

위 문제는 이전에 질문하셨던 내용과 동일한 내용입니다. 몽고디비 상위 버전에서 위의 코드에서처럼 count() 함수가 변경되어 발생하는 오류로 보입니다. 이전 답변에서처럼 count()함수 대신 count_documents()함수를 사용해보시길 바라며, 사용중이신 해당 버전에 대한 공식 문서를 참고하셔서 콜렉션 카운팅에 대한 내용을 확인해보시길 바랍니다.

 

 

Bokhee Hong님의 프로필 이미지
Bokhee Hong

작성한 질문수

질문하기