2017-02-19 6 views
2

私はログインシステムの基本的なアプリケーションを持っていますが、非常に基本的な作業はOKですが、今は別のデータベースで動作させようとしています。思想。私は読んでいたので、私はそれを試みたので、私は2番目のデータベースで動作するようにdbルータが必要であることがわかった。ここでDjango - 複数のデータベースで認証するときのグローバル名エラー

は、私が得たものです:

settings.py

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    }, 
    'db2':{ 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'login.db'), 
    } 
} 
MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'myapp.middleware.CustomerMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

DATABASE_ROUTERS = ['myapp.routers.MultiCustomerRouter'] 

routers.py

from middleware import my_local_global 

class MultiCustomerRouter(object): 
    def db_for_read(self, model, **hints): 
     return my_local_global.db2 

middleware.py

私は私のデータベース db2で期待通りに動作させるためにこれを処理するにはどうすればよい

NameError at /

global name 'get_db2' is not defined

:私はpython manage.py runserverを実行した後、210

from threading import local 

my_local_global = local() 

class CustomerMiddleware(object): 
    def process_request(self, request): 
     my_local_global.db2 = get_db2(request) # my database name is db2 

は、私はこのエラーを得た。このDjango Authenticate Backend Multiple Databases次でしたか?私が達成しようとしているものを基本的に

views.py

def login_view(request): 
    print(request.user.is_authenticated()) 
    title = 'login' 
    form = UserloginForm(request.POST or None) 
    if form.is_valid(): 
     username = form.cleaned_data.get("username") 
     password = form.cleaned_data.get("password") 
     user = authenticate(username=username,password=password) 
     login(request,user) 
     print(request.user.is_authenticated()) 
     return redirect('first_view') 
    return render(request, "form.html",{"form":form,"title":title}) 

db2ないデフォルトのものを使用して認証することです。

答えて

2

あなたがリンクしている質問は、あなたが望むのと同じことをするとは思わない。別のデータベースを使用して認証したいだけの場合は、スレッドローカルを必要とせず、リクエストオブジェクトに変数を設定する必要もありません。その質問は、異なるデータベースを使用する各顧客についてです(ログインした顧客などによって異なります)。 )。

あなたがどこにも定義していない関数get_db2を呼び出しているためにエラーが発生しています。そのコードのほとんどは、他の質問からそのコードのほとんどをコピー/ペーストしています。

あなたは(あなたがミドルウェアを必要としない)したい正確に何をやっているようだ例を持つデータベース・ルータ、上Django docsを読むことをお勧めします - これはaforelinkedページから直接取得されています

class AuthRouter(object): 
    """ 
    A router to control all database operations on models in the 
    auth application. 
    """ 
    def db_for_read(self, model, **hints): 
     """ 
     Attempts to read auth models go to auth_db. 
     """ 
     if model._meta.app_label == 'auth': 
      return 'auth_db' 
     return None 

    def db_for_write(self, model, **hints): 
     """ 
     Attempts to write auth models go to auth_db. 
     """ 
     if model._meta.app_label == 'auth': 
      return 'auth_db' 
     return None 

しかし、機能が異なるために異なるデータベースを使用することは複雑なので、上記以外のものも必要です。詳細は、ドキュメントを読んでください。

+0

ありがとうございます、期待通りに働きました。よく説明され、より良い不可能:)。申し訳ありません。 – User100696

関連する問題