inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

회원가입 작성 후 실행 시 The session is unavailable because no secret key was set 오류가 발생합니다.

1138

Ts K

작성한 질문수 7

1

회원가입 페이지 구현 후 실행하니 The 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": {"&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}})

    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) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.
• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. 
• 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요!

구체적인 질문일수록 명확한 답을 받을 수 있어요.
• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.
• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.
• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다.

기본적인 예의를 지켜주세요.
• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. 
• 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. 
• 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다. 

runtimeerror python

답변 1

0

남박사

app = Flask(__name__)

app.secret_key = "임의의 문자열 혹은 바이트 형태의 값"

플라스크에서 Session 을 사용하려면 위의 예제 처럼 secret_key 를 등록해야 합니다.

시크릿키는 정해진건 없고 임의의 문자열 혹은 바이트 값 입니다.

import os
app = Flask(__name__)
app.secret_key = os.urandom(24)

0

Ts K

네 해결되었습니다 감사합니다!

iis 접속후 자동으로 로그인 창이 나오도록 설정이 기능한가요?

0

145

2

리스트 이동 시 창 에러 발생

0

134

1

배포후 회원 등록 후 로그인 에러...

0

165

2

내부 서버 오류

0

154

2

app.config["MONGO_URI"] = "mongodb://localhost:27017/pm_db"

0

106

2

DB 검색하면 데이터가 없습니다. 라고 나와요. 5시간을 찾아봐도 모르겠어서 문의드려봅니다.

0

124

1

몽고db studio3T를 깔았는데

0

129

2

flake8과 linter

0

161

3

500이 뜹니다.

0

151

2

첨부파일 삭제

0

131

2

검색기능 질문

0

156

2

google.py

0

122

2

Studio 3T에 DB insert가 되지 않는 문제를 해결하지 못하고 있습니다 ㅠ

0

171

3

혹시 전체 코드 공개되어 있나요?

0

132

1

join.html 의 form 태그값 을 member_join() 에서 처리못함.

0

165

1

google.py 몽고db 샘플데이터 만들기

0

172

2

flake8 설치 이후 명령팔레트에서 linter가 안보입니다.

0

321

2

파이썬으로 만들어서 웹호스팅에 올릴경우

0

367

1

현재 구글검색 무한스크롤변경 문의합니다

0

347

1

몽고디비아틀라스로 추가 공부해서 올립니다.

0

246

1

IIS 500.19에러

0

700

2

버전 문제도 수정했는데 결과가 안나옵니다.

0

296

1

데이터베이스 저장관련 질문입니다.

0

318

1

test가 생기지 않습니다.

0

563

3