@gyndybin

При добавление записи в sqlite flask добавляются знаки вопроса вместо кириллицы, как исправить это?

Использую Flask, SQLite. Обшарил пол интернета, шаманю с кодировкой 10 часов, не могу понять в чем проблема, в json выводятся вопросительные знаки вместо кириллицы, в бд вопросительные знаки. Но латиница работает нормально.

Файл app.py
from flask import Flask
from flask_restful import Api
from config import Config
from models import db
from resources import InfrastructureResource, InfrastructureSearchResource

app = Flask(__name__)  #создание фласк приложения
app.config.from_object(Config) #вызов функции конфиг для подкл к бд
app.json.ensure_ascii = False
app.json.mimetype = "application/json; charset=utf-8"
api = Api(app)

db.init_app(app)

# создание всех таблиц в бд
with app.app_context():
    db.create_all()

# маршруты (запросы через браузер)
api.add_resource(InfrastructureResource, '/infrastructure', '/infrastructure/<int:id>')
api.add_resource(InfrastructureSearchResource, '/infrastructure/search')

# запуск приложения
if __name__ == '__main__':
    app.run(debug=True)


Файл models.py
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()  # создание бд


class Infrastructure(db.Model):
    id = db.Column(db.Integer, primary_key=True) # инт т.к. id
    name = db.Column(db.String(50), nullable=False) # название длина и запрет на null
    location = db.Column(db.String(50), nullable=False) # расположение длина и запрет на null

    def __repr__(self): #возвращает обьект класса(бд)
        return f'<Инфраструктура {self.name}>'


Файл config.py
import os #для доступа к файлам в винде
#путь к бд
BASE_DIR = os.path.abspath(os.path.dirname(__file__))

#подключение к бд
class Config:
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(BASE_DIR, 'database.db') + '?charset=utf8'


Файл resources.py
from flask import request, jsonify, make_response
from flask_restful import Resource
from models import db, Infrastructure


class InfrastructureResource(Resource):
    def get(self, id=None):
        if id:
            infra = Infrastructure.query.get_or_404(id)
            response_data = {"id": infra.id, "name": infra.name.decode('utf-8'),
                             "location": infra.location.decode('utf-8')}
        else:
            infra_list = Infrastructure.query.all()
            response_data = [
                {"id": infra.id, "name": infra.name.decode('utf-8'), "location": infra.location.decode('utf-8')} for
                infra in infra_list]

        response = make_response(jsonify(response_data))
        response.headers['Content-Type'] = 'application/json; charset=utf-8'
        return response

    def post(self):
        data = request.get_json()
        name = data['name'].encode('utf-8')
        location = data['location'].encode('utf-8')
        new_infra = Infrastructure(
            name=name,
            location=location
        )
        db.session.add(new_infra)
        db.session.commit()
        response_data = {"message": "Успешно добавлено", "id": new_infra.id}
        response = make_response(jsonify(response_data), 201)
        response.headers['Content-Type'] = 'application/json; charset=utf-8'
        return response


class InfrastructureSearchResource(Resource):
    def get(self):
        name = request.args.get('name')
        location = request.args.get('location')

        query = Infrastructure.query

        if name:
            query = query.filter(Infrastructure.name.like(f'%{name}%'))
        if location:
            query = query.filter(Infrastructure.location.like(f'%{location}%'))

        infra_list = query.all()
        response_data = [
            {"id": infra.id, "name": infra.name.decode('utf-8'), "location": infra.location.decode('utf-8')} for infra
            in infra_list]
        response = make_response(jsonify(response_data))
        response.headers['Content-Type'] = 'application/json; charset=utf-8'
        return response


Flask==2.3.2
Flask-SQLAlchemy==3.0.3
Flask-RESTful==0.3.9
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы