일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- port forwarding
- sshpass
- appium server
- nohup
- insert
- create table
- ftp
- nmap
- Jupyter Notebook
- rethinkdb
- STF
- nGrinder
- centos
- postgresql
- perfect
- PYTHON
- appium
- postgres
- 실행권한
- ubuntu
- kitura
- SWIFT
- GoCD
- mysql
- 28015
- Materials
- openpyxl
- STF_PortForwarding
- Jupyter
- ssh
- Today
- Total
don't stop believing
Flask로 API 서버 만들기 (3) - User 테이블 만들기 본문
Developing API Sample Server by Flask
Original Post: How to structure a Flask-RESTPlus web service for production builds
Github: https://github.com/cosmic-byte/flask-restplus-boilerplate
Flask로 API 서버 만들기 (1) - 개발 환경 준비
Flask로 API 서버 만들기 (2) - config 와 실행 확인
Flask로 API 서버 만들기 (3) - User 테이블 만들기
Flask로 API 서버 만들기 (4) - Testing
Flask로 API 서버 만들기 (5) - User Operations
Flask로 API 서버 만들기 (6) - Security and Authentication
이제 DB 를 만들어 보겠습니다.
model 폴더 아래 user.py 파일을 만들고 user 테이블을 만듭니다.
1$ sudo vim ./app/main/model/user.py
user.py파일에 아래 script를 작성합니다.
123456789101112131415161718192021222324252627from .. import db, flask_bcryptclass User(db.Model):""" User Model for storing user related details """__tablename__ = "user"id = db.Column(db.Integer, primary_key=True, autoincrement=True)email = db.Column(db.String(255), unique=True, nullable=False)registered_on = db.Column(db.DateTime, nullable=False)admin = db.Column(db.Boolean, nullable=False, default=False)public_id = db.Column(db.String(100), unique=True)username = db.Column(db.String(50), unique=True)password_hash = db.Column(db.String(100))@propertydef password(self):raise AttributeError('password: write-only field')@password.setterdef password(self, password):self.password_hash = flask_bcrypt.generate_password_hash(password).decode('utf-8')def check_password(self, password):return flask_bcrypt.check_password_hash(self.password_hash, password)def __repr__(self):return "<user '{}'>".format(self.username)
User 클래스는 sqlalchemy의 db.Model 클래스를 상속받습니다.
user 데이블에 id, email, registered_on, admin, public_id, username, password_hash 컬럼을 만들어 줍니다.
이제 user 테이블을 사용하기 위해 manage.py 파일에 아래와 같이 import 합니다.
1from app.main.model import user
manage.py 파일은 아래와 같습니다.
1$ sudo vim manage.py
12345678910111213141516171819202122232425262728293031323334import osimport unittestfrom flask_migrate import Migrate, MigrateCommandfrom flask_script import Managerfrom app.main import create_app, dbfrom app.main.model import userapp = create_app(os.getenv('BOILERPLATE_ENV') or 'dev')app.app_context().push()manager = Manager(app)migrate = Migrate(app, db)manager.add_command('db', MigrateCommand)@manager.commanddef run():app.run()@manager.commanddef test():"""Runs the unit tests."""tests = unittest.TestLoader().discover('app/test', pattern='test*.py')result = unittest.TextTestRunner(verbosity=2).run(tests)if result.wasSuccessful():return 0return 1if __name__ == '__main__':manager.run()
migrateCommand로 db를 생성하겠습니다.
init 명령으로 초기화 합니다.
12345678$ python manage.py db initCreating directory /home/ngle/nGleAPI/migrations ... doneCreating directory /home/ngle/nGleAPI/migrations/versions ... doneGenerating /home/ngle/nGleAPI/migrations/script.py.mako ... doneGenerating /home/ngle/nGleAPI/migrations/env.py ... doneGenerating /home/ngle/nGleAPI/migrations/alembic.ini ... doneGenerating /home/ngle/nGleAPI/migrations/README ... donePlease edit configuration/connection/logging settings in '/home/ngle/nGleAPI/migrations/alembic.ini' before proceeding.
migrate 명령으로 db를 생성합니다.
12345$ python manage.py db migrate --message 'initial database migration'INFO [alembic.runtime.migration] Context impl SQLiteImpl.INFO [alembic.runtime.migration] Will assume non-transactional DDL.INFO [alembic.autogenerate.compare] Detected added table 'user'Generating /home/ngle/nGleAPI/migrations/versions/faba1bd89e48_initial_database_migration.py ... done
upgrade 명령으로 적용합니다.
1234$ python manage.py db upgradeINFO [alembic.runtime.migration] Context impl SQLiteImpl.INFO [alembic.runtime.migration] Will assume non-transactional DDL.INFO [alembic.runtime.migration] Running upgrade -> faba1bd89e48, initial database migration
정상적으로 생성되었다면 main 폴더 아래 flask_boilerplate_main.db 파일이 생성됩니다.
이후로 database model이 변경될 경우 migrate 과 update 명령을 실행하면 됩니다.
여기까지해서 User 테이블을 만들었습니다.
tree 명령으로 디렉터리를 확인하면 아래와 같이 migrations 폴더가 생성됩니다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445$ tree.├── app│·· ├── __init__.py│·· ├── main│·· │·· ├── config.py│·· │·· ├── controller│·· │·· │·· └── __init__.py│·· │·· ├── flask_boilerplate_main.db│·· │·· ├── __init__.py│·· │·· ├── model│·· │·· │·· ├── __init__.py│·· │·· │·· ├── __pycache__│·· │·· │·· │·· ├── __init__.cpython-36.pyc│·· │·· │·· │·· └── user.cpython-36.pyc│·· │·· │·· └── user.py│·· │·· ├── __pycache__│·· │·· │·· ├── config.cpython-36.pyc│·· │·· │·· └── __init__.cpython-36.pyc│·· │·· └── service│·· │·· └── __init__.py│·· ├── __pycache__│·· │·· └── __init__.cpython-36.pyc│·· └── test│·· ├── __init__.py│·· ├── __pycache__│·· │·· └── test_config.cpython-36.pyc│·· └── test_config.py├── manage.py├── migrations│·· ├── alembic.ini│·· ├── env.py│·· ├── __pycache__│·· │·· └── env.cpython-36.pyc│·· ├── README│·· ├── script.py.mako│·· └── versions│·· ├── 95f4f62caf8d_initial_database_migration.py│·· └── __pycache__│·· └── 95f4f62caf8d_initial_database_migration.cpython-36.pyc├── __pycache__│·· └── manage.cpython-36.pyc└── requirements.txt15 directories, 26 files
'Python > Flask' 카테고리의 다른 글
Flask로 API 서버 만들기 (6) - Security and Authentication (0) | 2018.11.12 |
---|---|
Flask로 API 서버 만들기 (5) - User Operations (2) | 2018.11.12 |
Flask로 API 서버 만들기 (4) - Testing (0) | 2018.11.12 |
Flask로 API 서버 만들기 (2) - config 와 실행 확인 (2) | 2018.11.07 |
Flask로 API 서버 만들기 (1) - 개발 환경 준비 (1) | 2018.11.06 |