python - 如何使用 Flask 和 SQLAlchemy 在数据库中存储 API 请求
问题描述
我正在尝试将我的 API 请求数据存储在我的数据库中。我正在从请求中查找某些字段,即要存储在数据库中的 URL、REMOTE_ADDR。我正在使用烧瓶和 sqlalchemy 将我的 api 和数据库连接到 mysql 数据库。任何帮助,将不胜感激。
我创建了一个日志模型,将 id、url、remote_addr 字段存储在数据库中,并且我编写了一个函数来读取请求并将其映射到模型中。在尝试实现这一目标时,我不知道我在哪里不正确。我包括我的 app.py、log.py、loggerapi.py。
应用程序.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')
日志.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)
实际结果:“日志”表中没有数据
预期结果:“日志”表中的数据
更新:
我发现我错过了使用烧瓶中的 before_request 功能的逻辑。我已经相应地更新了代码。谢谢鬣蜥。
解决方案
将此块添加到 app.py 的代码中以实际使用 before_request。
@app.before_request
def log_requests():
create_log()
推荐阅读
- node.js - Nodejs错误:它表示未捕获的承诺存在问题,并且在将标头发送到客户端后无法发送标头
- javascript - 使用 moment.js 解析 DD-MM-YYYY HH:MM:SS 无效
- java - Spring Boot - 不要解析 application.properties 文件中的占位符
- r - 如何估计一系列线性段以拟合指数曲线?
- bioinformatics - RGI 输出文件名与蛇文件输出文件名不匹配
- mysql - 如果列中已存在列的值,则使用 sql 中的尾部增加列的值
- r - 如何使用 R Studio 中的代码保存 R 代码
- oracle - SQLPLUS 记录未正确显示
- swift - 如何在没有设备屏幕缩放的情况下创建 NSImage
- python - 当我将惩罚更改为 L1 时,为什么我的 linearSVC 会失败?