회원가입 페이지 구현 후 실행하니 T he session is unavailable because no secret key was set 이런 에러가 발생하는데요, 어떻게 해결해야하는지 궁금합니다. run.py 코드는 첨부합니다.그리고 강의를 보면서 작성하다보면 똑같이 작성한 것 같은데도 에러가 발생하는 경우가 많아서요.. 혹시 강의 코드도 받아볼 수 있을까요? from flask import Flask from flask import request from flask import render_template from flask_pymongo import PyMongo from datetime import datetime from bson.objectid import ObjectId from flask import abort from flask import redirect from flask import url_for from flask import flash import time import math app = Flask( __name__ ) app.config[ "MONGO_URI" ] = "mongodb://localhost:27017/myweb" mongo = PyMongo(app) @ 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" , 1 , type = int ) #한페이지당 몇개의 게시물을 출력할지 limit = request.args.get( "limit" , 5 , 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" : { "®ex" : keyword}}) elif search == 1 : search_list.append({ "contents" : { "®ex" : keyword}}) elif search == 2 : search_list.append({ "title" : { "®ex" : keyword}}) search_list.append({ "contents" : { "®ex" : keyword}}) elif search == 3 : search_list.append({ "name" : { "®ex" : keyword}}) if len (search_list) > 0 : query = { "$or" : search_list} print (query) board = mongo.db.board #skip (2번쩨 페이지-1)*10 -> 앞페이지 10개 skip, 이후부터 10개까지 출력 datas =board.find(query).skip((page - 1 ) * limit).limit(limit) #게시물의 총 갯수 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) @ app.route ( "/view/<idx>" ) def board_view ( idx ): #idx = request.args.get("idx") if idx is not None : board = mongo.db.board data = board.find_one({ "_id" : ObjectId(idx)}) 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" ) } return render_template( "view.html" , result =result) return abort( 404 ) @ app.route ( "/write" , methods =[ "GET" , "POST" ]) def board_write (): if request.method == "POST" : 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 #있으면 리턴 없으면 board 생성 post = { "name" : name, "title" : title, "contents" : contents, "pubdate" :current_utc_time, "view" : 0 } x = board.insert_one(post) print (x.inserted_id) return redirect(url_for( "board_view" , idx =x.inserted_id)) else : return render_template( "write.html" ) @ app.route ( "/join" , methods =[ "GET" , "POST" ]) def member_join (): if request.method == "POST" : name = request.form.get( "name" , type = str ) email = request.form.get( "email" , type = str ) pass1 = request.form.get( "pass" , type = str ) pass2 = request.form.get( "pass2" , type = str ) if name is None or email is None or pass1 is None or pass2 is None : flash( "빈값있음" ) return render_template( "join.html" ) if pass1 != pass2: flash( "비밀번호 불일치" ) return render_template( "join.html" ) members = mongo.db.members cnt = members.find({ "email" : email}).count() if cnt > 0 : flash( "중복된 이메일 주소입니다." ) return render_template( "join.html" ) current_utc_time = round (datetime.utcnow().timestamp(* 1000 )) post = { "name" : name, "email" : email, "pass" : pass1, "joindate" : current_utc_time, "logintime" : " " , "logincount" : 0 } members.insert_one(post) return "" else : return render_template( "join.html" ) if __name__ == "__main__" : app.run( debug = True , host = "0.0.0.0" , port = 9000 ) 강의와 관련있는 질문 을 남겨주세요. • 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등) • 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색 을 해주세요. (중복 질문을 자제해주세요.) • 서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’ 를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등) 질문 전달 에도 요령이 필요합니다. • 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요. • 강의실 페이지 (/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다. • 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재 해주세요. • 수업 특정 구간에 대한 질문은 꼭 영상 타임코드 를 남겨주세요! 구체적인 질문 일수록 명확한 답을 받을 수 있어요. • 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요. • 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요 . • 정확한 질문 내용과 함께 코드 를 적어주시거나, 캡쳐 이미지 를 첨부하면 더욱 좋습니다. 기본적인 예의 를 지켜주세요. • 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. • 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. • 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용 은 스팸 처리 등 제재를 가할 수 있습니다.