Я пытаюсь сохранить данные запроса API в моей базе данных. Я ищу определенные поля из запроса, а именно URL REMOTE_ADDR для хранения в базе данных. Я использую колбу и sqlalchemy для моих API и подключения к базе данных MySQL базы данных. Любая помощь будет оценена.
Я создал модель Log, в которой поля id, url, remote_addr должны быть сохранены в базе данных, и я написал функцию для чтения запроса и сопоставления его с моделью. Я не знаю, где я ошибаюсь, пытаясь добиться этого. Я включаю мои app.py, log.py, loggerapi.py.
app.py
from flask import Flask, jsonify, send_from_directory
from flask_sqlalchemy import SQLAlchemy
from test import test_api
from usersapi import users_api
from authusersapi import authusers_api
from loggerapi import create_log
from database.db import db_uri
from flask_marshmallow import Marshmallow
import os
# Init app
app = Flask(__name__)
# config
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO'] = False
# Init db
db = SQLAlchemy(app)
db.create_all()
# Init ma
ma = Marshmallow(app)
# add urls
app.register_blueprint(test_api, url_prefix='/test')
app.register_blueprint(users_api, url_prefix='/users')
app.register_blueprint(authusers_api, url_prefix='/auth_users')
# logging
@app.before_request
def log_requests():
create_log()
# Run the server
if __name__=='__main__':
app.run(debug=True)
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'),
'favicon.ico')
Log.py (модель)
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from datetime import datetime
import socket
db = SQLAlchemy()
ma = Marshmallow()
class Log(db.Model):
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.String(100))
remote_addr = db.Column(db.String(100))
created_at = db.Column(db.DateTime, default=datetime.utcnow) # the current timestamp
def __init__(self, url, remote_addr):
self.url = url
self.remote_addr = remote_addr
class LogSchema(ma.Schema):
class Meta:
fields = ('url', 'remote_addr', 'created_at')
loggerapi.py (функция, которая создает журнал и фиксирует его в БД)
from flask import request
from database.db import session_scope
from Models.Log import Log, LogSchema
log_schema = LogSchema(strict=True)
logs_schema = LogSchema(many=True, strict=True)
def create_log():
with session_scope() as session:
url = request.url
remote_addr = request.remote_addr
new_log = Log(url, remote_addr)
print(new_log)
session.add(new_log)
session.commit()
return log_schema.jsonify(new_log)
Фактические результаты: в таблице «Журнал» нет данных
Ожидаемые результаты: данные в таблице 'Log'
Обновление:
Я понял, что упустил логику для использования функции before_request из колбы. Я обновил код соответственно. Спасибо Игуананаут.