189일차 백엔드 Flaks - 정리 2

189일차 백엔드 Flaks - 정리 2

//================================

몇 가지 선언을 미리 해 둬야 한다.

반드시, @login_manager.user_loader 라는 데코레이터를 선언 해야 한다.

이것은 user_id를 기반으로 사용자 객체를 return해주는 함수를 만들어야 한다.

User class를 어떻게 만들지 모르기 때문에, 내가 만든 User class에 맞게 이 부분을 구현해줘야 한다.

@login_manager.user_loader

def load_user(user_id):

return User.get(user_id)

그 다음에, 이 부분은 만들지 않아도 디폴트 동작이 있을 수 있지만, 이것도 구현을 해주면 좋다.

@login_required 데코레이터로 API 중에 로그인이 필요한 API인 경우에는, 이 @login_required 데코레이터를 붙여주면, 로그인이 안된 사용자인 경우에는, @login_manager.unauthorized_handler 데코레이터로 적혀진 함수를 호출하게 되어있다. 예를 들어, 로그인이 되어 있지 않다면, 다른 웹페이지를 띄우거나, 오류를 띄우거나 할 수 있다.

@login_manager.unauthorized_handler

def unauthorized():

return make_response(jsonify(success=False), 401)

//================================

User class는 UserMixin class를 상속해야 하고, 속성으로 사용자를 구분할 수 있는 id를 반드시 가지고 있어야 한다.

User 클래스에 UserMixin 클래스를 상속받도록 하고, 이 클래스에는 3가지의 속성을 갖게 했다. (id, user_email, blog_id)

그리고, 이 3가지 값을 기반으로 해서, 객체를 생성할 수 있게 만들었다.

get_id는 유저 id를 리턴해주는 함수가 꼭 있어야 하니까, 3가지 속성을 사용해, id객체를 가져온다.

그다음에, @staticmethod

원래 클래스는 속성과 메소드가 있다. 이러한 속성과 메소드는 객체로 만들어지면 생긴다. 그러나, 이와 달리 @staticmethod를 선언해주고 그 안에 함수를 적어주면, 그 함수는 스태틱메소드(함수)라고 불러지며, 이 메소드는 User클래스가 객체로 만들어지지 않아도, 미리 선언되어 있어서, User.get(or find or create) 함수로 바로 호출이 가능하다.

@staticmethod를 만든 이유는, 클래스에 있는 메소드들은 해당 클래스와 관련된 메소드를 넣는게 일반적이다. 이것을 수없이 갈려진 소스파일에서 각각 함수로 만들면, 해당 함수가 어느 부분에 속해있는지 이해하기 쉽지 않을수도 있고, 클래스 안에 또 다른 변수가 있을 수도 있는데, 이러한 것들을 @staticmethod를 이용하면 사용할 수 있다. 이러한 기능들과 연관이 된 메소드들은, @staticmethod로 동일 클래스에 몰아 넣으면 좀 더 유용하게 유지보수 할 수 있다.

get, find, create 세 가지 모두, user를 리턴해주고, 이들 모두 사용자 관련된 기능이기 때문에, User 클래스에 @staticmethod로 넣어 둔 것이다. 그런데 이게, 하나의 객체에만 종속된 기능이 아니라, 이 User 전체 클래스에 필요한 기능이기 때문에, 객체로 안 만들어도 사용할 수 있게끔 @staticmethod로 만들어 놓은 것이다.

크게 보면, User 클래스가 하는 역할은 flask_login에서 쓰는 User 클래스를 만드는 것이다. 이 클래스는 사용자 정보인, user_id, user_email, blog_id 이 3가지 속성으로 User 클래스를 만드는 것이다. 반드시 구현해야 하는 get_id는 자기 속성 user_id값을 가져오면 된다. 그리고 기본적인 get, find, create 함수를 제공해서 user_id나 user_email, blog_id를 기반으로 해서 사용자 정보를 찾고 객체화해서 되돌려주는 그런 기능들을 하고, 해당 사용자 정보가 없다면 해당 사용자 정보를 데이터베이스에 생성해준다.

class User(UserMixin):

def init(self, user_id, user_email, blog_id):

self.id = user_id

self.user_email = user_email

self.blog_id = blog_id

def get_id(self):

return str(self.id)

@staticmethod

def get(user_id):

mysql_db = conn_mysqldb()

db_cursor = mysql_db.cursor()

sql = "SELECT * FROM user_info WHERE USER_ID = '" + str(user_id) + "'"

db_cursor.execute(sql)

user = db_cursor.fetchone()

if not user:

db_cursor.close()

return None

print(user) user = User(user_id=user[0], user_email=user[1], blog_id=user[2]) db_cursor.close() return user

@staticmethod

def find(user_email):

mysql_db = conn_mysqldb()

db_cursor = mysql_db.cursor()

sql = "SELECT * FROM user_info WHERE USER_EMAIL = '" + str(user_email) + "'"

db_cursor.execute(sql)

user = db_cursor.fetchone()

if not user:

db_cursor.close()

return None

print(user) user = User(user_id=user[0], user_email=user[1], blog_id=user[2]) db_cursor.close() return user

@staticmethod

def create(user_email, blog_id):

mysql_db = conn_mysqldb()

db_cursor = mysql_db.cursor()

sql = "INSERT INTO user_info (USER_EMAIL, BLOG_ID) VALUES ('%s', '%s') % (str(user_email), str(blog_id))

db_cursor.execute(sql)

user = db_cursor.fetchone()

if not user:

db_cursor.close()

return None

print(user) user = User(user_id=user[0], user_email=user[1], blog_id=user[2]) db_cursor.close() return user

from http://kwonputer.tistory.com/212 by ccl(A) rewrite - 2021-03-21 13:26:27