Использую 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