【问题标题】:PyMongo adding emails?PyMongo 添加电子邮件?
【发布时间】:2014-01-22 23:14:44
【问题描述】:

我目前正在开发一个 Flask 和 Heroku 应用程序,我使用 MongoDB 来保存用户注册信息。我遇到的问题是,当我尝试保存电子邮件时,它给了我错误:

InvalidDocument: key 'email@domain.com' must not contain '.'

我也想知道如何确保每封电子邮件都是唯一的,并且以前不在数据库中,而不必查询数据库。

这是我目前的代码:

import os
import re
from pymongo import MongoClient
from flask import Flask, render_template, request, session, redirect
import jinja2

email_regex = re.compile(r"^[\S]+@[\S]+\.[\S]+$")
password_regex = re.compile(r'^[a-zA-Z]\w{3,14}$')

client = MongoClient("mongodb://<user>:<password>@linus.mongohq.com:11077/users")
db = client.get_default_database()
users = db.users


app = Flask(__name__)
@app.route('/signup', methods=['GET','POST'])
def signup():
    if request.method == 'POST':
        email = request.form.get('email')
        name = request.form.get('name')
        password = request.form.get('password')
        v_password = request.form.get('v_password')
        if email == '' or name == '' or password=='' or v_password =='':
            return render_template('signup.html', b_error="Cannot leave any field blank")
        elif not(email_regex.match(email)):
            return render_template('signup.html', e_error="Please enter valid email!")
        elif not(password_regex.match(password)):
            return render_template('signup.html', p_error="Please enter valid password")
        elif password != v_password:
            return render_template('signup.html', m_error="Passwords do not match")
        else:
            users.insert({name:name, email:email,password:password})
            return redirect('/')
    return render_template('signup.html')

我是否可以为数据库设置一个模型,以便我可以将电子邮件设置为唯一,使字段不需要/必需,并允许我保存电子邮件?

【问题讨论】:

  • 您应该为您的文档使用正确的密钥。 'name' 代替名称,'password' 代替 password。如果它们都有不同的密钥,那么在检索它们时将很难使用它们。在显示用户信息时如何区分用户名和密码?
  • 我不知道我需要将密钥保留为字符串,这解释了密钥错误。谢谢!

标签: python mongodb flask pymongo


【解决方案1】:

确保集合中的值唯一的最佳方法是使用唯一索引。

在 MongoDB shell 中是:

db.users.ensureIndex({email: 1, unique: true})

使用 PyMongo 类似于:

users.ensure_index([('email', 1)], unique=True)

这些示例中的1 按升序排列索引中的值。这应该足以供您使用。 PyMongo 提供pymongo.ASCENDINGpymongo.DESCENDING 作为便利。

更多详情请见in the docs

【讨论】:

  • 我在 users = db.users 之后直接添加了这一行: users.ensure_index({'email': 1}, unique=True) 但我收到此错误 File "/Library/Python/2.7/ site-packages/pymongo/helpers.py”, 第 42 行, in _index_list raise TypeError("if no direction is specified, " TypeError: if no direction is specified, key_or_list must be an instance of list
  • 想一想,Python中的语法有点不同。我会编辑帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 2018-01-04
相关资源
最近更新 更多