56일차

56일차

홈으로 돌아가기
개발자모드
flask run --host=192.168.0.21 --port=5000

CI4 > MVC (model, view, controller)
flask, django > MTV

syslog와 sensor의 데이터를 가져오자


데이터베이스 연결하기

security > models에 추가
from security import db

class User(db.Model):
	id=db.Column(db.Integer,primary_key=True)
	username=db.Column(db.String(150),unique=True,nullable=False)
	password=db.Column(db.String(200),nullable=False)
	email=db.Column(db.String(120),unique=True,nullable=False)


class Syslog(db.Model):
	id=db.Column(db.Integer,primary_key=True)
	receivedat=db.Column(db.String(150),nullable=False)
	fromhost=db.Column(db.String(200),nullable=False)
	message=db.Column(db.String(500),nullable=False)


class Sensor(db.Model):
	id=db.Column(db.Integer,primary_key=True)
	distance=db.Column(db.String(150),nullable=False)
	temperature=db.Column(db.String(200),nullable=False)
	humidity=db.Column(db.String(120),nullable=False)
	regdate=db.Column(db.DateTime(),nullable=True)

security > init에 추가
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
migrate = Migrate()

	#ORM (데이터베이스연결)
	db.init_app(app)
	migrate.init_app(app,db)
	from .import models


윈도우에 추가 설치해주기
pip install Flask-Migrate

데이터베이스 관련 명령어
flask db init : 초기화
flask db migrate : 모델로 새로 생성하거나 변경할 때 사용
flask db upgrade : 실제 데이터베이스에 적용

데이터베이스에 접근
flask shell
from security.models import User
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()
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 )문을 몰라도 사용할 수 있다.


이제 로그인 페이지를 수정
auth의 login

                                    
{{form.csrf_token}}
form is undefiend flask,Django에서는 form을 쓸때 알려줘야함 form > forms.py 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()]) [auth.py] from flask import Blueprint,render_template from flask import url_for from flask import flash from flask import request from flask import session from werkzeug.security import generate_password_hash from werkzeug.security import check_password_hash from werkzeug.utils import redirect from security import db from security.forms import UserLoginForm bp = Blueprint('auth',__name__,url_prefix='/auth') @bp.route('/login',methods=('GET','POST')) def login(): form = UserLoginForm() if request.method== 'POST': return render_template('auth/loginx.html') else: return render_template('auth/login.html') @bp.route('/mypage') def mypage(): return render_template('auth/mypage.html') #return 'init' @bp.route('/logout') def logout(): return render_template('auth/logout.html') @bp.route('/signup') def signup(): return render_template('auth/signup.html') @bp.route('/find') def find(): return render_template('auth/find.html') [form_errors.html] {% for field, errors in form.errors.items() %}
{{form[field].label}} {%endfor%} {% for message in get_flashed_messages() %}
{{message}}
{%endfor%} {% if g.user %} {% else %} {% endif %} sensor 연결하기 development.py from config.default import * #SQLALCHEMY_DATABASE_URI='sqlite:///{}'.format(os.path.join(BASE_DIR,'security.db')) SQLALCHEMY_DATABASE_URI='mysql+pymysql://master:123456@192.168.0.98/master' #app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://your_user:your_password@localhost/your_database' SQLALCHEMY_TRACK_MODIFICATIONS=False SECRET_KEY="dev" sensor.py from flask import Blueprint,render_template, request from security.models import Sensor bp = Blueprint('sensor',__name__,url_prefix='/sensor') @bp.route('/') def index(): page = request.args.get('page', 1, type=int) per_page = 10 datas = Sensor.query.order_by(Sensor.regdate.desc()).paginate(page=page, per_page=per_page, error_out=True) return render_template('sensor/index.html',sensor=datas) index.html {% extends 'base.html' %} {% block content %}
실시간 서버실 센서 현황
{% if sensor %} {% for data in sensor%} {% endfor %} {% else %} {% endif %}
번호 초음파 온도 습도 날짜
{{ data.id }} {{ data.distance }} {{ data.temperature }} {{ data.humidity }} {{ data.regdate }}
데이터 없음
번호 초음파 온도 습도 날짜
{% endblock %} 검색만들기 base.html
sensor.py @bp.route('/search',methods=('GET','POST')) def search(): #step1 검색어를 확인해라 kw = request.args.get('kw',type=str,defualt='') datas = Sensor.query.order_by(Sensor.regdate.desc()) #step2 검색해라 if kw: search = ''.format(kw) datas = datas.filter(Sensor.distance.ilike(search)| Sensor.temperatue.ilike(search)| Sensor.humidity.ilike(search)| Sensor.regdate.ilike(search) ).distinct() #step3 검색된 단어를 페이지에 전송하라 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) return render_template('sensor/index.html',sensor=datas) #@bp.route('/search', methods=['GET','POST']) #def search(): # # # GET 방식으로 받은 검색어 # query = request.args.get('query', '', type=str) # # # 페이지 번호 및 페이지당 항목 수 # page = request.args.get('page', 1, type=int) # per_page = 10 # # # 검색어가 있을 경우 해당하는 데이터를 필터링 # if query: # datas = Sensor.query.filter(Sensor.distance.like(f"%{query}%")) # else: # datas = Sensor.query # 검색어가 없으면 모든 데이터를 가져옴 # # # 페이지네이션 적용 # datas = datas.order_by(Sensor.regdate.desc()).paginate(page=page, per_page=per_page, error_out=True) # # # return render_template('sensor/index.html', sensor=datas, query=query)