Приложение Flask, работающее в Docker для загрузки файловPython

Программы на Python
Ответить
Anonymous
 Приложение Flask, работающее в Docker для загрузки файлов

Сообщение Anonymous »

Я написал следующее приложение flask, которое собирает выбранный файл и затем загружает его в базу данных, работающую в sql lite. Если я запускаю приложение локально, оно отлично работает с таблицей, созданной в базе данных, и со всеми загруженными данными. Однако если я запускаю приложение с помощью Docker, я получаю 200 при загрузке файла, но не вижу таблицы, созданной в базе данных, вместе со всеми данными.
Вот код:
import os
import sqlite3
from flask import Flask, flash, jsonify, request, redirect, render_template
from werkzeug.utils import secure_filename

app = Flask(__name__)
app.secret_key = "secret key"
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

path = os.getcwd()
uploadFolder = 'app/uploads'
os.makedirs(uploadFolder, exist_ok=True)
app.config['UPLOAD_FOLDER'] = uploadFolder

allowedExtensions = set(['txt'])

# Initialize SQLite database
#database = os.path.join(path, 'file_uploads.db')
database = 'app/uploads/file_uploads.db'

# Health check to see if the service is active
@app.route('/healthCheck', methods=['GET'])
def checkStatus():
response = {
'healthCheck': 'Flask service is up and running!'
}
return jsonify(response), 200

def createTable():
conn = sqlite3.connect(database)
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS words
(id INTEGER PRIMARY KEY AUTOINCREMENT,
word TEXT NOT NULL,
filename TEXT NOT NULL,
filepath TEXT NOT NULL)''')
conn.commit()
conn.close()

createTable()

def allowedFile(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in allowedExtensions

@app.route('/')
def uploadForm():
return render_template('upload.html')

@app.route('/', methods=['POST'])
def uploadFile():
if request.method == 'POST':
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)

file = request.files['file']
if file.filename == '':
flash('No file selected for uploading')
return redirect(request.url)

if file and allowedFile(file.filename):
filename = secure_filename(file.filename)
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)

# Read content of the file and split into words
with open(filepath, 'r') as f:
content = f.read()
words = content.split()

# Insert each word into the SQLite database
conn = sqlite3.connect(database)
c = conn.cursor()
for word in words:
c.execute("INSERT INTO words (word, filename, filepath) VALUES (?, ?, ?)", (word, filename, filepath))
conn.commit()
conn.close()

flash('File successfully uploaded and words saved to database')
return render_template('upload.html')
else:
flash('Allowed file types are txt')
return redirect(request.url)

# Route to get word by ID
@app.route('/word/', methods=['GET'])
def getWordById(id):
conn = sqlite3.connect(database)
c = conn.cursor()
c.execute("SELECT word FROM words WHERE id=?", (id,))
word = c.fetchone()
conn.close()
if word:
return jsonify({'id': id, 'word': word[0]}), 200
else:
return jsonify({'error': 'Word not found'}), 404

if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000)

Может кто-нибудь помочь мне понять, почему таблица не отображается в sql lite, хотя в журнале загрузки файла отображается значение 200.
Вот ожидаемый результат:
Изображение

Изображение

Изображение

Изображение

Мне не удается получить ожидаемый результат в SQLLite при запуске приложения с помощью Docker. Что я делаю не так?
Вот содержимое файла докера:
# Use an official Python runtime as a parent image
FROM python:3.8-slim

# Set the working directory in the container
WORKDIR /app

# Copy the Flask application directory into the container at /app
COPY . /app

# Install any needed dependencies specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Make port 5000 available to the world outside this container
EXPOSE 5000

# Set the upload folder as a volume
VOLUME /app/uploads

# Define environment variable
ENV FLASK_APP=test.py

# Run the Flask application when the container launches
CMD ["flask", "run", "--host=0.0.0.0"]

Код Makefile:
# Variables
DOCKER_IMAGE_NAME = my-flask-app
DOCKER_CONTAINER_NAME = my-flask-container
TEST_FILE = upload/word.txt

# Targets
build:
docker build -t $(DOCKER_IMAGE_NAME) .

run:
docker run -d -p 5000:5000 --name $(DOCKER_CONTAINER_NAME) $(DOCKER_IMAGE_NAME)

test: build
docker run $(DOCKER_IMAGE_NAME) python -u test.py

upload:
curl -X POST -F "file=@$(TEST_FILE)" http://127.0.0.1:5000/

stop:
docker stop $(DOCKER_CONTAINER_NAME)
docker rm $(DOCKER_CONTAINER_NAME)

.PHONY: build run stop test upload


Подробнее здесь: https://stackoverflow.com/questions/784 ... ile-upload
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»