56일차

●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 %}
> 마지막 부분에 추가

#센서 검색 기능 만들기
> 검색을 하고 클릭을 하면 넘어가지 않고 페이지가 뜨지 않았지만
> 넘어가지면서 원래 페이지가 뜸