201208 개발일지(1일차)-Flask, MongoDB를 이용하여 게시판을 만들어보자

고재개발·2020년 12월 8일
1

Web study

목록 보기
1/6

Jungle 0주차 프로젝트 시작-

  1. 아래 내용처럼 간단한 웹페이지를 만드는 것이 0주차 프로젝트인데, 시간이 짧다..
  2. 그래도 운좋게 웹에 대한 지식과 경험이 있으신 분들과 조가 되어 다행이면서도, 내가 질문을 너무 많이 던져서 미안하다.. (열심히 해서 다른 프로젝트 때는 내가 도움이 되는 사람이길..)
  3. 오늘 나는 flask를 이용해서 로그인 및 회원가입, 글쓰기 및 수정, 삭제를 구현했다. 이 중 혼자 힘으로 제대로 한 건 회원가입과 그에 대한 db(Mongo DB 사용)뿐이었다..

쿠키와 세션

쿠키 : 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일
세션 : 쿠키를 기반하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리

JWT(Json Web Token)

JWT : Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Web Token / 필요한 정보를 토큰 Body에 저장해 사용자가 가지고 있고, 그것을 증명서처럼 사용

★ JWT를 쿠키에 저장하여 사용 : flask_jwt_extended 라이브러리를 사용하여 set_access_cookies 및 set_refresh_cookies 활용!

Mongo DB

사용하다 헷갈린 점 : Python에서 아래처럼 code를 넣으면, 아래 사진처럼 Database가 생성된다.

from pymongo import MongoClient
...
client = MongoClient('localhost', 27017)
db = client.dbname
...
db.users.insert_one({딕셔너리})

오늘 작성한 app.py

아직 제대로 이해하지 못한 부분이 너무 많다. (걱정이 태산..)
해결해야할 부분도 많다.
1. user data에 password 암호화 필요
2. db부분에서 foreignkey 및 참조, 조인 등 제대로 이해하지 못한 개념으로 팀원들을 괴롭힘..(잘 아시는 분들이라 계속 설명해주심)
3. 특히,아래와 같이 <_id>를 사용한 부분에 대해 명확하게 이해하지 못하고 있다......

@app.route('/article/<article_id>', methods=['GET'])
def read_articles(article_id):
article = db.articles.find_one({'_id' : article_id})

(익명과 실명 게시판이 있는 폐쇄적인 커뮤니티 웹페이지 작성中)

from flask import Flask, render_template, request, jsonify, redirect
from flask_jwt_extended import *
from pymongo import MongoClient
import datetime

app = Flask(__name__)


# JWT 매니저 활성화
app.config.update(DEBUG = True, JWT_SECRET_KEY = "thisissecertkey" )
                  # 정보를 줄 수 있는 과정도 필요함 == 토큰에서 유저 정보를 받음

jwt = JWTManager(app)

# JWT 쿠키 저장
app.config['JWT_COOKIE_SECURE'] = False # https를 통해서만 cookie가 갈 수 있는지 (production 에선 True)
app.config['JWT_TOKEN_LOCATION'] = ['cookies']
app.config['JWT_ACCESS_COOKIE_PATH'] = '/' # access cookie를 보관할 url (Frontend 기준)
app.config['JWT_REFRESH_COOKIE_PATH'] = '/' # refresh cookie를 보관할 url (Frontend 기준)
# CSRF 토큰 역시 생성해서 쿠키에 저장할지
# (이 경우엔 프론트에서 접근해야하기 때문에 httponly가 아님)
app.config['JWT_COOKIE_CSRF_PROTECT'] = True


# Mongo DB
client = MongoClient('localhost', 27017)
db = client.dbname

# test - id
db.users.insert_one({'user_id' : 'test','user_pwd': 'test', 'user_name' : '정글','user_email': '.com','user_ordinal' : 1})


@app.route('/')
def home():
    return render_template('home.html')

# 회원가입
@app.route('/register', methods=['GET','POST'])
def register():
    if request.method == 'GET':
        return render_template("register.html")
    else:
        #회원정보 생성
        username = request.form.get('username')
        email = request.form.get('email')
        ordinal = request.form.get('ordinal')
        userid = request.form.get('userid')
        password = request.form.get('password')
        re_password = request.form.get('re_password')

        userinfo={'user_id':userid, 'user_name':username, 'user_pwd':password, 'user_email':email, 'ordinal':ordinal}

        if not (userid and username and password and re_password) :
            return "모두 입력해주세요"
        elif password != re_password:
            return "비밀번호를 확인해주세요"
        else: #모두 입력이 정상적으로 되었다면 밑에명령실행(DB에 입력됨)
            db.users.insert_one(userinfo)
            return "회원가입 완료"
        return redirect('/register')


# 로그인
@app.route('/user/login', methods = ['POST'])
def login():
    user_id = request.form['id_input']
    user_pw = request.form['pw_input']
    print(user_id)
    print(user_pw)

    ## *** find_one 시에 아무것도 없을 때의 데이터 형태 알아야함 ***
    user = db.articles.find_one( {'user_id' : user_id},{'user_pwd' : user_pw})
    if user is None:
        return jsonify({'login' : False})


    access_token = create_access_token(identity = user_id, expires_delta = False)
    refresh_token = create_refresh_token(identity = user_id)

    resp = jsonify({'login' : True})

    # 서버에 저장
    set_access_cookies(resp, access_token)
    set_refresh_cookies(resp, refresh_token)

    print(access_token)
    print(refresh_token)
    return resp, 200


# 목록페이지 보기
@app.route('/article/known', methods=['GET'])
def get_article():
    articles = list(db.articles.find({},{'_id':False}).sort('article_created_at', -1))
    return jsonify({'result':'success', 'articles': articles})


# 실명게시판 글쓰기버튼 작동
@app.route('/article/known/write')
def modify_articles():
    return render_template('modify.html', article_is_secret = False)

# 익명게시판 글쓰기버튼
@app.route('/article/unknown/write')
def modify_articles():
    return render_template('modify.html', article_is_secret = True)

# 실명게시판 글쓰기 완료버튼 작동
@app.route('/article/known/post', methods=['POST'])
def post_articles():
    article_title = request.form['title_input']
    article_content = request.form['content_input']
    now = datetime.datetime.now()
    article_created_at = now.today() # 시간
    article_modified_at = now.today()  # 시간
    article_view = 0
    article_like = 0
    article_is_secret = False
    article_user_id = get_jwt_identity()

    db.articles.insert_one({'article_title' : article_title, 'article_content' : article_content, 'article_created_at' : article_created_at,
                         'article_modified_at' : article_modified_at,'article_view' : article_view, 'article_like' : article_like, 'article_is_secret' :article_is_secret,
                         'article_user_id' : article_user_id})

    return redirect('/article/known')


# 실명게시판 상세페이지 (GET ? POST ?)
@app.route('/article/<article_id>', methods=['GET'])
def read_articles(article_id):
    article = db.articles.find_one({'_id' : article_id})
    user_id = get_jwt_identity()

    return render_template('read.html', article = article ,user_id = user_id)


# 수정 버튼을 누르면
@app.route('/article/<article_id>/modify', methods=['PUT'])
def modify_articles(article_id):
    article = db.articles.find_one({'_id' : article_id})
    return render_template('modify.html', article = article)

# 수정완료 버튼을 누르면
@app.route('/article/<article_id>/modify_pro')
def modify_pro(article_id):
    article_title = request.form['title_input']
    article_content = request.form['content_input']
    now = datetime.datetime.now()
    article_modified_at = now.today()


    db.articles.update_one({'_id': article_id }, {'$set':{'article_title' : article_title,
                                                          'article_content' : article_content,'article_modified_at' : article_modified_at}})

    return redirect('/article/known')


# 삭제
@app.route('/article/<article_id>/delete', methods=['DELETE'])
def delete_articles(article_id):
    db.articles.delete_one({'_id' : article_id})
    return  redirect('/article/known')



# 익명게시판 글쓰기 완료시 작동
@app.route('/article/unknown', methods=['POST'])
def post_articles():
    article_title = request.form['title_input']
    article_content = request.form['content_input']
    now = datetime.datetime.now()
    article_created_at = now.today() # 시간
    article_modified_at = now.today()  # 시간
    article_view = 0
    article_like = 0
    article_is_secret = True
    article_user_id = get_jwt_identity()

    db.articles.insert_one({'article_title' : article_title, 'article_content' : article_content, 'article_created_at' : article_created_at,
                         'article_modified_at' : article_modified_at,'article_view' : article_view, 'article_like' : article_like, 'article_is_secret' :article_is_secret,
                         'article_user_id' : article_user_id})

    return redirect('/article/known')

    # article_writer = "{}기 {}".format(user['user_ordinal'],user['user_name'])




if __name__ == '__main__':
    app.run('127.0.0.1', port=5000, debug=True)

1일차 마무리

현재 시각 새벽 2시인데, 강의실에 혼자 남았다.. 지금도 제일 부족한 수준 같은데, 앞으로는 더 걱정이다.. 그래도 포기하지 말고 끝까지 달리자

profile
고재개발

0개의 댓글