首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用基于Python的开源框架和NoSQL后端构建REST

使用基于Python的开源框架和NoSQL后端构建REST
EN

Stack Overflow用户
提问于 2022-08-19 18:45:50
回答 3查看 232关注 0票数 1

我希望使用NoSQL后端和基于Python的开源框架构建REST来构建API。这个API将运行在云环境中,其目标是实现云无关,并且能够部署到任何地方。它必须对后端数据库技术有一定的抽象。我发现Django REST框架正是我所要寻找的,但是Django ORM只支持RDBMS。为了在Django中启用NoSQL支持,似乎已经开发了一些开源包,但这些项目已经被放弃。

我知道从技术上讲,在Django REST框架中使用Amazon或Azure是可能的,但由于它没有得到官方支持,它听起来似乎需要定制代码并偏离标准配置才能工作。

  • 是否有人使用使用Django框架的NoSQL后端运行API以供生产使用?
  • 使用Django REST框架,是否可以抽象后端数据库连接以支持不同的NoSQL数据库类型?
  • 像Flask这样的框架更适合使用这种后端创建REST吗?
  • 如果Django REST框架不能满足这些要求,是否还有其他REST框架可以提供所需的功能?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-08-19 22:55:05

运行Django + MongoDB是可能的,但这不是一个好主意。

主要原因是Django没有官方支持Mongodb。有一个名为Djongo的包,它非常不可靠且未完成,允许您使用Django的ORM,但是有很多缺陷。你可以检查一下github存储库中的问题数量

相反,您可以使用PyMongo将django与mongodb连接起来,但请记住,您必须认真地执行查询。

此外,在处理django中的不同数据库方面,我已经做了这样的事情,但是在Postgres和mongodb中,您必须创建一个路由器类来管理连接。

在我看来,我会使用FastAPI并查看一下它几乎与Flask相似,但显然有更好的方法来创建API。

票数 1
EN

Stack Overflow用户

发布于 2022-08-19 18:47:13

我会用烧瓶+ mongodb

票数 1
EN

Stack Overflow用户

发布于 2022-08-26 09:41:13

因此,Django不支持NOSQL数据库的抽象。实际上,它有一个内部对象关系Mapper (ORM)库来解释真实代码中的对象-- SQL数据库。

您需要的是一个对象数据映射器(ODM),因为NOSQL数据库由原始数据组成,比如基于文档的MongoDB。

根据我的经验,几个月前,我使用这个python (https://github.com/MatteoGuadrini/nosqlapi - https://nosqlapi.readthedocs.io/en/latest/)构建了一个特定抽象的库,用于处理云中的数据库。

在您的示例中,您应该基于文档数据库(如MongoDB或CouchDB )构建模块,然后将其部署到云帐户中。

在这里,您可以找到一个基于MongoDB:docdb.py的文档数据库的示例(测试)

如果您跟随我,就开始创建以下类:

代码语言:javascript
复制
import nosqlapi.docdb

# MongoDB like database
class MongoConnection(nosqlapi.docdb.DocConnection):...
class MongoSession(nosqlapi.docdb.DocSession):...
class MongoResponse(nosqlapi.docdb.DocResponse):...
class MongoBatch(nosqlapi.docdb.DocBatch):...
class MongoSelector(nosqlapi.docdb.DocSelector):...

这样,您就可以使用所需的数据库:

代码语言:javascript
复制
# Use MongoDB library
conn = MongoConnection(host='server.local', username='admin', password='pass')
sess = conn.connect()       # return MongoSession object
# Create a new database
conn.create_database('new_db')

# CRUD operation
C = sess.insert(path='db/doc1', doc={"_id": "5099803df3f4948bd2f98391", "name": "Arthur", "age": 42})           # Create
R = sess.get(path='db/doc1')                                                                                    # Read
U = sess.update(path='db/doc1', doc={"_id": "5099803df3f4948bd2f98391", "name": "Arthur", "age": 43}, rev=2)    # Update
D = sess.delete(path='db/doc1', rev=2)                                                                          # Delete

print(R)                                    # {"_id": "5099803df3f4948bd2f98391", "rev"= 2, "name": "Arthur", "age": 42}
print(type(R))                              # <class 'MongoResponse'>
print(isinstance(R, nosqlapi.Response))     # True

# Extended CRUD operations
sess.insert_many(database='db', docs=[{"_id": "5099803df3f4948bd2f98391", "name": "Arthur", "age": 42}, 
                 {"_id": "5099803df3f4948bd2f98392", "name": "Arthur", "age": 43}])
sess.update_many(database='db', docs=[{"_id": "5099803df3f4948bd2f98391", "name": "Arthur", "age": 42, "rev": 2}, 
                 {"_id": "5099803df3f4948bd2f98392", "name": "Arthur", "age": 43, "rev": 2}])

# Complex select operation
sel = MongoSelector(selector={"name": "Arthur"}, fields=['_id', 'name', 'age'], limit=2)
sess.find(sel)

此外,库有一组很好的ODM对象来将您的代码映射到数据库:https://nosqlapi.readthedocs.io/en/latest/build.html#odm-classes,例如Mongo文档和PermissionDocuments .

在我看来,这是最好的办法。

此外,通过在google上搜索,我看到正在讨论如何使这个库成为一个真正的标准:https://discuss.python.org/t/request-for-comment-making-pep-for-nosql-databases/14772

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73421051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档