栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Django多个动态数据库

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django多个动态数据库

话虽如此,我也有同样的问题,我想为每个用户创建一个唯一的数据库。这样做的原因是,我为用户提供了一种功能,使其可以保存/访问未存储在服务器上的数据库,这需要具有多个数据库,因此每个用户一个。

建议不要使用此答案来达到期望的目标。我很想听听django-guru的意见,介绍如何最好地解决这个问题。但是,这是我一直在使用的一种解决方案,到目前为止效果很好。我正在使用sqlite,但是可以轻松地对任何数据库进行修改。

总之,这是过程:

  1. 将新数据库添加到设置中(在运行时)
  2. 创建一个文件来存储这些设置,以便在服务器重新启动时(在运行时)重新加载
  3. 运行加载已保存的设置文件的脚本(无论何时重新启动服务器)
    现在,如何实现这一目标:

1)首先,在创建新用户时,我在设置中创建了一个新数据库。这段代码在我看来是创建新用户的地方。

from YOUR_PROJECT_NAME import settingsdatabase_id = user.username #just something uniquenewDatabase = {}newDatabase["id"] = database_idnewDatabase['ENGINE'] = 'django.db.backends.sqlite3'newDatabase['NAME'] = '/path/to/db_%s.sql' % database_idnewDatabase['USER'] = ''newDatabase['PASSWORD'] = ''newDatabase['HOST'] = ''newDatabase['PORT'] = ''settings.DATAbaseS[database_id] = newDatabasesave_db_settings_to_file(newDatabase) #this is for step 2)

该脚本将“运行时”数据库设置加载到django项目设置中。但是,如果重新启动服务器,则该数据库将不再处于设置中。

2)为便于在服务器重新启动时自动重新加载这些设置,我为每个数据库创建了一个文件,该文件将在服务器启动时立即加载。创建此文件由以下功能执行save_db_settings_to_file:

def save_db_settings_to_file(db_settings):    path_to_store_settings = "/path/to/your/project/YOUR_PROJECT_NAME/database_settings/"    newDbString = """DATAbaseS['%(id)s'] = {    'ENGINE': '%(ENGINE)s', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.    'NAME': '%(NAME)s',# Or path to database file if using sqlite3.    'USER': '',# Not used with sqlite3.    'PASSWORD': '',       # Not used with sqlite3.    'HOST': '',# Set to empty string for localhost. Not used with sqlite3.    'PORT': '',# Set to empty string for default. Not used with sqlite3.}    """ % db_settings    file_to_store_settings = os.path.join(path_to_store_settings, db_settings['id'] + ".py")    write_file(file_to_store_settings, newDbString) #psuedopre for compactness

3)要在启动服务器时实际加载这些设置,我在的最底部添加了一行,该行将/path/to/your/project/YOUR_PROJECT_NAME/settings.py每个文件加载到settings文件夹中并运行它,从而将数据库详细信息加载到设置中。

import settings_manager

然后,import settings_manager将在加载文件/path/to/your/project/YOUR_PROJECT_NAME/settings_manager.py,其中包含以下代码:

from settings import DATAbaseSimport ospath_to_store_settings = "/path/to/your/project/YOUR_PROJECT_NAME/database_settings/"for fname in os.listdir(path_to_settings):    full_path = os.path.join(path_to_settings, fname)    f = open(full_path)    content = f.read()    f.close()    exec(content) #you'd better be sure that the file doesn't contain anything malicious

请注意,你可以将此代码直接放在settings.py的底部而不是import语句的底部,但是使用import语句可以使settings.py的抽象级别保持一致。

这是一种加载每个数据库设置的便捷方法,因为要从设置中删除数据库,你要做的就是删除设置文件,并且下次服务器重新启动时,它不会将这些详细信息加载到设置中,并且数据库将无法访问。

就像我说的那样,这种方法行之有效,到目前为止,我已经成功使用了它,但这并不是理想的解决方案。如果有人可以发布更好的解决方案,我将不胜感激。

有什么不好的地方:

  • 它明确地拒绝了Django团队的建议,即不要在运行时修改设置。我不知道为什么要给出这个建议。
  • 它使用一条exec语句将数据加载到设置中。这应该可以,但是如果其中一个文件中出现了损坏的代码或恶意代码,你将是可悲的熊猫。
    请注意,我仍将默认数据库用于身份验证和会话数据,但是我自己的应用程序中的所有数据都存储在用户特定的数据库中。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/415023.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号