●55일차(20250228055.php)
192.168.0.118은 로그 서버
192.168.0.98 센서 데이터 서버
#Flask
CI4 > MVC(Model, View, Control)
config > routes > 경로...
Flask, Django > MTV(Model, Tamplate,View)
127.0.0.1:5000
127.0.0.1:5000/init
127.0.0.1:5000/profile
127.0.0.1:5000/syslog
127.0.0.1:5000/sensor
#security
security > init.py, forms.py, models.py
init.py
> flask 애플리케이션을 설정하고 초기화하는 코드
> views라는 모듈에서 main, syslog, sensor, auth라는 각각의 Blueprint를 불러와 등록한다
> Blueprint : Flask 애플리케이션 내에서 라우트와 관련된 코드들을 모듈화하고 관리하는 방법
#security\templates
> base.html, footer.html
> templates 아래에는 auth, main, sensor, syslog 디렉토리가 있음
> 각각의 디렉토리 아래에는 특정 경로의 웹을 꾸밀 수 있는 XXX.html이 있음
#security\views
> auth.py, main.py, sensor.py, syslog.py가 있음
> flask blueprint를 사용하여 특정 url 경로에 대해 html 템플릿을 렌더링하는 뷰를 정의한다
ex) main.py
from flask import Blueprint,render_template
bp = Blueprint('main',__name__,url_prefix='/')
> main이라는 이름을 가진 blueprint를 생성
> url 프리픽스 '/' 을 기준으로 동작
@bp.route('/init')
def init():
return render_template('main/init.html')
#return 'init'
> /init로 경로로 요청이 들어오면 main/init.html이라는 템플릿을 렌더링하여 반환
> render_templates는 html 파일을 템플릿으로 렌더링하는 flask 함수
> templates\main 폴더 아래에 웹페이지를 담당할 html 파일이 있어야 한다
# header, footer, static
https://startbootstrap.com/
> SB Admin 2 zip 파일 다운로드
> index.html에 들어가자
End of Topbar
위를 그대로 잘라내기
> 헤더로 하겠다
footer 아래를 잘라내기
> footer로 쓰겠다
tamplates 아래에
> base.html
> A라고 씀
tamplates/main/index.html
--------------------------------
{% extends 'base.html' %}
--------------------------------
> 웹페이지에 A라고 뜸
> 상속되는거임
--------------------------------
{% extends 'base.html' %}
{% block content %}
AA
{% endblock %}
{% include 'footer.html' %}
--------------------------------
> block 안에 내용을 써주면 됨
base.html
A
{% block content %}
{% end block %}
{% include 'footer.html' %}
> 이걸 안해주면 안써짐 AA가
base.html
> header를 넣어주고
> 맨 아래에
{% block content %}
{% endblock %}
> 넣어줌
tamplates/footer.html
> footer 붙혀줌
글만 나오고 이쁘게 안나옴
> zip 파일에 css, img, js, scss, vendor를 복사해서
> static에 넣어라
> base.html에 custom fonts와 style에 경로지정
> <link href="css/sb-admin-2.min.css" rel="stylesheet">를
> <link href="{{url_for('static', filename=sb-admin-2.min.css)}}" rel="stylesheet"> 이걸로 바꿔줌
> footer에도 아래에 bootstrap core javascript에 static 경로를 넣어주자
> <script src="/static/js/sb-admin-2.min.js"></script>이렇게
> 많이 복잡해지면 경로를 못찾을 수도 있어서 url_for을 써주는게 좋긴하다
# 배포와 개발모드
서버에서는 배포
로컬에서는 개발모드
내 서버 11번에 들어감
sudo apt update
sudo apt -y install lrzsz
sudo apt -y install unzip
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
> 시간 맞추기
cd ~
mkdir venvs
cd venvs
python3 -m venv mysite
> 이거 안되면 python 3.1 다운로드하라고 명령어가 나옴
> 다운로드 하면 됨
cd mysite
cd bin
. activate
pip install wheel
pip install flask
pip install Flask-Migrate
pip install Flask-WTF
pip install email_validator
pip install Flask-Markdown
pip install pymysql
pip install mysql-connector-python
pip install cryptography
---
cd /home/master/venvs
nano mysite.sh
#!/bin/bash
cd ~/projects/flask
export FLASK_APP=security
export FLASK_ENV=production
export APP_CONFIG_FILE=/home/master/projects/flask/config/production.py
. ~/venvs/mysite/bin/activate
---
cd ~
nano .profile
alias mysite='export FLASK_APP=security;export FLASK_ENV=production;export APP_CONFIG_FILE=/home/master/projects/flask/config/production.py; cd ~/projects/flask; . /home/master/venvs/mysite/bin/activate'
> .profile 마지막에 추가
source .profile
> cmd처럼 mysite만 쳐도 플라스크 접속 가능
---
cd /home/master/venvs
nano mysite.env
FLASK_APP=security
FLASK_ENV=production
APP_CONFIG_FILE=/home/master/projects/flask/config/production.py
---
sudo apt -y install nginx
---
cd /etc/nginx/sites-available
sudo nano mysite
server {
listen 80;
server_name 192.168.X.XXX;
location = /favicon.ico { access_log off; log_not_found off; }
location /static {
alias /home/master/projects/flask/security/static;
}
location / {
include proxy_params;
proxy_pass http://unix:/tmp/mysite.sock;
}
}
> servername은 11을 입력해줌
---
cd /etc/nginx/sites-enabled
sudo rm -rf default
sudo ln -s /etc/nginx/sites-available/mysite
sudo systemctl restart nginx
> 이거 해주려면 apache2 꺼야함
> systemctl stop apache2
sudo nginx -t
sudo systemctl start nginx
---
pip install gunicorn
---
sudo nano /etc/systemd/system/mysite.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=master
Group=master
WorkingDirectory=/home/master/projects/flask
EnvironmentFile=/home/master/venvs/mysite.env
ExecStart=/home/master/venvs/mysite/bin/gunicorn \
--workers 2 \
--bind unix:/tmp/mysite.sock \
"security:create_app()"
[Install]
WantedBy=multi-user.target
---
sudo systemctl enable nginx
sudo systemctl enable mysite
cd ~
mkdir projects
cd projects
mkdir flask
cd flask
unzip flask.zip
sudo reboot
sudo systemctl restart nginx
sudo systemctl restart mysite
#서버와 개발 환경을 위한 config 분리
> 본 PC flask 아래에 config 디렉토리를 만들어주자
__init__.py
default.py
production.py
development.py
> config 아래 파일들
default.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
development.py
from config.default import *
SQLALCHEMY_DATABASE_URI='sqlite:///{}'.format(os.path.join(BASE_DIR,'security.db'))
SQLALCHEMY_TRACK_MODIFICATIONS=False
SECRET_KEY="dev"
> 우리 서버에 있는 데이터베이스는 mysql
> sqlite가 제대로 작동되는지 확인하고 mysql로 바꿀것이다
production.py
from config.default import *
SQLALCHEMY_DATABASE_URI='sqlite:///{}'.format(os.path.join(BASE_DIR,'security.db'))
SQLALCHEMY_TRACK_MODIFICATIONS=False
SECRET_KEY="dev"
> cmd 창에서 python -c "import os;print(os.urandom(16))"
> b'\xdex\xc9\xde"\xf3\xfb!~\x17\x99\xa8\xdb\x95~\\'
> SECRET_KEY="dev" > dev 대신에 넣어주면 됨
security > __init__.py
app.config.from_envvar('APP_CONFIG_FILE')
> 추가
mysite.cmd
@echo off
cd c:\projects/flask
set FLASK_APP=security
set FLASK_ENV=development
set APP_CONFIG_FILE=c:\projects\flask\config\development.py
c:\venvs\mysite\scripts\activate
cmd 창에
set APP_CONFIG_FILE=C:\projects\flask\config\development.py
> flask run
> 개발자 모드로 바뀐다
> 웹도 다시 돌아간다
+) 경로
base.html > href="{{url_for('main.index')}}"> sidebar 경로 바꿔줌
#login.html
> views\auth.py에 login blueprint 생성
@bp.route('/login')
def login():
return render_template('auth/login.html')
> base.html에 auth.index 경로 주기
<a class="collapse-item" href="{{url_for('auth.login')}}">Login</a>
> templates\auth\login.html에 웹페이지 꾸며주는 코드 넣기
> zip 파일에 있음
{% extends 'base.html' %}
{% block content %}
{% endblock %}
> 블럭 사이에 넣어줌