Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何允许客户端使用Appengine上的Django创建动态数据库和连接作为多租户数据库设置?_Django_Google App Engine_Djangoappengine - Fatal编程技术网

如何允许客户端使用Appengine上的Django创建动态数据库和连接作为多租户数据库设置?

如何允许客户端使用Appengine上的Django创建动态数据库和连接作为多租户数据库设置?,django,google-app-engine,djangoappengine,Django,Google App Engine,Djangoappengine,我们目前的设置是Django托管在Google的appengine上,并在Google的CloudSQL上使用MySQL数据库 用户(客户机)通常是小型企业,我们为其提供了一个子域,用于多租户数据库结构(每个客户机一个数据库) 至于确定哪个请求应该访问哪个数据库,有一个现有的中间件剥离请求路径以获取子域,从而返回settings.py中定义的相关数据库别名 from django.conf import settings import threading currentCompanyConnec

我们目前的设置是Django托管在Google的appengine上,并在Google的CloudSQL上使用MySQL数据库

用户(客户机)通常是小型企业,我们为其提供了一个子域,用于多租户数据库结构(每个客户机一个数据库)

至于确定哪个请求应该访问哪个数据库,有一个现有的中间件剥离请求路径以获取子域,从而返回settings.py中定义的相关数据库别名

from django.conf import settings
import threading
currentCompanyConnection = threading.local()

class DatabaseMiddleware(object): 
    def process_request(self, request): 
        url = request.build_absolute_uri()
        if url.find("http://") < 0:
            company = url.split("https://")[1].split(".")[0]
        else:
            company = url.split("http://")[1].split(".")[0]
        global currentCompanyConnection
        if company in settings.DATABASES:
            currentCompanyConnection.company = company
        else:
            currentCompanyConnection.company = 'default'
        request.currentCompany = str(currentCompanyConnection.company)
        return None

class DBRouter(object): 

    def read_and_write(self, model, **hints): 
        return currentCompanyConnection.company

    db_for_read  = read_and_write 
    db_for_write = read_and_write
来自django.conf导入设置的

导入线程
currentCompanyConnection=threading.local()
类数据库中间件(对象):
def过程_请求(自我,请求):
url=request.build\u absolute\u uri()
如果url.find(“http://”)小于0:
company=url.split(“https:/”[1]。split(“.”[0]
其他:
company=url.split(“http:/”[1]。split(“.”[0]
全球电流公司连接
如果公司位于settings.DATABASES中:
currentCompanyConnection.company=公司
其他:
currentCompanyConnection.company='default'
request.currentCompany=str(currentCompanyConnection.company)
一无所获
DBRouter类(对象):
def读写(自身、型号、**提示):
return currentCompanyConnection.company
db_for_read=读取和写入
db_for_write=读取和写入
然而,为了让我们的web应用程序具有freemium自助服务的功能,必须动态生成一个新的数据库,并为每个注册用户动态导入Django的settings.py

最后一部分我似乎无法理解,因为每次更改settings.py时,我都必须再次将其部署到appengine。除此之外,我不知道如何从我们的web应用程序创建一个新的数据库,其中包含谷歌云SQL中预定义的表


谢谢你的帮助!我喜欢解决工作中的挑战,但这是我以前从来没有做过的事情。您可以修改blobstore或数据存储中的内容

我建议将设置作为结构化数据存储在数据存储中,然后让settings.py从数据存储中读取数据,并将它们作为python对象存储在settings.py中,这些对象可以从其他代码访问。这应该允许您将django配置为连接到多个数据库


我对CloudSQL不太熟悉,但我认为启动多个CloudSQL实例并将适当的流量路由到适当的实例仍然是一个挑战。

一旦部署,您就无法修改源文件。您可以修改blobstore或数据存储中的内容

我建议将设置作为结构化数据存储在数据存储中,然后让settings.py从数据存储中读取数据,并将它们作为python对象存储在settings.py中,这些对象可以从其他代码访问。这应该允许您将django配置为连接到多个数据库


我对CloudSQL不太熟悉,但我认为启动多个CloudSQL实例并将适当的流量路由到适当的实例仍然是一个挑战。

谢谢您的建议,我非常感谢!在settings.py中存储动态数据库数据可能适合配置django。感谢您的建议,我非常感谢!在settings.py中存储动态数据库数据可能适合配置django。