簡體   English   中英

Django是否可以為每個客戶端使用相同的鏈接和數據庫?

[英]Is it possible for Django to use the same link and a database for each client?

Django是否可以為每個客戶端使用相同的鏈接和數據庫?

您好,我是Django的新手,我有一個問題。 我將php系統帶到Django,其中所有客戶端都使用相同的鏈接來訪問系統,但是每個客戶端的數據庫都包含用戶,訪問組等。在自定義登錄屏幕中,他們通知其客戶端ID,用戶和密碼進行身份驗證,其中客戶端ID始終是數據庫的名稱。

我做了以下代碼來更改可能是錯誤的數據庫連接:

def change_db (self):
    connections ['default']. settings_dict ['NAME'] = self.db
    return True

該代碼甚至交換了我想要訪問的數據庫,但是使用運行服務器在本地計算機上進行測試,如果另一個客戶端(例如在另一個瀏覽器中)同時訪問,它將替換另一個客戶端。

有沒有人或者有解決的想法? 我搜索了路由器,不知道是否可以解決我的問題,或者是否存在切換連接和刪除其他客戶端的相同問題。

感激。

我想我解決了我的問題,發現了一個對我非常有用的鏈接:

在Django中根據請求動態設置數據庫

它使用中間件來獲得響應人員所提到的連接和路由器,在使用子域的情況下,我對此鏈接進行了一些更改,以獲得可以解決我的情況的前綴:

具有動態前綴的Django URL

遵循代碼:

from django.utils.deprecation import MiddlewareMixin
from django.contrib.sessions.middleware import SessionMiddleware
import re
import threading 

request_cfg = threading.local()

#Middleware
class RouterMiddleware(MiddlewareMixin):

    def process_request(self, request):
        words = request.get_full_path()
        db_name = words.split('/')[1]
        request_cfg.cfg = db_name
        return None

    def process_view(self, request, view_func, view_args, view_kwargs):
        cliente = view_kwargs.get('cliente')
        if cliente:
            request.cliente = cliente
            view_kwargs.pop('cliente')
            return view_func(request, *view_args, **view_kwargs)

    def process_response(self, request, response):
        if hasattr(request_cfg, 'cfg'):
            del request_cfg.cfg
        return response

#Router
class DatabaseRouter (object):
    def _default_db(self):
        if hasattr(request_cfg, 'cfg'):
            return request_cfg.cfg
        else:
            return 'default'

    def db_for_read(self, model, **hints):
        return self._default_db()

    def db_for_write(self, model, **hints):
        return self._default_db()

謝謝任何試圖幫助我的人:)

根據文檔,你不應該在運行時編輯settings.py,但你嘗試過這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM