我有用烧瓶写的api。它使用sqlalchemy来处理mysql数据库。我不使用flask-sqlalchemy,因为我不喜欢该模块强制您进入某种模式来声明模型的方式。
我有一个数据库连接没有关闭的问题。表示连接的对象超出范围,因此我假设它正在被垃圾收集。我还明确地在会话上调用close()。尽管有这些事实,但在api调用返回响应后很长时间,连接仍保持打开状态。
sqlsession.py:这是我用于会话的包装器。
class SqlSession:
def __init__(self, conn=Constants.Sql):
self.db = SqlSession.createEngine(conn)
Session = sessionmaker(bind=self.db)
self.session = Session()
@staticmethod
def createEngine(conn):
return create_engine(conn.URI.format(user=conn.USER, password=conn.PASS, host=conn.HOST, port=conn.PORT, database=conn.DATABASE, poolclass=NullPool))
def close(self):
self.session.close()
Run Code Online (Sandbox Code Playgroud)
flaskroutes.py:这是实例化flask应用程序并使用包装对象的示例。请注意,它会在api调用范围内的开始处实例化它,然后在结束时关闭会话,并且大概是在返回响应之后进行垃圾回收。
def commands(self, deviceId):
sqlSession = SqlSession(self.sessionType) <---
commandsQueued = getCommands()
jsonCommands = []
for command in commandsQueued:
jsonCommand = command.returnJsonObject()
jsonCommands.append(jsonCommand)
sqlSession.session.delete(command)
sqlSession.session.commit()
resp = jsonify({'commands': jsonCommands})
sqlSession.close() <---
resp.status_code = 200
return resp
Run Code Online (Sandbox Code Playgroud)
我希望在做出http响应后即可清除连接,但是连接最终会以“ SLEEP”状态结束(在mysql命令行界面“ show processlist”中查看时)。
我们有两个表:用户和权限
我们想要选择所有没有“访客”权限的用户。现在,用户可以拥有多个权限(而不仅仅是 1 个),因此简单地查询 !"guest" 是行不通的。现在我们的查询如下所示:
query = session.query(Users).join(Permission, and_(
Permission.userId == theUser.uid, Permission.deviceId== theDevice.uid))
query.join(Permission).filter(~exists().where(and_(Permission.level==SqlConstants.PermissionLevels.GUEST, Users.uid == Permission.userId)))
Run Code Online (Sandbox Code Playgroud)
我不确定第一行中的连接是否与我们遇到的问题相关,但我们正在使用它,所以我将其包含在这里。(如果不相关的话我会编辑掉。)
上面返回以下异常:
returned no FROM clauses due to auto-correlation; specify correlate(<tables>) to control correlation manually.
Run Code Online (Sandbox Code Playgroud)
我从下面的SO帖子中收集了这个模式: Using NOT EXISTS Clause in sqlalchemy ORM query
以及来自 sqlalchemy 文档(关于不存在的内容很浅): http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html
我不清楚我做错了什么或是否有更好的方法。
我们使用模拟器已经有一段时间了。突然,他们停止在两个开发人员(但不是所有开发人员)的机器上工作。他们尝试调用firebase emulators:start,然后收到以下错误消息:Error: An unexpected error has occurred.
我们真的不知道为什么会发生这种情况。我们甚至尝试重做 firebase init 和 emulators init。到目前为止,我们所做的一切尝试都没有帮助。以下是控制台输出以了解更多详细信息:
\n\xe2\x9e\x9c firebase git:(dev-vab) \xe2\x9c\x97 firebase emulators:start\ni emulators: Starting emulators: functions, firestore, database, hosting, pubsub\n\xe2\x9a\xa0 functions: The following emulators are not running, calls to these services from the Functions emulator will affect production: auth\n\xe2\x9a\xa0 Your requested "node" version "10" doesn't match your global version "14"\ni firestore: Firestore Emulator logging to firestore-debug.log\ni database: Database Emulator logging to database-debug.log\ni hosting: Serving hosting files from: public\n\xe2\x9c\x94 …Run Code Online (Sandbox Code Playgroud) 我似乎无法在用户界面中找到修改运行状况检查 url 的位置。我什至尝试直接查看 EC2 用户界面中的负载均衡器,但编辑 HealthCheck 按钮显示为灰色。aws 文档显示了健康检查的用户界面,但他们没有描述在哪里可以找到它!
有谁知道这个用户界面的路径?
我过去曾经构建过Flask API,但是我从来没有像我这样被允许从事测试驱动开发的项目参与其中。现在我。
我读过的每本方法手册都以一种绝对非面向对象的方式定义了flask-api。这使得编写单元测试非常困难,因为不能将可选或特定于测试的参数传递到实例化的api中。
例如,此博客介绍了一种为flask-api创建单元测试的方法:http : //mkelsey.com/2013/05/15/test-driven-development-of-a-flask-api/
博客在测试模式下会设置环境变量,脚本会监视该变量,并在找到该变量时更改其行为。这对我来说似乎是不可取的。让源代码渗入OS环境的想法很长,这是一个坏主意。我是封装功能的忠实拥护者,以最大程度地提高可移植性并在模块的开始和结束位置之间进行清晰的区分。
为了满足我的编码理念,可能有人建议我将Flask API包装在一个类中。但是,我不清楚人们将如何做这样的事情。例如,Flask使用装饰器来定义路线:
@app.route()
Run Code Online (Sandbox Code Playgroud)
这怎么适合一个班级?
我将非常感谢任何以面向对象的方式开发了Flask API的人的指导。
我们的气流实现发出http请求以获取服务来执行任务。我们希望这些服务在完成任务时让气流知道,因此我们将向其发送回调URL,以在任务完成时调用它们。但是,我似乎找不到回调传感器。人们通常如何处理?
我正在尝试用棉花糖反序列化深层结构。例如:
hour = {
'day': {
'name': 'monday'
}
}
loaded_hour, error = HoursSerializationSchema().load(hour) # this works
new_practitioner_at_location = {
'hours': [
hour
]
}
loaded, error = PractitionerToServiceLocationSerializationSchema().load(new_practitioner_at_location) # this fails
Run Code Online (Sandbox Code Playgroud)
当我尝试反序列化时,new_practitioner_at_location我得到以下信息(发生在序列化程序使用“ day”键时):
AttributeError: 'dict' object has no attribute '_sa_instance_state'
请注意,当相同的数据结构(小时)未嵌套在时,相同的模式可以反序列化该数据结构new_practitioner_at_location。
显示问题的自包含脚本:
from sqlalchemy import Column, Integer, ForeignKey, String
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from flask_migrate import …Run Code Online (Sandbox Code Playgroud) python ×4
flask ×3
sqlalchemy ×3
mysql ×2
airflow ×1
api ×1
callback ×1
firebase ×1
firebase-cli ×1
marshmallow ×1
not-exists ×1
unit-testing ×1