Python 如何使用API将os.fork与sqlalchemy core和flask结合使用?

Python 如何使用API将os.fork与sqlalchemy core和flask结合使用?,python,flask,sqlalchemy,Python,Flask,Sqlalchemy,我已创建一个用户,并希望向该用户的邮件id发送电子邮件,详细信息如下: def send_new_user_mail(new_user_id, plain_passwd): ''' Send mail to new user added ''' s1 = select([users]).where(users.c.id == new_user_id) rs1 = conn.execute(s1).fetchone() if rs1:

我已创建一个用户,并希望向该用户的邮件id发送电子邮件,详细信息如下:

def send_new_user_mail(new_user_id, plain_passwd):
    '''
    Send mail to new user added
    '''
    s1 = select([users]).where(users.c.id == new_user_id)
    rs1 = conn.execute(s1).fetchone()
    if rs1:
        msg = Message("You are registered to use DMS",
                      sender=app.config['DEFAULT_MAIL_SENDER'],
                      recipients=[rs1[users.c.email]])
        print g.referer, 'g.referer'
        user_details = ('username: ' +  rs1[users.c.email] + '<br>' +
                        'password:' + plain_passwd)
        # TODO: send change password link
        chg_passwd = ('<br><br>You can change password by visiting: ' +
                      '<a href=url_for("change_password")>' +
                      url_for("change_my_password", user_id=rs1[users.c.id]) +
                      '</a>')
        chg_passwd = ''
        msg.html = ('url: ' + '<a href=' + str(g.referer) + '>' +
                    g.referer + '</a></br><br>' + user_details +
                    chg_passwd)
        print msg.html, 'msg.html'
        try:
            with app.app_context():
                mail.send(msg)
                return True
        except Exception, e:
            print e
            return False
    conn1.close()
    return

@app.route('/sf/api/v1.0/users', methods=['POST'])
def add_user():
    '''
    Add a user 
    '''
    if 'id' in session:
        data = request.get_json(force=True)
        trans = conn.begin()
        try:
            if 'first_name' in data:
                data['first_name'] = data['first_name'].title()
            if 'last_name' in data:
                data['last_name'] = data['last_name'].title()
            ins = users.insert().values(data)
            rs = conn.execute(ins)
            mnew_user = rs.inserted_primary_key[0]
            mfolder = create_ftp_user_source_folder(mnew_user)
            trans.commit()
            for g in mgroups:
                ins2 = users_groups.insert().values(
                    user=mnew_user,
                    group=g)
                rs2 = conn1.execute(ins2)
        except Exception, e:
            print e
            trans.rollback()
            return jsonify({'message': "Invalid / duplicate details"}), 400
        # user FTP source folder exists
        if mfolder:
            # new_child_proc = 0
            new_child_proc = os.fork()
            print new_child_proc, 'new_child_proc'
            if new_child_proc == 0:
                x = send_new_user_mail(mnew_user, plain_passwd)
                os._exit(0)
            else:
               print 'child:', new_child_proc
            return jsonify({'id': mnew_user}), 201
        else:
            return jsonify(
                {'message': "Cannot create FTP source/already exists"}), 403

    return jsonify({'message': "UNAUTHORIZED"}), 401
def发送新用户邮件(新用户id,普通密码):
'''
向添加的新用户发送邮件
'''
s1=选择([users])。其中(users.c.id==新用户id)
rs1=conn.execute(s1).fetchone()
如果rs1:
msg=消息(“您已注册使用DMS”,
sender=app.config['DEFAULT\u MAIL\u sender'],
收件人=[rs1[users.c.email]]
打印g.referer,“g.referer”
用户详细信息=('username:'+rs1[users.c.email]+'
'+ “密码:”+普通密码) #TODO:发送更改密码链接 chg_passwd=('

您可以通过访问来更改密码:'+ '') chg_passwd=“” msg.html=('url:'+'

'+用户详细信息+ chg_passwd) 打印msg.html,“msg.html” 尝试: 使用app.app_context(): 邮件发送(msg) 返回真值 除例外情况外,e: 打印e 返回错误 conn1.close() 返回 @app.route('/sf/api/v1.0/users',方法=['POST']) def add_user(): ''' 添加用户 ''' 如果会话中有“id”: data=request.get_json(force=True) trans=连接开始() 尝试: 如果数据中有“名字”: 数据['first_name']=数据['first_name'].title() 如果数据中有“姓氏”: 数据['last_name']=数据['last_name'].title() ins=用户.insert().值(数据) rs=conn.execute(ins) mnew_user=rs.inserted_主键[0] mfolder=创建\u ftp\u用户\u源\u文件夹(mnew\u用户) trans.commit() 对于管理组中的g: ins2=用户组.insert().值( user=mnew_user, 组=g) rs2=conn1.execute(ins2) 除例外情况外,e: 打印e 事务回滚() 返回jsonify({'message':“无效/重复的详细信息”}),400 #存在用户FTP源文件夹 如果是mfolder: #新建子进程=0 new_child_proc=os.fork() 打印新子进程,“新子进程” 如果new_child_proc==0: x=发送新用户邮件(mnew用户,普通密码) 操作系统退出(0) 其他: 打印“child:”,新的子进程 返回jsonify({'id':mnew_user}),201 其他: 返回jsonify( {'message':“无法创建FTP源/已存在”}),403 返回jsonify({'message':“UNAUTHORIZED”}),401
我尝试了此代码,但出现错误: 还添加了代码的其他部分。如果用户已属于某个组,则不会将其添加到un users\U groups,而是继续。添加新用户时,还将在文件系统中创建一个源文件夹。 正如所建议的,我在将值存储在变量中后进行了分叉并进行了尝试,但仍然得到相同的错误。有没有更好的解决办法

(psycopg2.DatabaseError)SSL错误:解密失败或记录错误 苹果


连接池出现了一些错误,我不知道如何在这里使用它。请导游。烧瓶。0.11、python 2.7、sqlalchemy core 1.0.8

通过删除fork后面的查询部分,按照@inverio的建议更新我的答案:

def send_new_user_mail(memail_id, plain_passwd, mnew_user):    
    '''
    Send mail to new user added to dms with url
    '''
    msg = Message("You are registered to use DMS",
                  sender=app.config['DEFAULT_MAIL_SENDER'],
                  recipients=[memail_id])
    user_details = ('username: ' + memail_id + '<br>' +
                    'password:' + plain_passwd)
    chg_passwd = ''
    msg.html = ('url: ' + '<a href=' + str(g.referer) + '>' +
                g.referer + '</a></br><br>' + user_details +
                chg_passwd)
    try:
        with app.app_context():
            mail.send(msg)
            return True
    except Exception, e:
        print e
        return False
    conn1.close()
    return

@app.route('/sf/api/v1.0/users', methods=['POST'])
def add_user():
    '''
    Add a user and select his group(s)
    '''
    if 'id' in session:
        if session['email'].split("@")[0] == 'ytms.admin' and \
                session['flag'] is True:
            mgroups = []
            mnew_user = None
            mfolder = None
            memail = None
            data = request.get_json(force=True)
            if data['password']:
               # pass
               plain_passwd = data['password']
               mypass = pwd_context.encrypt(data['password'])
               data['password'] = mypass
            if "groups" not in data:
                return jsonify({'message': "Cannot add without group(s)"}), 400
            for g in data["groups"]:
                mgroups.append(g)
            del data["groups"]
            print data, 'data'
            trans = conn.begin()
            try:
                if 'first_name' in data:
                    data['first_name'] = data['first_name'].title()
                if 'last_name' in data:
                    data['last_name'] = data['last_name'].title()
                ins = users.insert().values(data)
                rs = conn.execute(ins)
                mnew_user = rs.inserted_primary_key[0]
                mfolder = create_ftp_user_source_folder(mnew_user)
                memail = data['email']
                trans.commit()
                for g in mgroups:
                    ins2 = users_groups.insert().values(
                        user=mnew_user,
                        group=g)
                    rs2 = conn1.execute(ins2)
            except Exception, e:
                print e
                trans.rollback()
                return jsonify({'message': "Invalid / duplicate details"}), 400
            # user FTP source folder exists
            if mfolder:
                new_child_proc = os.fork()
                if new_child_proc == 0:
                    x = send_new_user_mail(memail, plain_passwd, mnew_user)
                    os._exit(0)
                else:
                   print 'child:', new_child_proc
                return jsonify({'id': mnew_user}), 201
            else:
                return jsonify(
                    {'message': "Cannot create FTP source/already exists"}), 403

    return jsonify({'message': "UNAUTHORIZED"}), 401
def发送新用户邮件(memail\u id、plain\u passwd、mnew\u user):
'''
使用url向添加到dms的新用户发送邮件
'''
msg=消息(“您已注册使用DMS”,
sender=app.config['DEFAULT\u MAIL\u sender'],
收件人=[memail_id])
用户详细信息=('username:'+memail_id+'
'+ “密码:”+普通密码) chg_passwd=“” msg.html=('url:'+'

'+用户详细信息+ chg_passwd) 尝试: 使用app.app_context(): 邮件发送(msg) 返回真值 除例外情况外,e: 打印e 返回错误 conn1.close() 返回 @app.route('/sf/api/v1.0/users',方法=['POST']) def add_user(): ''' 添加用户并选择其组 ''' 如果会话中有“id”: 如果会话['email'].split(“@”)[0]='ytms.admin'和\ 会话['flag']为真: mgroups=[] mnew_用户=无 mfolder=无 memail=无 data=request.get_json(force=True) 如果数据['password']: #通过 普通密码=数据['password'] mypass=pwd_context.encrypt(数据['password']) 数据['password']=mypass 如果“组”不在数据中: 返回jsonify({'message':“不能在没有组的情况下添加)”),400 对于数据[“组”]中的g: 管理组追加(g) del数据[“组”] 打印数据,“数据” trans=连接开始() 尝试: 如果数据中有“名字”: 数据['first_name']=数据['first_name'].title() 如果数据中有“姓氏”: 数据['last_name']=数据['last_name'].title() ins=用户.insert().值(数据) rs=conn.execute(ins) mnew_user=rs.inserted_主键[0] mfolder=创建\u ftp\u用户\u源\u文件夹(mnew\u用户) memail=data['email'] trans.commit() 对于管理组中的g: ins2=用户组.insert().值( user=mnew_user, 组=g) rs2=conn1.execute(ins2) 除例外情况外,e: 打印e 事务回滚() 返回jsonify({'message':“无效/重复的详细信息”}),400 #存在用户FTP源文件夹 如果