发布于 2015-09-01 13:57:14 | 718 次阅读 | 评论: 0 | 来源: PHPERZ
MongoDB 是一个开源的数据库,它存储着灵活的类-JSON 的“文档”。与关系数据库中的数据行相反,它能够存储任何的数字,名称,或者复杂的层级结构。Python 开发者可以考虑把 MongoDB 作为一个持久化,可搜索的 Python 字典的“仓库”(实际上,这是如何用 PyMongo 来表示 MongoDB 中的“文档”)。
Flask-PyMongo 架起来 Flask 和 PyMongo 之间的桥梁,因此你能够使用 Flask 正常的机制去配置和连接 MongoDB。
首先,安装 Flask-PyMongo:
$ pip install Flask-PyMongo
Flask-PyMongo 的各种依赖(比如,最近的 Flask 以及 PyMongo )也会为你安装的。Flask-PyMongo 是兼容 Python 2.6, 2.7, 和 3.3 版本并且通过测试。
接着,在你的代码中添加一个 PyMongo:
from flask import Flask
from flask.ext.pymongo import PyMongo
app = Flask(__name__)
mongo = PyMongo(app)
PyMongo 连接运行在本机上且端口为 27017 的 MongoDB 服务器,并且假设默认的数据库名为 app.name (换而言之,你可以使用传入到 Flask 中的任何数据库名)。这个数据库能够作为 db 属性被导入。
你可以在视图中直接使用 db:
@app.route('/')
def home_page():
online_users = mongo.db.users.find({'online': True})
return render_template('index.html',
online_users=online_users)
Flask-PyMongo 提供一些通用任务的现成方法:
Find and return a single document, or raise a 404 Not Found exception if no document matches the query spec. See find_one() for details.
@app.route('/user/<username>')
def user_profile(username):
user = mongo.db.users.find_one_or_404({'_id': username})
return render_template('user.html',
user=user)
Return an instance of the response_class containing the named file, and implement conditional GET semantics (using make_conditional()).
@app.route('/uploads/<path:filename>')
def get_upload(filename):
return mongo.send_file(filename)
Parameters: |
|
---|
Save the file-like object to GridFS using the given filename. Returns None.
@app.route('/uploads/<path:filename>', methods=['POST'])
def save_upload(filename):
mongo.save_file(filename, request.files['file'])
return redirect(url_for('get_upload', filename=filename))
Parameters: |
|
---|
A simple converter for the RESTful URL routing system of Flask.
@app.route('/<ObjectId:task_id>')
def show_task(task_id):
task = mongo.db.tasks.find_one_or_404(task_id)
return render_template('task.html', task=task)
Valid object ID strings are converted into ObjectId objects; invalid strings result in a 404 error. The converter is automatically registered by the initialization of PyMongo with keyword ObjectId.
PyMongo 直接支持如下的配置项:
MONGO_URI | 一个 MongoDB 网址 用于其他配置项。 |
MONGO_HOST | 你的 MongoDB 服务器的主机名或者 IP 地址。 默认:”localhost”。 |
MONGO_PORT | 你的 MongoDB 服务器的端口。默认:27017。 |
MONGO_AUTO_START_REQUEST | 设置成 False 为了禁用 PyMongo 2.2 的 “auto start request” 行为 (请见 MongoClient)。 默认:True。 |
MONGO_MAX_POOL_SIZE | (可选): PyMongo 连接池中保持空闲连接的最大数量。 默认:PyMongo 默认值。 |
MONGO_SOCKET_TIMEOUT_MS | (可选): (整型) 在超时前套接字允许一个发送或者接收的耗时(毫秒)。 默认: PyMongo 默认值。 |
MONGO_CONNECT_TIMEOUT_MS | (可选): (整型) 在超时前允许一个连接的耗时(毫秒)。 默认: PyMongo 默认值。 |
MONGO_DBNAME | 可用于作为 db 属性的数据库名。默认: app.name。 |
MONGO_USERNAME | 用于认证的用户名。默认:None。 |
MONGO_PASSWORD | 用于认证的密码。默认: None。 |
MONGO_REPLICA_SET | 设置成连接的备份集的名称;这必须匹配到备份集的内部名,由 isMaster 命令)决定的。默认:None。 |
MONGO_READ_PREFERENCE | 决定如何读取路由到备份集的成员。必须是定义在 pymongo.read_preferences.ReadPreference 中的一个常量 或者一个字符串名称。 |
MONGO_DOCUMENT_CLASS | 告诉 pymongo 返回定制的对象而不是默认的字典,比如 bson.son.SON。 默认: dict。 |
当 PyMongo 或者 init_app() 仅仅只有一个参数调用的时候 (the Flask 实例),会假设配置值的前缀是 MONGO;能够用 config_prefix 来覆盖这个前缀。
这个技术能够用于连接多个数据库或者数据服务器:
app = Flask(__name__)
# connect to MongoDB with the defaults
mongo1 = PyMongo(app)
# connect to another MongoDB database on the same host
app.config['MONGO2_DBNAME'] = 'dbname_two'
mongo2 = PyMongo(app, config_prefix='MONGO2')
# connect to another MongoDB server altogether
app.config['MONGO3_HOST'] = 'another.host.example.com'
app.config['MONGO3_PORT'] = 27017
app.config['MONGO3_DBNAME'] = 'dbname_three'
mongo3 = PyMongo(app, config_prefix='MONGO3')
你应该需要注意一些自动配置的设置:
Ascending sort order.
Descending sort order.
Automatically connects to MongoDB using parameters defined in Flask configuration.
The automatically created Connection or ReplicaSetConnection object.
The automatically created Database object corresponding to the provided MONGO_DBNAME configuration parameter.
Initialize the app for use with this PyMongo. This is called automatically if app is passed to __init__().
The app is configured according to the configuration variables PREFIX_HOST, PREFIX_PORT, PREFIX_DBNAME, PREFIX_AUTO_START_REQUEST, PREFIX_REPLICA_SET, PREFIX_READ_PREFERENCE, PREFIX_USERNAME, PREFIX_PASSWORD, and PREFIX_URI where “PREFIX” defaults to “MONGO”. If PREFIX_URL is set, it is assumed to have all appropriate configurations, and the other keys are overwritten using their values as present in the URI.
Parameters: |
|
---|
Save the file-like object to GridFS using the given filename. Returns None.
@app.route('/uploads/<path:filename>', methods=['POST'])
def save_upload(filename):
mongo.save_file(filename, request.files['file'])
return redirect(url_for('get_upload', filename=filename))
Parameters: |
|
---|
Return an instance of the response_class containing the named file, and implement conditional GET semantics (using make_conditional()).
@app.route('/uploads/<path:filename>')
def get_upload(filename):
return mongo.send_file(filename)
Parameters: |
|
---|
Custom sub-class of pymongo.collection.Collection which adds Flask-specific helper methods.
Find and return a single document, or raise a 404 Not Found exception if no document matches the query spec. See find_one() for details.
@app.route('/user/<username>')
def user_profile(username):
user = mongo.db.users.find_one_or_404({'_id': username})
return render_template('user.html',
user=user)
这些类的存在只是为了使得表达式比如 mongo.db.foo.bar 等于一个 Collection 实例而不用直接使用一个 pymongo.collection.Collection 实例。它们完整的记录在如下:
Returns instances of flask_pymongo.wrappers.Database instead of pymongo.database.Database when accessed with dot notation.
Returns instances of flask_pymongo.wrappers.Database instead of pymongo.database.Database when accessed with dot notation.
Returns instances of flask_pymongo.wrappers.Collection instead of pymongo.collection.Collection when accessed with dot notation.
变更:
贡献: