●56일차(20250301056.php)
#login 데이터베이스 연결
Flask, Django > MTV
> 데이터베이스 연결을 모델 사용
id=db.Column() > 번호
username이 우리가 흔히 생각하는 id임
#ORM(Object Relation Mapping) (데이터베이스 연결)
#sql
insert, delete, update, select 데이터베이스의 데이터를 처리할 수 있는 기술
> orm 설치해줘야함 > sqlalchemy도 깔림
> pip install Flask-Migrate
> mysite를 활성화 시킨 상태에서 해줘야함
데이터베이스 관련 명령어
flask db init : 초기화
flask db migrate : 모델로 새로 생성하거나 변경할 때 사용
flask db upgrade : 실제 데이터 베이스에 적용

> flask에 security.db 파일과 migrations 폴더가 생성
> sqlite로 볼 수 있음
데이터베이스에 접근
flask shell
from security.models import User
User.query.all()
> [] 만 나옴
from datetime import datetime
from security import db
u =User(username='admin',password='123456',email='test@test.com')
db.session.add(u)
db.session.commit()
> 웹브라우저를 통해 데이터를 넣을 수 있다
> User.query.all() > [<User1>]이 뜸
> sqlite에 admin 123456 test가 추가되어있음
User.query.all()
User.query.filter(User.id==1).all()
User.query.get(1)
User.query.filter(User.username.like('%ad%')).all()
수정
db.session.commit()
삭제
db.session.delete(u)
db.session.commit()
결론
mysql에서 배운 DML(select,update.delete,insert)문을 몰라도 사용할 수 있다.
#FORM
form is undefined
form.py를 만들어야함
> security 아래에 만들기
from flask_wtf import FlaskForm
from wtforms import StringField,TextAreaField,PasswordField
from wtforms.validators import DataRequired,Length
class UserLoginForm(FlaskForm):
username=StringField('아이디',validators=[DataRequired(),Length(min=3,max=15)])
password=PasswordField('비밀번호',validators=[DataRequired()])
> security\views\auth.py에서 form을 가져와야함
@bp.route('/login',methods=('GET','POST'))
def login():
form = UserLoginForm()
if request.method== 'POST' and form.validate_on_submit():
error = None
user = User.query.filter_by(username=form.username.data).first()
if not user:
error = "존재하지 않는 사용자입니다."
if error is None:
session.clear()
session['user_id'] = user.id
return redirect(url_for('main.index'))
#elif not check_password_hash(user)
flash(error)
#return render_template('auth/loginx.html')
else:
return render_template('auth/login.html',form=form)
pip install Flask-WTF
> 폼을 사용하기 위한 flask 라이브러리다
> flask run을 해주는데 변수가 지정이 안됐다?
> 해당 파일에 import 안해준거임
{% if g.user %}
{% endif %}
> 로그인이 안됐는데 로그아웃 없앨거임
> syslog, sensor, logout을 담당하는 코드를 감싸주자
> 장고는 로그인 기능이 만들어져있음
> 플라스크는 만들어야함
mysqlite > mysql로 바꿔줌
> SQLALCHEMY_DATABASE_URI='mysql+pymysql://master:123456@192.168.0.98/master'
> config\development.py
> migrations 폴더를 지워주고
flask db init
flask db migrate
flask db upgrade
> 다시 cmd에서 명령어 입력
> 모델에 만들어놓은데로 mysql에 sensor 테이블에 데이터베이스가 만들어짐
INSERT INTO `user` (`username`, `password`, `email`) VALUES ('msh', '123456', 'msh@test.com');
> msh 123456으로 로그인이 됨
> 로그인을 하면 logout과 componets에 syslog와 sensor가 뜨게 만듦
센서를 데이터베이스에 연결해 실시간으로 들어오는 것을 확인
#페이징만들기
security\views\sensor.py
from flask import Blueprint,render_template, request
> 모듈에 request 추가
page = request.args.get('page', 1, type=int)
per_page = 100
datas = Sensor.query.order_by(Sensor.regdate.desc()).paginate(page=page,per_page=per_page, error_out=True)
> page 변수 추가와 data 정렬 부분에 페이지 함수 추가
security\templates\sensor\index.html
<!-- 페이지네이션 -->
<div class="pagination">
{% if sensor.has_prev %}
<a href="{{ url_for('sensor.index', page=sensor.prev_num) }}">이전</a>
{% endif %}
<span>페이지 {{ sensor.page }} / {{ sensor.pages }}</span>
{% if sensor.has_next %}
<a href="{{ url_for('sensor.index', page=sensor.next_num) }}">다음</a>
{% endif %}
> 마지막 부분에 추가
#센서 검색 기능 만들기
> 검색을 하고 클릭을 하면 넘어가지 않고 페이지가 뜨지 않았지만
> 넘어가지면서 원래 페이지가 뜸