Flask-permissions: AttributeError: 'str' ๊ฐœ์ฒด์— 'roles' ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 07์›” 15์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: raddevon/flask-permissions

์•ˆ๋…•ํ•˜์„ธ์š”, ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด๋ ค๊ณ  ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ์ž(UserMIxin ์ธ์Šคํ„ด์Šค)์—๊ฒŒ ์—ญํ• ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

my_user = UserMixin()
my_user.add_roles('admin', 'superadmin')
db.session.add(my_user)
db.session.commit()

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ค ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ

my_user = User(name="xxx", email="[email protected]", pass="1234")
db.session.add(my_user)
db.session.commit()

๋‚ด ๋ชจ๋ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class User(UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(50), nullable=False, unique=True)
    password = db.Column(db.String(50), nullable=False)

def __init__(self, name, email, password, roles=None):
    """Setting params to the object."""
    self.name = name
    self.email = email.lower()
    self.password = bcrypt.hashpw(
        password.encode('utf-8'), bcrypt.gensalt())
    UserMixin.__init__(self, roles)

.... other methods ...

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์–ด๋–ค ํŒ? :)
( ์ €๋Š” @bepetersn ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š”์ด ๋ผ์ธ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค ...
first_user = UserMixin
๋‹น์‹ ์€ ์ด๊ฒƒ์„ ์˜๋ฏธ ...
first_user = UserMixin()
๊ทผ๋ฐ ์ด๊ฑด ์ง„์งœ ํ•ด์•ผํ•ด...
first_user = User()
(์—ฌ๊ธฐ์„œ User ๋Š” ์ •์˜์˜ UserMixin ํ•˜์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค).

UserMixin์˜ ํ•˜์œ„ ํด๋ž˜์Šค์—ฌ์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋ธ๋กœ ์‚ฌ์šฉ์ž ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ UserMixin์œผ๋กœ ์ง์ ‘ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฌธ์„œํ™” ์‹คํŒจ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ ์ƒˆ ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹ค์ œ๋กœ ์ƒ์„ฑํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด README๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋„ ์ด๊ฒƒ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๊ณ ์น  ํ…Œ๋‹ˆ๊นŒ ๋“œ๋””์–ด PR ์ค€๋น„ ์™„๋ฃŒ!

๋ชจ๋“  3 ๋Œ“๊ธ€

์•ˆ๋…• ๋ ˆ์˜ค, ๋งˆ์นจ๋‚ด ์ด๊ฒƒ์„ ๋ณผ ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ๊ณ  ์ •ํ™•ํ•œ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋ณด์•˜๊ณ  ์›์ธ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์•„๋ž˜์— ์–ธ๊ธ‰๋จ). ๊ทธ๋Ÿฌ๋‚˜ ์ข‹์€ ์†Œ์‹์€ https://github.com/bepetersn/flask-permissions-ex์—์„œ ์œ„์˜ ์‚ฌ์šฉ์ž ๋ชจ๋ธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™„์ „ํžˆ ์ž‘๋™ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋‚ด์šฉ์„ ๋ณธ ์ง€ ์–ผ๋งˆ ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‚ด ํฌํฌ์˜ ๊ฐ€์žฅ ํฐ ๋ณ€ํ™”(re: ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์˜ค๋ฅ˜)๋Š” ์ง€๊ธˆ UserMixin์„ ์ธ์Šคํ„ด์Šคํ™”ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ถ”์ƒ ๋ชจ๋ธ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋กœ ์ธํ•ด ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ญํ• ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์—์„œ ๊ท€ํ•˜์™€ ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋ฌด์Šจ ์ƒ๊ฐ์„ํ•˜๋Š”์ง€ ์ œ๊ฒŒ ์•Œ๋ ค์ฃผ์„ธ์š”.

์•ˆ๋…• ๋ธŒ๋ผ์ด์–ธ,
๋‚ด ์ฃผ์š” ๋ฌธ์ œ๋Š” ์—ญํ• ์„ ๋งŒ๋“  ๋‹ค์Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. :)

from app import db
from flask_permissions.models import UserMixin, Role

db.create_all()
superadmin.add_abilities(
    'create_admin', 'edit_admin_user', 'delete_admin_user')
db.session.add(superadmin)
db.session.commit()
#....
first_user = UserMixin

first_user.add_roles('superadmin')  ###triggers the error
db.session.add(first_user)
db.session.commit()

๋‚˜๋Š”์ด ๋ผ์ธ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค ...
first_user = UserMixin
๋‹น์‹ ์€ ์ด๊ฒƒ์„ ์˜๋ฏธ ...
first_user = UserMixin()
๊ทผ๋ฐ ์ด๊ฑด ์ง„์งœ ํ•ด์•ผํ•ด...
first_user = User()
(์—ฌ๊ธฐ์„œ User ๋Š” ์ •์˜์˜ UserMixin ํ•˜์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค).

UserMixin์˜ ํ•˜์œ„ ํด๋ž˜์Šค์—ฌ์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋ธ๋กœ ์‚ฌ์šฉ์ž ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ UserMixin์œผ๋กœ ์ง์ ‘ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฌธ์„œํ™” ์‹คํŒจ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ ์ƒˆ ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹ค์ œ๋กœ ์ƒ์„ฑํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด README๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋„ ์ด๊ฒƒ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๊ณ ์น  ํ…Œ๋‹ˆ๊นŒ ๋“œ๋””์–ด PR ์ค€๋น„ ์™„๋ฃŒ!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰