• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

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

21.04.08 15:23 작성 조회수 713

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"1type=int)
    #한페이지당 몇개의 게시물을 출력할지
    limit = request.args.get("limit"5type=int)

    search = request.args.get("search", -1type=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=Truehost="0.0.0.0"port=9000)

강의와 관련있는 질문을 남겨주세요.
• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)
• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)
서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등)

질문 전달에도 요령이 필요합니다.
• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.
• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.
• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. 
• 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요!

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

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

답변 1

답변을 작성해보세요.

0

app = Flask(__name__)

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

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

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

import os
app = Flask(__name__)
app.secret_key = os.urandom(24)
Ts K님의 프로필

Ts K

질문자

2021.04.13

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