55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
댓글 ajax기능으로 수정하는 단계에서 오류 추가 질문 !
개발 마지막 단계인 댓글 ajax기능으로 수정하는 단계에서 2개 오류가 생겼습니다. 하나는 mongoDB에 myweb 폴더 안에 comment 라고 두개가 생겨서 댓글관련된 db가 모여있었습니다. 어떻게 생긴건지 모르겠는데 삭제도 될지 잘 모르겠어서 우선 나둔 상태입니다. 삭재해도 된다면 지우고 그 강의만 다시해보려고 합니다. 그리고 그리고 지금 상태로 우선 맨 마지막 단계인 댓글수정에서 저장과 취소에서 취소도 된거 같은데 저장에서 저장을 누르면 db에는 수정한데로 저장이 되는데 view 상으로는 완료가 되지 안습니다. 어디가 잘못된건지 몰라 마무리를 짓지 몰하고 있습니다. upload 해주신 file과 비교하면서 문제점을 찾아보려고 했는데 동영상 강의에 나오는 coding과 올려주신 파일 coding이 약간 다른점들이 보이는데 제가 초보라 그차이로는 비교가 안되더라고요
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
안녕하세요, 강의 듣기전에 몇가지 질문할게 있어서요.
안녕하세요. 저는 머신러닝을 공부하고 있는 학생인데요. 머신러닝을 이용한 프로젝트를 제가 만든 웹사이트에 올리고 싶어요. 그래서 이강의를 신청했는데요, 그래서, github 웹사이트를 생각했는데, 정적페이지로 구성되어있더라구요. 그런데, 훈련은 제컴퓨터에서 시키고, 만약 얼굴인식 프로그램이라면, 사용자의 얼굴을 업로드해서 그때그때 결과를 반출하는 것을 하는것이 제 목표인데, 이렇게되면, 따로 db를 쓰지 않고서도 정적페이지인 github에서 구현이 가능 할것같은데, 그래도 정적페이지에서는 구현이 불가능한가요?? 제가 머신러닝프로젝트를 웹사이트에 올리고 싶은데, jupyter notebook에서 구현한 코드를 웹사이트에서 동작하게 하려면 이강의를 들으면 가능한가요?
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
GCP에서 Docker 작업 질문입니다!
박사님~~ 연속으로 질문을 올리네요 ^^;; 구글 클라우드에 Docker 형태로 올리는 것을 테스트 해보고 있는데, 아래와 같이 test.py와 dockerfile 을 만들어서 GCP에 이미지 생성 후 컨테이너 생성을 했는데 실서버로 들어가도 test.py에 적어둔 문구가 안뜨고 아래와 같은 문구가 뜹니다 ㅠ 뭐가 잘못되었을까요?? 1. test.py from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "welcome" if __name__=="__main__": app.run(host="34.64.117.66") -> 여기에 기존 0.0.0.0이 아닌 GCP의 외부 IP를 넣는게 맞을까요? 2. Dockerfile FROM tiangolo/uwsgi-nginx-flask:python3.7 RUN pip install --upgrade pip RUN pip install flask COPY . /app WORKDIR /app 3. 두개의 파일을 올린 후 4. 이미지 생성 docker build -t test . 5. 컨테이너 생성 docker run -d --name myweb --net myweb-network -p 80:80 myweb -> 여기까지에서 Portainer에서 이미지 생성 및 컨테이너 생성이 잘 된 것을 확인하였습니다. 그리고 나서 브라우져에 외부 IP 주소를 넣고 접속하니 welcome이 드지 않고 아래와 같은 문구가 뜹니다. Hello World from Flask in a uWSGI Nginx Docker container with Python 3.7 (default) 어떤 부분이 문제일까요?? 인터넷으로 아무리 찾아보고 이것저것 시도를 해봐도 제 레벨에는 한계가 있는 것 같아 질문으로 남깁니다. 항상 감사합니다!
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
구글 클라우드 배포 후 Robo 3T 연결 방법
안녕하세요 박사님~! 구글 클라우드로 배포하는 것 까지는 했는데, DB를 확인하기 위해 Robo 3T로 접속을 하려고 하니 어떻게 해야하는지 헷갈리네요 ㅠ 우선 제가 한 것은 Robo 3T 실행 후 MongoDB Connections에서 Create를 한 다음에 Connection에서 어던 것을 넣어야 하는지, 이것저것 해봤는데 다 안되어 도움을 요청드립니다 ㅠ 아, 그리고 하나 또 여쭤볼게 있는데요~ 제가 별도로 크롤링 하는 파이썬 코드를 작성하여 이미지를 만들고 배포까지 했는데, 원래 로컬에서 하던 것을 구글 클라우드 통해서 진행하려고 하면 클라우드 통해 컨테이너 배포한 몽고DB명인 mongo를 원래 localhost라고 되어 있는 부분에 넣으면 되는걸까요?? conn = pymongo.MongoClient("localhost", 27017)
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
가상환경 이동관련 질의
최종 실습까지 진행한 상태에서, myweb의 가상환경을 폐쇄망으로 이동해서 게시판 내용을 원하는 필드들로 바꾸어서 사용해 보려고 하는데, 다른 PC 에서 동일한 소스를 가져와 동일한 폴더이름을 사용해서 vscode 에서 가상환경에서 python run.py 실행하면 w정상 실행이 되고 running on http://0.0.0.0:9000/ (press ctrl+c to quit) 까지 나옵니다. 그런데 정작 브라우저에서 http://127.0.0.1:9000/login 하면 화면에는 "웹페이지를 찾을수 없습니다." 에러뜨고 vscode 상에는 127.0.0.1 - - [21/May/2020 15;59:12] "?[33mGET /login HTTP/1.1?[0m" 4040 - 에러가 발생한게 보입니다. 이럴경우 어떻게 조치를 해야 할까요?
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
flask_pymongo.PyMongo 임포트가 안됨
'flask_pymongo.PyMongo' imported but unusedflake8(F401 설치도 다 잘되고 인터넷 찾아서 해볼건 다 해봤는데... 임포트가 에러가 자꾸 뜨는데 이유를 모르겠습니다
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
Css적용하는법
Css를 적용해보려고하는데 static폴더를 만들고 그 안에 css폴더를 만든 고 style.css를 가지고 main.html에서 적용을 시키려고합니다. 코드는 이런식으로 작성을 했는데 css적용이 안되서 질문합니다! <Link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
pip install virtualenv 설치 문의 및 venv 안됩니다
pip install virtualenv 설치시 아래와 같이 나오고 PS C:\Python\myweb> pip install virtualenv Requirement already satisfied: virtualenv in c:\users\pc\appdata\local\programs\python\python38\lib\site-packages (20.0.18) Requirement already satisfied: filelock<4,>=3.0.0 in c:\users\pc\appdata\local\programs\python\python38\lib\site-packages (from virtualenv) (3.0.12) Requirement already satisfied: distlib<1,>=0.3.0 in c:\users\pc\appdata\local\programs\python\python38\lib\site-packages (from virtualenv) (0.3.0) Requirement already satisfied: six<2,>=1.9.0 in c:\users\pc\appdata\local\programs\python\python38\lib\site-packages (from virtualenv) (1.14.0) Requirement already satisfied: appdirs<2,>=1.4.3 in c:\users\pc\appdata\local\programs\python\python38\lib\site-packages (from virtualenv) (1.4.3) 그후 가상환경접속하려고 PS C:\Python\myweb> venv\Scripts\activate.bat venv 앞에 (venv) 표시가 안되고 하단처럼만 나옵니다 PS C:\Python\myweb>
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
폼검증 과 bootstrap 일부 error 추가질문
오늘 폼검증 쪽과 bootstrap 하였는데 대부분 잘되었는데 폼 검증에서 회원 가입 성공하는데 return을 boar/list 가 아닌 아무 글도 없는 백지인 member/join 으로 이동하고 있습니다. 강의 내용과 coding한걸 여러번 비교하였는데 아직 찾지 못하였습니다. 그리고 bootstrap 으로 변경이 다되었는데 list와 view 에 table 의 라인이 다 나타나지 않고 있습니다.
- 해결됨남박사의 파이썬으로 실전 웹사이트 만들기
몽고디비 인서트가 안됩니다.
위와 같이 오류가 출력 되고 안되는데... 내용을 보니, insert 명령어는 안되고 insert_one 또는 insert_many를 사용해야한다고 하는거 같습니다. 해당 오류가 왜 생긴건지, 어떻게 해결해야되는지 알수잇을까요??? 몽고디비 버전을 좀 다른걸 받앗는데 해당 부분에서 생긴걸까요??(제가 받은건 mongoDB Community Server (4.2.6) 버전입니다 OS도 윈도우 10으로 동일하구요.
- 해결됨남박사의 파이썬으로 실전 웹사이트 만들기
이 부분에서 redirect대신 render_template을 사용해도 될까요?
안녕하세요 박사님~! 현재 로그인 페이지를 만드는 부분의 강의를 듣고 있는데요. 아래 코드에서 if data is None 일때, return값으로 redirect가 아닌 render_template("login.html")을 사용해도 무방한지 궁금하여 질문드립니다. @app.route("/login", methods=["GET", "POST"]) def member_login(): if request.method == "POST": email = request.form.get("email") password = request.form.get("pass") members = mongo.db.members data = members.find_one({"email": email}) if data is None: flash("회원 정보가 없습니다.") # return render_template("login.html") return redirect(url_for("member_login")) else: return render_template("login.html")
- 남박사의 파이썬으로 실전 웹사이트 만들기
mongodb 자료 안에 있는 태그의 경우 태그가 안먹는건가요?
삭제된 글입니다
- 해결됨남박사의 파이썬으로 실전 웹사이트 만들기
기본적인 질문 드립니다 ㅠ
안녕하세요 박사님~ 지금 강의 중간쯤에 와서 코드를 곱씹으며 내 것으로 만드려고 하고 있는 중입니다. 그러던 와중에 /list 에서는 methods = ["GET", "POST"] 를 안하셨는데, 검색 부분에서 GET 방식으로 정보를 가져오는 부분이 있는데 methods는 왜 빠진걸까요?? 너무 기본적인 질문인 것 같아 질문드리기 민만하지만 검색으로는 잘 못찾겠어서 여쭤봅니다. 감사합니다.
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
blueprint 상새보기와 글작성으로 이동
현재 blueprint 쪽 하고있습니다. 필요한 import 다 추가하고 app 을 blueprint트로 변경 url.for를 member나 board를 다 추가하고 테스트 하던중 list에서 상세로 들어가거나 글작성으로 들어가면 login 하라고 뜹니다. 강의에서는 바로 글작성이나 상새보기로 이동하던데 그리고 login을 하면 아래와 같이 뜨거나 이동을 하지 않습니다. 검색은 되고 list page지 뜨는것까지는 확인하였는데 중간에 login 때문에 상새보기 글작성 수정 삭제를 확인하지 못하였습니다. 그리고 회원가입도 확인해봐야 하는것 같은데 어디가서 확인해야되는지 모르겠습니다 '
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
부트스트랩, CSS 등을 로컬에서 사용하려면
강의 내용 외적으로 질문이 있어 문의 드립니다. 강의 중에 사용되는 부트스트랩이나 CSS, summernote 등의 사용을 위해 CDN을 사용하여 이용하는 방식으로 강의를 해주셨는데요. 제가 회사에서 조그맣게 구현하려고 하는 게 있는데, 외부 인터넷을 사용할 수 없는 폐쇄망에 구현을 해야 해서 저런 것들을 로컬에 다운받아 사용을 해야 합니다. 로컬에 다운받아야 하는 것들과 그런 파일들의 위치, 그리고 소스 상에서 어떻게 링크를 걸어야 하는지가 궁금합니다.
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
전혀 다른 에러가 발생해서 질문드립니다.
jquery-3.5.0.min.js:2 POST http://localhost:5000/board/upload_image 500 (INTERNAL SERVER ERROR) 현재 이런서버에서 에러가 발생한다고 나오는데 영상에서의 내용은 모두 수정한 상태입니다. 사진 업로드가 되지 않고요. 파이썬 내용입니다. TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement. 2번째 질문으로는 autoescape false로 해둔 상황인데 글 수정을 적을때는 p태그가 다시 나옵니다 edit에도 똑같이 코드를 적어보긴했습니다.
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
jinja2.exceptions.UndefinedError
list.html 상에 시간을 표시하는 부분에서 <td>{{data.pubdate|formatdatetime}}</td> 위와 같이 formatdatetime 를 넣으면 jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'pubdate' 위와 같이 에러가 발생하고, 아래와 같이 해당 부분을 삭제하면 <td>{{data.pubdate}}</td> 시간이 원하는 형태로 출력이 되지는 않지만, 에러없이 리스트가 나옵니다. 원인이 뭘까요? 상세보기 실습인 view.html 에서는 이상없이 출력이 됐었는데요. 오타가 있는지도 계속 살펴보는데 이유를 모르겠습니다.
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
등록된 글 수정시
로그인 보안 강화까지 강의를 들었습니다. 보안강화된 아이디로 로그인 한 후, 작성한 글 수정이 안됩니다. 아래와 같은 에러가 나타납니다. File "C:\Python\myweb\main\board.py", line 245, in board_edit board.update_one({"_id": ObjectId(idx)}, { "$set": { "title": title, "contents": contents, "attachfile": filename } }) flash("수정되었습니다.") return redirect(url_for("board.board_view", idx=idx)) else: UnboundLocalError: local variable 'filename' referenced before assignment adit.html {% extends "main.html" %} {% block contents %} <script> $(document).ready(function () { $("#summernote").summernote({ heigth: 300, minHeight: null, maxHeight: null, lang: "ko-KR", popover: { image: [], link: [], air: [] }, //콜백함수는 호출이 되어진다. //이미지 업로드 관련 callbacks: { onImageUpload: function(image) { for(var i = 0 ; i < image.length ; i++) { uploadImage(image[i]); } } } }); }); //웹사이트 콘솔창에서 볼수 있는 것 //function uploadImage(image) { // console.log(image); //} function uploadImage(image) { //객체를 설정한다(담기 위한 그릇) var data = new FormData(); console.log(image) // 넘어온 이미지 객체를 append 시켜준다. data.append("image", image); var csrf_token = "{{csrf_token()}}"; $.ajaxSetup({ beforeSend: function(x, s){ //s가 GET|HEAD|OPTIONS|TRACE 중 하나이면 if(!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(s.type)){ //x(내부통신을 전담하는 객체 에이젝스에서)가 해더를 추가하는데 해더의 이름은 X-CSRFToken이고 값은 csrf_token이다. x.setRequestHeader("X-CSRFToken", csrf_token) } } }); $.ajax({ //페이지 이동없이 내부적으로 통신한다. //url 주소로 찾아준다. url: "{{url_for('board.upload_image')}}", cache: false, contentType: false, processData: false, //데이터를 data: data, //포스트 형식으로 전달한다. type:"post", //위 데이터 전송이 성공하면 success: function(url) { //<omg src=서버주소> 태그를 생성해준다. var image = $("<img>").attr("src",url).css('max-width', "900px"); //insertNode:이미지를 강제적으로 추가해준다. $("#summernote").summernote("insertNode",image[0]); }, //성공하지 못하면 오류를 보여준다. error: function(data) { console.log(data); alert(data); } }); } </script> <script> function CheckEditForm() { if($.trim($("#title").val()) == "") { alert("제목을 입력하세요."); $("#title").focus(); return false; } if($.trim($("#summernote").val()) == "") { alert("내용을 입력하세요."); $("#summernote").focus(); return false; } return true; } </script> <form name="form" method="POST" action="{{url_for('board.board_edit', idx=data._id)}}" enctype="multipart/form-data"> <!--보안 강화--> <input type="hidden" name="csrf_token" value="{{csrf_token()}}"> <div class="form-group"> <label for="name">작성자</label> <input class="form-control" type="text" name="name" value="{{session['name']}}" readonly> </div> <div class="form-group"> <label for="title">제목</label> <input class="form-control" type="title" name="title" value={{data.title}} > </div> {% if data.attachfile %} <div class="form-check text-right"> <input type="checkbox" class="form-check-input" id="deleteoldfile" name="deleteoldfile"> <label class="form-check-label" for="deleteoldfile">첨부파일 삭제 ({{data.attachfile}})</label> </div> {% endif %} <div class="form-group"> <label for="contents">내용</label> <textarea rows ="8" class="form-control" name="contents" id="summernote" >{{data.contents}}</textarea> </div> <!-- 파일 첨부 버튼 --> <div class="custom-file"> <input class="custom-file-input" id="customFile" type="file" name="attachfile"> <label class="custom-file-label" for="customFile">파일선택</label> </div> <div class="text-center"><input class="btn btn-primary" type="submit" value="수정하기"></div> </form> <!-- <table> <form name="form" method="POST" action="{{url_for('board.board_edit', idx=data._id)}}"> <tr> <td>작성자</td> <td><input type="text" name= "name" value="{{session['name']}}" readonly></td> </tr> <tr> <td>제목</td> <td><input type="text" name= "title" value={{data.title}}></td> </tr> <tr> <td>내용</td> <td><textarea name= "contents">{{data.contents}}</textarea></td> </tr> <tr> <td colspan="2"><input type="submit"></td> </tr> </form> </table> --> {% endblock %} #board.html from main import * # 큰 프로젝트시 /board/list 같은 것을 만들어주는 것 from flask import Blueprint # 게시판에 관한 내용 from flask import send_from_directory #이 블루프린트의 이름은 "board"이고 블루프린트가 선언된 곳에 앞에다가는 모두 "/board"를 붙여준다. blueprint = Blueprint("board", __name__, url_prefix="/board") # 첨부파일을 삭제하는 기능 def board_delete_attach_file(filename): # abs : 절대경로 abs_path = os.path.join(app.config["BOARD_ATTACH_FILE_PATH"], filename) # 파일이 abs에 존재하면 if os.path.exists(abs_path): os.remove(abs_path) return True return False @blueprint.route("/upload_image", methods=["POST"]) def upload_image(): if request.method == "POST": file = request.files["image"] # 확장자가 문제 없다고 판단 되면 if file and allowed_file(file.filename): # 임의의 랜덤의 문자 열로 파일명이 생성하게 된다. filename = "{}.jpg".format(rand_generator()) # 실제 파일이 저장될 경로 savefilepath = os.path.join(app.config["BOARD_IMAGE_PATH"], filename) # 파일저장 file.save(savefilepath) # 주소를 리턴해준다. return url_for("board.board_images", filename=filename) # @blueprint.route("/images/<filename>") def board_images(filename): # send_from_directory : 밖에 폴더에 접근하기 위한 함수 # app.config["BOARD_IMAGE_PATH"] : 절대경로 # filename : 그 파일의 이름 # 독립적인 폴더에 저장하고 웹에서는 이와 같은 방식으로 접근한다. return send_from_directory(app.config["BOARD_IMAGE_PATH"], filename) @blueprint.route("/files/<filename>") def board_files(filename): # as_attachment=True :다운로드 형태 return send_from_directory(app.config["BOARD_ATTACH_FILE_PATH"], filename, as_attachment=True) # 리스트 @blueprint.route("/list") def lists(): # 페이지 값(값이 없는 경우 기본 값은 1) page = request.args.get("page", default=1, type=int) # 한 페이지 당 몇 개의 게시물을 출력할 지 limit = request.args.get("limit", 7, type=int) search = request.args.get("search", -1, type=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} print(query) board = mongo.db.board datas = board.find(query).skip((page - 1) * limit).limit(limit).sort("pubdate",-1) # 전체 게시물의 총 개수 tot_count = board.find(query).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, search=search, keyword=keyword, title="게시판 리스트" #main.html의 title 값이 된다. ) # 상세페이지 @blueprint.route("/view/<idx>") @login_required # idx 값을 따라서 몽고 db에서 값을 가져오는 역할 def board_view(idx): # post 노출되지 않고 GET은 노출 됨 # 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") 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) if data is not None: result = { "id": data.get("_id"), "name": data.get("name"), "title": data.get("title"), "contents": data.get("contents"), "pubdate": data.get("pubdate"), "view": data.get("view"), "writer_id": data.get("writer_id", ""), "attachfile": data.get("attachfile","") } return render_template("view.html", result=result, page=page, search=search, keyword=keyword, title="글 상세보기") return abort(404) # # 글쓰기 @blueprint.route("/write", methods=["GET", "POST"]) @login_required def board_write(): # if session.get("id") is None: # return redirect(url_for("member_login")) if request.method == "POST": filename = None # 첨부된 파일이 있으면 if "attachfile" in request.files: file = request.files["attachfile"] # 허용된 파일이라면 if file and allowed_file(file.filename): # 파일 이름을 넘겨주고 새로운 파일 이름을 받는다. filename = check_filename(file.filename) # 새로운 파일 명으로 세이브해라 file.save(os.path.join(app.config['BOARD_ATTACH_FILE_PATH'], filename)) name = request.form.get("name") title = request.form.get("title") contents = request.form.get("contents") # print(name, title, contents) current_utc_time = round(datetime.utcnow().timestamp() * 1000) board = mongo.db.board post = { "name": name, "title": title, "contents": contents, "pubdate": current_utc_time, "writer_id": session.get("id"), "view": 0, } # 위 post에 attachfile가 추가 되어 나온다. if filename is not None: post["attachfile"] = filename x = board.insert_one(post) print(x.inserted_id) return redirect(url_for("board.board_view", idx=x.inserted_id)) else: return render_template("write.html", title="글 작성") @blueprint.route("/edit/<idx>", methods=["GET", "POST"]) def board_edit(idx): if request.method == "GET": board = mongo.db.board data = board.find_one({"_id":ObjectId(idx)}) if data is None: flash("해당 게시물이 존재하지 않습니다.") return redirect(url_for("board.lists")) else: if session.get("id") == data.get("writer_id"): return render_template("edit.html", data=data, title="글 수정") else: flash("글 수정 권한이 없습니다.") return redirect(url_for("board.lists")) else: title = request.form.get("title") contents = request.form.get("contents") # 값을 받는다. deleteoldfile = request.form.get("deleteoldfile", "") # db에 접속하여 board = mongo.db.board # id 값을 가져와서 data = board.find_one({"_id": ObjectId(idx)}) # 둘의 값이 같으면 if session.get("id") == data.get("writer_id"): file = None # 첨부파일이 추가된 상태라면 if "attachfile" in request.files: file = request.files["attachfile"] # 파일이 있고 확장자(allowed_file(file.filename):)에도 문제가 없다면 if file and allowed_file(file.filename): filename = check_filename(file.filename) #새로운 파일을 저장해라 file.save(os.path.join(app.config["BOARD_ATTACH_FILE_PATH"], filename)) # 예전파일이 있는 경우에는 기존파일을 삭제하고 재업로드해라 if data.get("attachfile"): board_delete_attach_file(data.get("attachfile")) # 첨부파일이 저장이 되진않았고 else: # 체크박스에 체크를 한 경우 on이 들어온다. if deleteoldfile == "on": filename = None if data.get("attachfile"): board_delete_attach_file(data.get("attachfile")) # 새로운 첨부파일도 없고 기존의 첨부파일도 삭제하지 않는 경우 else: filename = data.get("attachfile") board.update_one({"_id": ObjectId(idx)}, { "$set": { "title": title, "contents": contents, "attachfile": filename } }) flash("수정되었습니다.") return redirect(url_for("board.board_view", idx=idx)) else: flash("글 수정 권한이 없습니다.") return redirect(url_for("board.lists")) @blueprint.route("/delete/<idx>") def board_delete(idx): board = mongo.db.board data = board.find_one({"_id": ObjectId(idx)}) if data.get("writer_id") == session.get("id"): board.delete_one({"_id": ObjectId(idx)}) flash("삭제되었습니다.") else: flash("삭제 권한이 없습니다.") return redirect(url_for("board.lists"))
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
mongoDB collection량에 따른 속도
안녕하세요 박사님~! 수업 잘 듣고 있습니다. 하나 여쭤보려고 하는데, mongoDB를 사용하여 서비스를 구축하려고 하는데 만약 collection의 document 수가 상당히 많을 경우 이후에 속도가 느려질 수 있는건가요? 그래서 저는 생각했을 때 매달별로 collection을 날짜별로 나눠버릴까 생각을 하고 있는데 혹시 해당 부분에 대해서 꿀팁이 있으신지요? 아래와 같이 예시 드려요. [서비스 예시] - 각종 정보를 크롤링 하여 웹페이지에 표현하는 서비스 - 크롤링 된 정보량 : 1000개/일 - 크롤링 내용 중복을 없애기 위해 크롤링 하면서 DB에 해당 정보가 중첩되는지 검색 후 DB에 insert 여쭤보고 싶은 부분은 만약 collection안의 정보 수가 1,000,000개 정도 된다고 했을 때 파이썬으로 중첩여부를 판단할 때나 html에 표현되는 부분 그리고 사용자 사이드에서 검색을 하거나 했을 때 느려지는 부분이 어느정도 발생하는지 감이 안잡혀서요~ 어느정도의 DB량이 서비스를 원활하게 운영하는데 적당한지, 그리고 해당 부분을 잘 운영하기 위한 팁이 있는지 궁금합니다! 감사합니다.
- 미해결남박사의 파이썬으로 실전 웹사이트 만들기
django 강의 계획은 없으신지요?
flask 재미나게 배우고 있습니다. ^^ 남박사님의 django 강의도 배우고 싶은데 강의 계획은 없으신지요? 깔끔하고 군더더기 없는 강의가 딱 제스타일이십니다. ㅎ