【问题标题】:How to store API requests in database using Flask and SQLAlchemy如何使用 Flask 和 SQLAlchemy 在数据库中存储 API 请求
【发布时间】:2019-09-15 09:27:17
【问题描述】:

我正在尝试将我的 API 请求数据存储在我的数据库中。我正在从请求中查找某些字段,即要存储在数据库中的 URL、REMOTE_ADDR。我正在使用烧瓶和 sqlalchemy 将我的 api 和数据库连接到 mysql 数据库。任何帮助将不胜感激。

我创建了一个日志模型,将 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)

实际结果:“日志”表中没有数据

预期结果:“日志”表中的数据

更新:

我发现我错过了使用烧瓶中的 before_request 功能的逻辑。我已经相应地更新了代码。谢谢 Iguananaut。

【问题讨论】:

  • 看起来你实际上并没有任何事情,create_log 或在任何地方调用它?你打算吗?也许用app.before_request注册?
  • @Iguananaut 你能在我的 before_request 代码上放一个示例代码或一个小例子吗?我是烧瓶新手,我想我可能错过了使用 before_request
  • @Iguananaut 我想我明白了。请在上面找到更新的代码,让我知道这是否是安全和高效的正确方法。

标签: python flask flask-sqlalchemy


【解决方案1】:

将此块添加到 app.py 的代码中以实际使用 before_request。

@app.before_request
def log_requests():
    create_log()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 2020-08-05
    • 1970-01-01
    • 2021-01-03
    • 2013-07-30
    相关资源
    最近更新 更多