2015-02-07 2 views
0

MongoDB를 기본 데이터베이스로 사용하는 Web2py 응용 프로그램을 구축하고 있습니다. 인증을 단순화하기 위해 회원 관리를 위해 SQLite (결국 MySQL)를 사용합니다.Web2py - 등록시 두 번째 테이블에 레코드 삽입

사용자가 등록하면 레코드가 SQL 데이터베이스에 만들어집니다. 등록시 MongoDB에 같은 레코드를 삽입하고 싶습니다. Mongo에 레코드를 삽입하는 쿼리를 쉽게 작성할 수 있지만,이 프로세스를 관리하는 컨트롤러를 찾을 수 없습니다 (그래서 vars에 액세스하여 Mongo에 삽입 할 수 있습니다).

제공 할 수있는 지침이 있으면 도움이 될 것입니다. auth 레코드가 변경 될 때 (Mongo 레코드를 업데이트 할 수 있도록) 식별 할 수있는 방법이 있으면 좋지만 보조 요구 사항입니다.

미리 감사드립니다.

+0

web2py에 익숙하지 않은 분은 용서해주십시오.하지만 web2py가 사용자 관리를 위해 SQL 데이터베이스를 사용하기 때문에 MongoDB에 데이터를 저장하지만 MySQL에 사용자를 저장하는 것이 이상하게 보입니다. 나는 그것이 web2py의 기본 설정이라고 생각한다. 나는 처음에는 MongoDB에 web2py를 저장하고 MySQL과 MongoDB 모두에 사용자를 저장하지 말아야한다고 생각합니다. – bpgergo

+0

Web2py의 인증 시스템은 MongoDB에서 작동하지 않으며 사용자 지정 해결 방법을 구축하지 못했습니다. 따라서 단순화하기 위해 회원 관리를 SQL로 유지하려고합니다. – datasci

답변

2

당신은 비계 응용 프로그램을 시작하면, default.py 컨트롤러, 당신은 아마 같은 기능이 있습니다

def user(): 
    return dict(form=auth()) 

auth 객체를 호출합니다 (특정 조치가에 따라 결정된다 모든 인증 작업에 대한 처리를 처리/default/user 다음에 첫 번째 URL 인수 - 그래서/default/user/register는 등록 작업을 트리거합니다. 여기에 코드 삽입 문제는 Auth가 일반적으로 등록 후 리디렉션되도록 구성되므로 코드가 실행되지 않습니다.

하나의 솔루션은 인증 콜백 기능을 설정하는 것입니다. auth.settings.register_onacceptauth.settings.profile_onaccept은 성공적인 등록 또는 프로필 업데이트 후에 호출되는 콜백 목록입니다. 관련 Auth form 개체가 이러한 콜백에 전달되고 삽입/업데이트 된 값은 form.vars (form.vars.id은 사용자 ID 임)에 있습니다. 등록 예는 this section of the docs을 참조하십시오.

또 다른 옵션은 _after_insert and _after_update callbacksdb.auth_user 테이블에 설정하는 것입니다. MongoDB를 DAL 객체가 mongo이라고하며 db.auth_user.id이 필드에 저장됩니다 가정하면 user_id라고 :

def copy_user(fields, id): 
    fields.update(user_id=id) 
    mongo.auth_user.insert(**fields) 

def update_user(dal_set, fields): 
    id = dal_set.select(db.auth_user.id)[0].id 
    mongo(mongo.auth_user.user_id == id).update(**fields) 

db.auth_user._after_insert.append(copy_user) 
db.auth_user._after_update.append(update_user) 

이 방법의 장점은 통해 레코드가 예를 들어 인증 시스템 (외부에서 업데이트 된 경우에도 작동한다는 것입니다 appadmin 기능).

+0

내가 제안하는 두 번째 옵션을 사용한다고 가정 해 보겠습니다. db.py에서는 "auth.settings.register_onaccept = URL ('copy_user')"를 설정합니다. 그런 다음 default.py에서 "def copy_user() : mongo.collection.auth_user.insert ({ 'id': form.vars.id})"를 설정합니다. 이것은 dym이 아닌 pymongo를 사용합니다. 이 작업을 수행 할 때 string 객체가 호출 할 수 없다는 오류가 발생합니다. 콜백 솔루션을 잘못 적용하고 있습니까? – datasci

+0

좋아요, auth.settings.register_onaccept를 default.py로 옮기고 URL ('copy_user')을 copy_user로 변경하기 만하면됩니다. 고맙습니다! – datasci

관련 문제