• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

웹사이트 회원가입후 게시판으로 넘어가는 부분 질문 (join 부분)

22.04.09 16:58 작성 조회수 198

2

안녕하세요

 

남박사님 도움을 많이 주셔서 강좌 잘 진행하고 있습니다! 몇일동안 헤매던것을 해결되서 정말 좋습니다!

 

궁금한 사항이 있어서 질문 올립니다.

 

join창에서 회원가입을 하면 몽고db에 데이터가 정상적으로 넣어지는걸 확인할수있고 리스트란에서 게시물 작성 및 삭제등이 원활하게 이루어 지고 있습니다. 궁금한부분은 회원가입후 리스트나 로그인창으로 안넘어 가는거 같아서 질문을 올립니다!

회원로그인창으로 링크주소를 바꾸면 오류가 나는거 같더라구요.. 어떻게 해야할지 몰라서 질문 다시 올립니다!

 

-회원가입-

 

-회원 가입후-

 

- 로그인 -

 

-게시판 목록-

 

 

-게시글 자성란-

 

-게시글 작성후 -

 

-회원가입 데이터-

 

 

 

 

- run.py -

 

from flask import Flask
from flask import request
from flask import render_template
from flask_pymongo import PyMongo
from bson.objectid import ObjectId
from flask import abort
from flask import redirect
from flask import url_for
from flask import flash
from flask import session
from functools import wraps
import math

import time
from datetime import datetime, timedelta

app = Flask(__name__)
app.config["MONGO_URI"] = "mongodb://localhost:27017/myweb"
app.config["SECRET_KEY"] = "abcd"
app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(minutes=30)
mongo = PyMongo(app)


def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if session.get("id") is None or session.get("id") == "":
            return redirect(url_for("member_login", next_url=request.url))
        return f(*args, **kwargs)
    return decorated_function


@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}})

    # 검색 대상이 한개라도 존재할 경우 query 변수에 $or 리스트를 쿼리 합니다.
    if len(search_list) > 0:
        query = {"$or": search_list}

    print(query)

    board = mongo.db.board
    datas = board.find({}).skip(
        (page - 1) * limit).limit(limit).sort("pubdate", -1)

    # 게시물의 총 갯수
    tot_count = board.count_documents({})
    # 마지막 페이지의 수를 구한다.
    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>")
@login_required
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)})
        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", "")
            }

            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 session.get("id") is None:
        return redirect(url_for("member_login"))

    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,
            "writer_id": session.get("id"),
            "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 == "" or email == "" or pass1 == "" or pass2 == "":
            flash("입력되지 않은 값이 있습니다.")
            return render_template("join.html")
        if pass1 != pass2:
            flash("비밀번호가 일치하지 않습니다.")
            return render_template("join.html")

        members = mongo.db.members
        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,
            "logintime": "",
            "logincount": 0,
        }

        members.insert_one(post)

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


@app.route("/login", methods=["GET", "POST"])
def member_login():

    if request.method == "POST":
        email = request.form.get("email")
        password = request.form.get("pass")
        next_url = request.form.get("next_url")
        members = mongo.db.members
        data = members.find_one({"email": email})

        if data is None:
            flash("회원 정보가 없습니다.")
            return redirect(url_for("member_login"))
        else:
            if data.get("pass") == password:
                session["email"] = email
                session["name"] = data.get("name")
                session["id"] = str(data.get("_id"))
                session.permanent = True
                if next_url is not None:
                    return redirect(next_url)
                else:
                    return redirect(url_for("lists"))
                return redirect(url_for("lists"))
            else:
                flash("비밀번호가 일치하지 않습니다.")
                return redirect(url_for("member_login"))
        return ""
    else:

        next_url = request.args.get("next_url", type=str)
        if next_url is not None:
            return render_template("login.html", next_url=next_url)
        else:
            return render_template("login.html")


@app.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 in None:
            flash("해당 게시물이 존재하지 않습니다.")
            return redirect(url_for("lists"))
        else:
            if session.get("id") == data.get("writer_id"):
                return render_template("edit.html", data=data)
            else:
                flash("글 수정 권한이 없습니다.")
                return redirect(url_for("lists"))
    else:
        title = request.form.get("title")
        contains = request.form.get("contents")

        board = mongo.db.board
        data = board.find_one({"_id": ObjectId(idx)})
        if session.get("id") == data.get("writer_id"):
            board.update_one({"_id": ObjectId(idx)}, {
                "$set": {
                    "title": title,
                    "contents": contains,
                }
            })
            flash("수정 되었습니다.")
            return redirect(url_for("board_view", idx=idx))
        else:
            flash("글 수정 권한이 없습니다.")
            return redirect(url_for("lists"))


@app.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("lists"))


if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True, port=9000)
 
 
 
 
 
 
 
 
---------------------------------------------------------------------------------
 
 
-join-
 
 
{% 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>
 
 
---------------------------------------------------------------------------------------
 
 
-login-
 
{% with messages = get_flashed_messages() %} {% if messages %}
<script>
  alert("{{messages[-1]}}");
</script>
{% endif %} {% endwith %}

<table>
  <form name="form" action="/login" method="POST">
    {% if next_url %}
    <input type="hidden" name="next_url" value="{{next_url}}" />
    {% endif %}
    <thead>
      <caption>
        회원 로그인
      </caption>
    </thead>
    <tbody>
      <tr>
        <td>이메일</td>
        <td><input type="text" name="email" /></td>
      </tr>
      <tr>
        <td>비밀번호</td>
        <td><input type="password" name="pass" /></td>
      </tr>
      <tr>
        <td colspan="2"><input type="submit" value="로그인" /></td>
      </tr>
    </tbody>
  </form>
</table>
 
 
------------------------------------------------------------------------------------
 
-list-
 
{% with messages = get_flashed_messages() %}
{% if messages %}
<script>
    alert('{{messages[-1]}}');
</script>
{% endif %}
{% endwith %}

<script>
    function search() {
        var v_search = document.getElementById("search").value;
        var v_keyword = document.getElementById("keyword").value;

        if (v_search == "" || v_keyword == "") {
            return false;
        } else {
            self.location.href =
                "{{url_for('lists')}}?search=" + v_search + "&keyword=" + v_keyword;
        }
    }
</script>

{% if datas|length > 0 %}
<table>
    <thead>
        <tr>
            <td>번호</td>
            <td>제목</td>
            <td>이름</td>
            <td>날짜</td>
            <td>조회수</td>
        </tr>
    </thead>
    <tbody>
        <!--반복되는 구간-->
        <tr>
            {% for data in datas %}
            <td>{{loop.index + ((page - 1) * limit)}}</td>
            <td>
                <a
                    href="{{url_for('board_view', idx=data._id, page=page, search=search, keyword=keyword)}}">{{data.title}}</a>
            </td>
            <td>{{data.name}}</td>
            <td>{{data.pubdate|formatdatetime}}</td>
            <td>{{data.view}}</td>
        </tr>
        {% endfor %}
        <!--반복되는 구간 끝-->
    </tbody>
</table>

{% if block_start - 1 > 0 %}
<a href="{{url_for('lists', page=block_start - 1, search=search, keyword=keyword)}}">[이전]</a>
{% endif %} {% for i in range(block_start, block_last + 1) %} {% if i >
last_page_num %} {{ i }} {% else %} {% if i == page %}
<b>{{ i }}</b>
{% else %}
<a href="{{url_for('lists', page=i, search=search, keyword=keyword)}}">{{ i }}</a>
{% endif %} {% endif %} {% endfor %} {% if block_last < last_page_num %} <a
    href="{{url_for('lists', page=block_last + 1, search=search, keyword=keyword)}}">[다음]</a>
    {% endif %}

    <select name="search" id="search">
        <option value="" {% if search=='' or search==-1 %} selected {% endif %}>검색대상</option>
        <option value="0" {% if search==0 %} selected {% endif %}>제목</option>
        <option value="1" {% if search==1 %} selected {% endif %}>내용</option>
        <option value="2" {% if search==2 %} selected {% endif %}>제목+내용</option>
        <option value="3" {% if search==3 %} selected {% endif %}>작성자</option>
    </select>
    <input type="text" name="keyword" id="keyword" {% if keyword !="" %} value="{{keyword}}" {% endif %} />
    <input type="button" value="검색" onclick="search()" />

    {% else %}
    <h3>데이터가 없습니다.</h3>
    {% endif %}

    <a href="{{url_for('board_write')}}">글작성</a>
 
 
 
 
----------------------------------------------------------------------------------------
 
-view-
 
 
<html>
  {% with messages = get_flashed_messages() %} {% if messages %}
  <script>
    alert("{{messages[-1]}}");
  </script>
  {% endif %} {% endwith %} {{result.title}}
  <br />
  {{result.name}}
  <br />
  {{result.pubdate|formatdatetime}}
  <br />
  {{result.view}}
  <br />
  {{result.contents}}

  <br />
  <a href="{{url_for('lists', page=page, search=search, keyword=keyword)}}"
    >리스트</a
  >

  {% if session["id"] == result.writer_id %}
  <a href="{{url_for('board_delete', idx=result.id)}}">글삭제</a>
  <a href="{{url_for('board_edit', idx=result.id)}}">글수정</a>
  {% endif %}
</html>
 
 
----------------------------------------------------------------------------------------------------
 
 
-write-
 
<html>

<body>
    <table>
        <form name="form" method="post" action="/write">
            <tr>
                <td>작성자</td>
                <td><input type="text" name="name" value="{{session['name']}}" readonly /></td>
            </tr>
            <tr>
                <td>제목</td>
                <td><input type="text" name="title" /></td>
            </tr>
            <tr>
                <td>내용</td>
                <td><textarea type="text" name="contents"></textarea></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" /></td>
            </tr>
        </form>
    </table>
</body>

</html>
 
 
 
 
------------------------------------------------------------------------------------------------------
 
 
-edit-
 
 
<html>

<body>
    <table>
        <form name="form" method="post" action="/edit/{{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" /></td>
            </tr>
            <tr>
                <td>내용</td>
                <td><textarea type="text" name="contents">{{data.contents}}</textarea></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" /></td>
            </tr>
        </form>
    </table>
</body>

</html>
 
 
 
 
 
-
 
 

 

 

 

답변 1

답변을 작성해보세요.

0

역시나 프로그램의 흐름을 생각해보시면 됩니다.

 

"궁금한부분은 회원가입후 리스트나 로그인창으로 안넘어 가는거 같아서 .."

 

라고 생각하셨으면 회원 가입 후 프로그램이 어떤처리를 하고 있는지 살펴보면,

 

@app.route("/join", methods=["GET", "POST"])
def member_join():
    ... 생략 ...
    members.insert_one(post)
        return ""

 

그냥 이렇게 return "" 하고 있으니 아무것도 안하게 됩니다.

 

@app.route("/join", methods=["GET", "POST"])
def member_join():
    ... 생략 ...
    members.insert_one(post)
        return redirect(url_for("member_login"))

 

위처럼 수정하면 회원가입 후 로그인 페이지로 이동하게 됩니다.

 

웹프로그램은 흐름을 잊지 마세요. 

문신호님의 프로필

문신호

질문자

2022.04.09

남박사님 정말 감사합니다! 못찾았던 부분이였는데 다시 확인해보니까 말씀대로 웹프로그램의 흐름을 잘 봐야하는거 같네요! 정상적으로 잘 동작합니다! 감사합니다! 완주까지 화이팅 해보겠습니다~!

웹프로그래밍은 특성상 부분적인 코드들이 모여서 하나의 큰 로직으로 구동되기에 규모가 커질수록 코드 분석이 어려울때가 많습니다. 그래서 항상 흐름을 따라서 생각하는 습관을 들이시는게 좋습니다. 그래도 해결되셨다니 다행입니다. 화이팅 하세요~~!!