我目前正在开发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')
无论如何,我可以为数据库设置一个模型,以便我可以将电子邮件设置为唯一,使字段不是必需/必需的,并允许我保存电子邮件?
答案 0 :(得分:1)
确保集合中的值唯一的最佳方法是使用唯一索引。
在MongoDB shell中它将是:
db.users.ensureIndex({email: 1, unique: true})
使用PyMongo就像:
users.ensure_index([('email', 1)], unique=True)
这些示例中的1
按升序对索引中的值进行排序。这应该足以供您使用。 PyMongo提供pymongo.ASCENDING
和pymongo.DESCENDING
作为便利。
有更多详情可供in the docs。