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

이냐버미님의 프로필 이미지
이냐버미

작성한 질문수

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

회원 가입 페이지 만들기

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

작성

·

173

0

{% with messages = get_flashed_messages() %} {% if messages %} <script> alert(" {{messages[-1]}}"); </script> {% endif %} {% endwith %} <table> <form name="form" action="/join" method="POST"> <thead> <caption>회원가입</caption> </thead> <tbody> <tr> <td>이름</td> <td><input type="text" name="name"></td> </tr> <tr> <td>이메일</td> <td><input type="text" name="email"></td> </tr> <tr> <td>비번</td> <td><input type="password" name="pass"></td> </tr> <tr> <td>비번확인</td> <td><input type="password" name="pass2"></td> </tr> <tr> <td colspan="2"><input type="submit" value="가입하기"></td> </tr> </tbody> </form> </table>

from flask import Flask
from flask import request,redirect,url_for
from flask import render_template, abort
from flask_pymongo import PyMongo
from datetime import datetime
from flask import flash
from bson.objectid import ObjectId
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_timestemp = time.time()
    offset = datetime.fromtimestamp(now_timestemp)-datetime.utcfromtimestamp(now_timestemp)   
    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}})
    # 검색 대상이 한개라고 존재할 겨우 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)

    # 개시물에 총 갯수(수정됨)
    tot_count = board.count_documents(query)
    #  마지작 페이지의 수를 구합니다.
    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=list(datas),
        limit=limit,
        page=page,
        block_start=block_start,
        block_last=block_last,
        last_page_num=last_page_num,
        search=search,
        keyword=keyword)


@app.route("/view/<idx>")
def board_view(idx):
    # 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)})

        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")
            }
            print(id)
            return render_template("view.html",result=result, page=page, search=search, keyword=keyword)
    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
        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=["POST","GET"])
def menber_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.menbers
        # 이부분 버전 수정됨
        cnt = members.count_documents({"email":email}) 
        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,
            "logtime":"",
            "logincount":0,
        }
        members.insert_one(post) 

        return ""
    else:
        return render_template("join.html")


if __name__ == "__main__":
    app.run(host="0.0.0.0",debug=True,port=5000)

 

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.

작성해주신 코드를 보면 Flask와 MongoDB를 사용하여 회원가입 페이지를 구현한 것 같습니다.
하지만 어떤 문제가 발생하는지 정확히 설명해주시지 않아서 원인을 파악하기 어렵습니다.
문제가 발생하는 부분과 발생하는 현상에 대해 좀 더 자세한 정보를 알려주세요.
또한, 코드에서 사용하는 버전 관련 내용도 함께 알려주시면 도움이 될 것 같아요.

이냐버미님의 프로필 이미지
이냐버미

작성한 질문수

질문하기