将Flask与PostgreSQL和SQLite等SQL数据库连接是很容易的。但该框架也能与CouchDB等NoSQL数据库完美同步。作为一个额外的好处,当你使用CouchDB和Flask时,你可以轻松查询你的数据。
准备好通过在你的Flask应用中使用CouchDB这样的NoSQL来做出改变了吗?下面是如何在你的本地机器上设置CouchDB并将其与Flask连接的方法。
什么是CouchDB?
CouchDB是一个NoSQL数据库,目前由Apache软件基金会拥有。该软件用Erlang编写,于2005年首次发布。
与你最可能习惯的常规表连接的数据库不同,CouchDB是一个非关系型数据库管理系统,以原始JSON的形式存储数据。
CouchDB是非阻塞的,所以它在数据输入期间不会锁定数据库。CouchDB的一个强项是,它使用多版本并发控制策略来读写数据。所以它允许多个用户同时输入,而不会受到数据库中现有数据结构的干扰。
因此,CouchDB在查询时速度很快,在使用异步方法时也很容易操作。也就是说,这并没有使它比它的SQL同行更好。每种技术都有其优点和缺点。
CouchDB的设置
要开始使用CouchDB,请从CouchDB的官方网站下载并安装一个兼容版本。
如果该最新版本不适合你,请前往CouchDB档案,下载1.6.1版本,这是CouchDB的早期版本。
一旦你安装了CouchDB,像其他桌面应用程序一样在你的电脑上运行它。
打开你的浏览器。然后将以下内容粘贴到地址栏中,启动CouchDB的服务器。
http://localhost:5984/_utils/index.html
设置Python和Flask
然而,本教程假设你已经在你的电脑上安装了Python。否则,请到python.org去,在你的电脑上安装最新版本的Python。
一旦你设置了CouchDB,就创建一个项目根文件夹。然后打开你的命令行到那个目录,创建一个Python虚拟环境。
使用pip在虚拟空间中安装最新版本的Flask。
pip install flask
用CouchDB连接Flask
要开始在你的Flask应用中使用CouchDB,请安装Flask-CouchDB,这是用于将数据库与Flask连接的运行时包。
要做到这一点。
pip install Flask-CouchDB
一旦你成功安装了Flask-CouchDB,在根目录下创建一个app.py 文件。同样地,创建一个database.py文件--这将处理你的数据库创建。
打开database.py 并导入以下包。
from couchdb import Server
接下来,使用下面的代码块在同一文件中创建你的数据库。
from couchdb import Serverserver = Server()db = server.create('muocouch')
通过CLI执行database.py。然后像之前那样通过浏览器打开或刷新CouchDB的本地服务器。现在你应该看到数据库**(本例中为muocouch**)在CouchDB中列出。
Related:How to Run a Python Script
**注意:**确保你对数据库使用小写的命名规则,因为CouchDB可能不接受大写或混合大小写。
使用Flask存储你的第一个CouchDB数据
归根结底,任何数据库的目的都是存储数据。一旦你有了CouchDB的数据库,你就可以马上从你的Flask应用中开始向其中存储数据。
首先,打开app.py并导入以下包。
from flask import Flaskfrom couchdb import Serverfrom flaskext.couchdb import Document
接下来,创建一个Flask应用和CouchDB服务器实例。
app = Flask(__name__, static_url_path='/static')app.debug=Trueserver = Server()
现在让我们把一些用户的输入存储到CouchDB中。
@app.route('/', methods=['GET', 'POST'])def register(): user = { "username":"media site", "email":"justmail@gmail.com", "password":"encrypteddata" } db = server['muocouch'] #select the database doc_id, doc_rev = db.save(user) #store your data in th database return "<h2>Your data should now be in the database</h2>"
如果你愿意,你可以在运行Flask服务器之前将其设置为开发模式。
要做到这一点,通过你的CLI运行以下命令。
set FLASK_ENV=development
注意,设置服务器模式是可选的。它只是让你的代码调试变得更容易。
但不管服务器模式设置如何,这里是如何通过CMD启动Flask服务器的。
flask run
然而,Flask将你的端口默认为localhost:5000。现在,一旦你通过浏览器加载这个地址,你应该看到H2标签中的信息。
使用CouchDB查询验证数据和检查重复数据
为了进一步标准化,你可以使用查询来验证输入并防止数据库中出现重复。查询CouchDB与你使用SQL数据库的方式有点不同。
CouchDB使用它所谓的 "JavaScript视图 "来查询数据库中的数据。幸运的是,这相对简单。
在你进一步了解之前,这里是一个基本的CouchDB查询视图的样子。
map_func = '''function(doc) { emit(doc.doc_rev, doc); }''' myQuery = [docType].query(db, map_func, reduce_fun=None)
现在让我们实际使用上面的代码。
#Create a document object model called "Users:"class User(Document): doc_type = 'User'@app.route('/', methods=['GET', 'POST'])def register(): user = { "username":"media site", "email":"justmail@gmail.com", "password":"encrypteddata" } db = server['muocouch'] #select the database # Use the view function to fetch your data from CouchDB map_func = '''function(doc) { emit(doc.doc_rev, doc); }''' # Get all the data by running a query set myQuery = User.query(db, map_func, reduce_fun=None, reverse=True) q = [i['username'] for i in myQuery] # Loop out all the usernames from the database q2 = [i['email'] for i in myQuery] # Loop out all the email addresses from the database q3 = q+q2 # Merge both queries into a single list print(q3) return "<h2>Your data is now in the database</h2>"
上面的代码使用User类来查询由视图函数获取的数据。密切注意查询集**(myQuery**)内的参数。
像上面那样打印q3,现在应该在命令行中输出数据库中所有的用户名和电子邮件地址。
因此,这里是你如何使用这个查询来验证用户的输入。
if not (user['username'] in q3 or user['email'] in q3): #store your data into the database if itdoesn't exist doc_id, doc_rev = db.save(user) return "<h2>Registered successfully</h2>"else: return "<h2>Username or email exists</h2>"
每当你试图输入一个已经在数据库中的用户名或电子邮件时,刷新你的浏览器就会返回else语句。而如果你输入的是一个新的,它就会通过执行if条件成功存储你的数据。
相关内容:如何使用Python的if语句
这就是了!你刚刚使用Flask-CouchDB创建了你的第一个NoSQL数据库。
虽然在CouchDB中创建和查询数据库是围绕我们在这里强调的例子进行的,但你可以进一步探究Flask的功能。例如,你可以使用wtforms旋转输入字段,并使用Flask的消息flash标记重复的内容**。**
你甚至可以把你的查询传递给JavaScript的jQuery,以验证输入和异步检查重复。
CouchDB比SQL数据库好吗?
使用CouchDB或任何其他NoSQL数据库与Flask或任何其他编程技术取决于你的偏好。但在处理无结构数据和原始媒体时,它就会很方便。
也就是说,在你决定之前,你可能想看看NoSQL数据库和SQL数据库之间的区别,以帮助你决定哪一个适合你的项目。