Django项目让本地和服务器环境数据库配置自动切换

Web开发中通常在本地进行开发,然后将代码部署到服务器上,这里就涉及本地环境和服务器环境数据库的配置。
我使用的服务器环境是新浪云(SAE),代码部署是通过git上传到指定的GIT仓库。
要切换两个数据库配置选项,最笨的办法是部署代码时设置为服务器数据库环境,本地测试时再把配置改回本地数据库环境。
这样就面临一个开发效率问题:如何在使用一套代码的情况下,让本地和服务器自动选择正确的数据库配置呢?

记得之前在浏览Django官网时有看到multi database配置,估计跟这有关系,上去找一下,果然看到有数据库路由设置。

一个Django项目可以设置多个数据库,比如设置数据库读写分离需要设置主从数据库,而究竟选择哪个数据库需要有负责路由的类来决定。
在settings.py中,DATABASES 设置数据库的配置表,而 DATABASE_ROUTERS 则设置路由数据库的类。
指定的Router类可以实现 db_for_read,db_for_write等方法
参考官网说明:https://docs.djangoproject.com/en/1.8/topics/db/multi-db/#topics-db-multi-db-routing

如何区分当前环境是本地还是服务器呢?

有几种方法:


1.使用导入服务器特有模块来判断,比如sae环境,如果导入sae模块成功说明是在服务器环境了。

@settings.py

# 数据库配置表
DATABASES = {
	# 默认使用本地数据库
    'default': { 
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_gallery',
        'USER': 'xxx',
        'PASSWORD': 'xxx',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    },
    # SAE数据库配置
    'remote': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxx',
        'USER': 'xxx',
        'PASSWORD': 'xxx',
        'HOST': 'w.rdc.sae.sina.com.cn',
        'PORT': '3307',
    }
}

#设置路由类
DATABASE_ROUTERS = ['Gallery.db_router.LocalRemoteRouter']

@db_router.py

import logging

logger = logging.getLogger('items')

class LocalRemoteRouter(object):
    """
    A router to decide select local or remote sae db
    """
    init = True
    local = True

    def is_local_env(self):
        local_env = False
        try:
            import sae
        except(ImportError):
            local_env = True
            logger.info("import sae error")
        else:
            local_env = False
            logger.info("import sae ok")
        return local_env

    def db_for_read(self, model, **hints):
        if self.init == True:
            self.init = False
            self.local = self.is_local_env()

        if self.local == True:
            return 'default'
        else:
            return 'remote'

    def db_for_write(self, model, **hints):
        if self.init == True:
            self.init = False
            self.local = self.is_local()

        if self.local == True:
            return 'default'
        else:
            return 'remote'


2.使用os模块变量判断

@db_router.py

import os

class LocalRemoteRouter(object):
    def db_for_read(self, model, **hints):
        if 'SERVER_SOFTWARE' in os.environ:
            # SAE
            return 'remote'
        else:
            # Local
            return 'default'


    def db_for_write(self, model, **hints):
        if 'SERVER_SOFTWARE' in os.environ:
            # SAE
            return 'remote'
        else:
            # Local
            return 'default'


部署代码到服务器上,打开首页,可以看到熟悉的画面了!


这样不论以后在本地还是服务器测试,数据库配置的代码不需要再改变!


====================================  更新 ===============================================

通常本地与服务器环境切换配置的不止数据库,还有其他参数,于是想到创建个文件专门处理:

@config.py  

import os
import logging
logger = logging.getLogger('items')

#本地配置参数
class Local():
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'xxx',
            'USER': 'xxx',
            'PASSWORD': 'xxx',
            'HOST': '127.0.0.1',
            'PORT': '3306',
        },
    }

#服务器配置参数
class Remote():
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'xxx',
            'USER': 'xxx',
            'PASSWORD': 'xxx',
            'HOST': 'w.rdc.sae.sina.com.cn',
            'PORT': '3307',
        }
    }

class MyConfig():
    __conf = None
    __is_remote = 'SERVER_SOFTWARE' in os.environ

    def is_remote_env(self):
        return self.__is_remote

    def get_config(self):
        if self.__conf == None:
            if self.__is_remote:
                logger.info("set remote config")
                self.__conf = Remote()
            else:
                logger.info("set local config")
                self.__conf = Local()
        return self.__conf

@settings.py 

使用MyConfig得到正确的配置对象,访问正确的配置参数

from config import MyConfig
my_config = MyConfig()

MEDIA_URL = my_config.get_config().MEDIA_URL
MEDIA_ROOT = my_config.get_config().MEDIA_ROOT

DATABASES = my_config.get_config().DATABASES

#DATABASE_ROUTERS = ['Gallery.db_router.LocalRemoteRouter']

该方法没有使用数据库Router,因此把原来设置的 DATABASE_ROUTERS 注释掉。

通过这种方法,两种环境下分别设置各自的参数即可。


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 将django项目部署到本地服务器需要准备一台本地服务器,然后安装PythonDjango,接着创建一个数据库,并且将项目文件复制到服务器上,最后运行Django的manage.py文件以启动服务器。 ### 回答2: 将Django项目部署到本地服务器需要以下步骤: 1. 确保本地服务器已安装好必要的软件和工具,例如PythonDjango数据库管理系统(MySQL、PostgreSQL等)。 2. 在本地服务器上创建一个文件夹作为项目的根目录,并进入该目录。 3. 打开命令行,使用以下命令创建一个虚拟环境: ``` python -m venv venv ``` 4. 激活虚拟环境: ``` source venv/bin/activate (Linux/Mac) venv\Scripts\activate (Windows) ``` 5. 安装Django: ``` pip install django ``` 6. 创建一个新的Django项目: ``` django-admin startproject myproject ``` 7. 进入myproject文件夹,并使用以下命令创建数据库(假设使用SQLite数据库): ``` python manage.py migrate ``` 8. 运行开发服务器: ``` python manage.py runserver ``` 9. 在浏览器中访问`http://localhost:8000`,确认服务器是否成功运行。 10. 如果有静态文件(如CSS、JavaScript和图像文件),需要在项目中创建一个名为`static`的文件夹,并将文件放入该文件夹。 11. 更新Django项目配置文件`settings.py`,指定静态文件的路径: ``` STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] ``` 12. 如果需要使用数据库,需要在`settings.py`中配置数据库连接。 通过完成以上步骤,你就可以成功将Django项目部署到本地服务器,并在浏览器中进行访问和测试。 ### 回答3: 将Django项目部署到本地服务器需要以下步骤: 1. 确保本地服务器已经安装好PythonDjango。如果没有安装,需要先安装这些软件。 2. 在本地服务器上创建一个目录,用于存放Django项目的文件。 3. 打开命令行工具,切换到上一步创建的目录下。 4. 使用Django提供的命令行工具创建一个新的Django项目。可以使用以下命令:`django-admin startproject projectname`,将"projectname"替换为你想要的项目名称。 5. 进入项目的目录,使用以下命令创建一个Django应用:`python manage.py startapp appname`,将"appname"替换为你想要的应用名称。 6. 在settings.py文件中配置数据库连接和其他需要的设置。 7. 运行以下命令创建数据库表:`python manage.py makemigrations`,然后运行`python manage.py migrate`。 8. 创建一个超级用户以便能够登录到Django管理后台:`python manage.py createsuperuser`,根据提示输入用户名和密码。 9. 启动本地服务器:`python manage.py runserver`。这将在本地启动一个开发服务器,可以通过浏览器访问你的Django项目。 10. 打开浏览器,输入指定的本地服务器地址(例如:http://localhost:8000)来访问你的Django项目。 通过以上步骤,你就可以成功将Django项目部署到本地服务器,并通过浏览器进行访问和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值