파이썬 플라스크 파일 체크섬

안녕하십니까.! 잘 지내고 계시길 바랍니다. 오늘 우리는 파일의 체크섬을 생성하고 체크섬으로 파일을 평가하는 작은 응용 프로그램을 만드는 방법을 배웁니다.

내가 사용할 체크섬SHA256의 경우 원하는 알고리즘을 사용할 수 있습니다. 여기에서 코드를 찾을 수 있습니다GitHub Repo.

응용 프로그램을 시작하겠습니다.

새로운 디렉토리를 만들고 들어가십시오.

mkdir flask-checksum && cd flask-checksum


가상 환경 초기화

python -m venv vnev


또는

virtualenv venv


virtualenv 활성화

source venv/bin/activate


이제 플라스크를 설치할 시간입니다.

pip install flask


이제 응용 프로그램을 위한 디렉터리 구조를 만들 시간입니다. 간단하게 만들겠습니다.

📦flask-checksum
 ┣ 📂static
 ┃ ┣ 📂css
 ┃ ┣ 📂js
 ┃ ┗ 📂uploads
 ┣ 📂templates
 ┃ ┣ 📂includes
 ┃ ┣ 📂layouts
 ┃ ┗ 📂pages
 ┗ 📜app.py


이 프로젝트에 대한 CSSJs 파일을 각각 static/cssstatic/js에 다운로드하고 배치합니다. 그 후 디렉토리 구조는 다음과 같습니다.

📦static
 ┣ 📂css
 ┃ ┗ 📜bootstrap.min.css
 ┣ 📂js
 ┃ ┗ 📜bootstrap.bundle.min.js
 ┗ 📂uploads
 ┃ ┗ 📜.gitignore


이제 열기app.py 애플리케이션 빌드를 시작하고 이 코드 줄은 브라우저에 hello, world의 출력을 표시합니다.

from flask import Flask


app = Flask(__name__)

@app.route('/')
def index():
   return "Hello, World"


if __name__ == '__main__':
   app.run()


이 응용 프로그램을 실행하십시오.

python app.py


이렇게 하면 서버가 시작되고 이 URL127.0.0.1:5000에서 애플리케이션에 액세스할 수 있습니다.
templates/layouts create app.html 파일에서 응용 프로그램에 대한 템플릿을 만들 시간입니다. 이것은 응용 프로그램의 마스터 레이아웃이 될 것입니다. 이 모든 템플릿은 이 템플릿을 확장합니다.

app.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}">
</head>
<body class="bg-white-500">

    {% include 'includes/navbar.html' %}

    <div class="container">
        {% block content %}{% endblock %}
    </div>

    <script src="{{ url_for('static', filename='js/bootstrap.bundle.min.js') }}"></script>
</body>
</html>

navbar.html에 파일templates/includes을 생성합니다.

navbar.html

<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
  <div class="container">
    <a class="navbar-brand" href="{{ url_for('create_checksum') }}">File CheckSum</a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ms-auto mb-2 mb-lg-0">
        <li class="nav-item">
          <a class="nav-link {% if request.endpoint == 'create_checksum' %} active {% endif %}" aria-current="page" href="{{ url_for('create_checksum') }}">Create</a>
        </li>
        <li class="nav-item">
          <a class="nav-link {% if request.endpoint == 'verify_checksum' %} active {% endif %}" href="{{ url_for('verify_checksum') }}">Verify</a>
        </li>
      </ul>
    </div>
  </div>
</nav>


이제 체크섬을 생성하기 위한 애플리케이션과 확인을 위한 두 번째 템플릿이 두 개 더 필요합니다. templates/pages에 두 개의 파일을 더 생성해 보겠습니다. 첫 번째는 create.html이고 두 번째는 verify.html입니다.

create.html

{% extends 'layouts/app.html' %}

{% block title %} Create CheckSum {% endblock %}

{% block content %}

    <div class="row py-5">
        <div class="col-md-8 offset-md-2 col-sm-12">
            <div class="card shadow">
                <div class="card-body">
                    <h5 class="card-title">
                        Create CheckSum
                    </h5>
                    <form action="{{ url_for('create_checksum') }}" method="post" enctype="multipart/form-data">
                        <div class="mb-3">
                            <label for="formFile" class="form-label">File</label>
                            <input class="form-control" type="file" id="formFile" name="file">
                        </div>
                        <div class="mb-3 float-end">
                            <button class="btn btn-primary" type="submit">create</button>
                        </div>
                    </form>
                </div>
            </div>
            {% if checksum %}
            <div class="card shadow mt-3">
                <div class="card-body">
                    <h4 class="card-title">your CheckSum</h4>
                    <p class="bg-primary p-3 text-white">{{ checksum }}</p>
                </div>
            </div>
            {% endif %}
        </div>
    </div>

{% endblock %}


verify.html

{% extends 'layouts/app.html' %}

{% block title %} Verify CheckSum {% endblock %}

{% block content %}

    <div class="row py-5">
        <div class="col-md-8 offset-md-2 col-sm-12">
            <div class="card shadow">
                <div class="card-body">
                    <h5 class="card-title">
                        Verify CheckSum
                    </h5>
                    <form action="{{ url_for('verify_checksum') }}" method="post" enctype="multipart/form-data">
                        <div class="mb-3">
                            <label for="formFile" class="form-label">File</label>
                            <input class="form-control" type="file" id="formFile" name="file">
                        </div>
                        <div class="mb-3">
                            <label for="checksum">CheckSum</label>
                            <input type="text" name="checksum" class="form-control" placeholder="CheckSum">
                        </div>
                        <div class="mb-3 float-end">
                            <button class="btn btn-primary" type="submit">Verify</button>
                        </div>
                    </form>
                </div>
            </div>
            {% if status != None %}
            <div class="card shadow mt-3">
                <div class="card-body">
                    {% if status %}
                        <div class="alert alert-success">Your file is authentic.</div>
                    {% else %}
                        <div class="alert alert-danger">Your file is not authentic.</div>
                    {% endif %}
                </div>
            </div>
            {% endif %}
        </div>
    </div>

{% endblock %}


따라서 templates 디렉토리 구조는 다음과 같습니다.

📦templates
 ┣ 📂includes
 ┃ ┗ 📜navbar.html
 ┣ 📂layouts
 ┃ ┗ 📜app.html
 ┗ 📂pages
 ┃ ┣ 📜create.html
 ┃ ┗ 📜verify.html


이제 애플리케이션의 기본 로직을 생성하여 app.py의 체크섬 생성과 파일의 이 함수로 시작합니다.

@app.route('/', methods=['GET', 'POST'])
def create_checksum():
    checksum = None
    if request.method == 'POST':
        file = request.files['file']
        new_name = secure_filename(file.filename)
        file.save('static/uploads/'+new_name)
        checksum = sha256(new_name)
        os.remove('static/uploads/'+new_name)
    return render_template('pages/create.html', checksum=checksum)


이 기능을 추가하면 app.py가 다음과 같이 표시됩니다.

from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
import hashlib
import os


app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def create_checksum():
    checksum = None
    if request.method == 'POST':
        file = request.files['file']
        new_name = secure_filename(file.filename)
        file.save('static/uploads/'+new_name)
        checksum = sha256(new_name)
        os.remove('static/uploads/'+new_name)
    return render_template('pages/create.html', checksum=checksum)



if __name__ == '__main__':
    app.run(debug=True)


이제 체크섬을 확인하기 위한 두 번째 함수를 만듭니다.

@app.route('/verify-checksum', methods=['GET', 'POST'])
def verify_checksum():
    status = None
    if request.method == 'POST':
        file = request.files['file']
        checksum = request.form.get('checksum')
        new_name = secure_filename(file.filename)
        file.save('static/uploads/' + new_name)
        new_checksum = sha256(new_name)
        status = checksum == new_checksum
        os.remove('static/uploads/' + new_name)
    return render_template('pages/verify.html', status=status)


이 기능을 추가하면 app.py가 다음과 같이 표시됩니다.

from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
import hashlib
import os


app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def create_checksum():
    checksum = None
    if request.method == 'POST':
        file = request.files['file']
        new_name = secure_filename(file.filename)
        file.save('static/uploads/'+new_name)
        checksum = sha256(new_name)
        os.remove('static/uploads/'+new_name)
    return render_template('pages/create.html', checksum=checksum)


@app.route('/verify-checksum', methods=['GET', 'POST'])
def verify_checksum():
    status = None
    if request.method == 'POST':
        file = request.files['file']
        checksum = request.form.get('checksum')
        new_name = secure_filename(file.filename)
        file.save('static/uploads/' + new_name)
        new_checksum = sha256(new_name)
        status = checksum == new_checksum
        os.remove('static/uploads/' + new_name)
    return render_template('pages/verify.html', status=status)


if __name__ == '__main__':
    app.run(debug=True)


이제 해싱을 담당할 애플리케이션의 주요하고 중요한 기능에 대한 시간입니다.

def sha256(file_name):
    hash_sha256 = hashlib.sha256()
    with open('static/uploads/'+file_name, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_sha256.update(chunk)
    return hash_sha256.hexdigest()


이 기능을 추가하면 app.py가 다음과 같이 표시됩니다.

from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
import hashlib
import os


app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def create_checksum():
    checksum = None
    if request.method == 'POST':
        file = request.files['file']
        new_name = secure_filename(file.filename)
        file.save('static/uploads/'+new_name)
        checksum = sha256(new_name)
        os.remove('static/uploads/'+new_name)
    return render_template('pages/create.html', checksum=checksum)


@app.route('/verify-checksum', methods=['GET', 'POST'])
def verify_checksum():
    status = None
    if request.method == 'POST':
        file = request.files['file']
        checksum = request.form.get('checksum')
        new_name = secure_filename(file.filename)
        file.save('static/uploads/' + new_name)
        new_checksum = sha256(new_name)
        status = checksum == new_checksum
        os.remove('static/uploads/' + new_name)
    return render_template('pages/verify.html', status=status)


def sha256(file_name):
    hash_sha256 = hashlib.sha256()
    with open('static/uploads/'+file_name, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_sha256.update(chunk)
    return hash_sha256.hexdigest()


if __name__ == '__main__':
    app.run(debug=True)


이제 애플리케이션을 실행할 시간입니다.

python app.py



http://127.0.0.1:5000




나와 함께 해주셔서 감사합니다.

Flask를 배우고 싶다면 내 시리즈를 시작했습니다. 확인하십시오.

여러분이 생각하는 것, 질문 및 제안 사항을 자유롭게 적어야 합니다.

감사합니다 🤗

좋은 웹페이지 즐겨찾기