2017-05-27 7 views
0

APIを使用してsqlalchemyコアとフラスコでos.forkを使用するにはどうすればよいですか?私は、ユーザーを作成し、詳細をユーザーのメール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 

私はこのコードを試してみましたが、エラーが発生します。コードの 他の部分も追加しました。ユーザーが既にグループに所属している場合、un users_groupsに追加されずに続行されます。新しいユーザーが追加されると、ソースフォルダーもファイルシステムに作成されます。 提案したように、変数に値を格納した後にフォークしても、同じエラーが発生します。これにはもっと良い解決策がありますか?

(psycopg2.DatabaseError) SSL error: decryption failed or bad record mac

ここでの使用方法がわからない接続プールに関するエラー。ご案内ください。 。フラスコV 0.11、フォーク後に削除クエリ部分によって、@inverioによって示唆されているように私の答えを更新するのpython 2.7、SQLAlchemyのコア1.0.8

+0

'fork()'を使うと、子プロセスが親プロセスの接続を継承し、それらを使用しようとしていることを意味します*。 'rs.inserted_primary_key [0]'は最も明らかな原因のようです。フォークする前に変数にコピーしてみてください。 – univerio

+0

@univerio上記のように試してみましたが、まだエラーが出ます。提案する – user956424

+0

'send_new_user_mail'は何をしますか? – univerio

答えて

0

:あなたはこのようなエラーを取得している場合、一般的には

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 
関連する問題