Django+MongoDB的开发环境准备(编写中)

环境

    • Mac OS X Lion

 

    • virtualenv

 

    • virtualenvwrapper

 

    • GitHub

 

    • python 2.7

 

    Django 1.3

安装

创建虚拟环境

mkvirtualenv -p /usr/bin/python2.7 [プロジェクト名]

安装Django+MongoDB

pip install git+https://github.com/django-nonrel/django-nonrel.git@master
pip install git+https://github.com/django-nonrel/djangotoolbox.git@master 
pip install git+https://github.com/django-nonrel/mongodb-engine.git@master

安装py.test

pip instal py.test
pip install django_pytest

创建项目

cd [devディレクトリ]
workon [プロジェクト名]
django-admin.py startproject [プロジェクト名]

目录结构

cd [プロジェクトルート]
# アプリケーション配置用
mkdir apps
touch apps/__init__.py
# テスト用データなど
mkdir fixtures
# 国際化対応po/moファイル置き場
mkdir -p local/ja/LC_MESSAGES
mkdir -p local/en/LC_MESSAGES

# Put project-specific requirements here.
# See http://pip-installer.org/requirement-format.html for more information.
mkdir requirements

# This directory is used to store static assets for 
# your project. User media files (FileFields/ImageFields) are not stored here.
mkdir static
mkdir static/img
mkdir static/js
mkdir static/css

# テンプレート置き場
mkdir templates

# ドキュメント置き場
mkdir docs

应用程序的开发

cd [プロジェクトルート]/apps
# モデル配置用
django-admin.py startapp models

注册GitHub

cd [プロジェクトルート]
git config --global user.name  "ユーザ名"
git config --global user.email  "メールアドレス"
git init
git add *.py
git add app
git commit -m 'first commit'
git remote add origin git@github.com:USER_ID/REPO_NAME.git
git push -u origin master

准备MongoDB

服务器设置

创建目录和设置

mkdir -p environment/dev/var/mongodb
mkdir -p environment/dev/etc

# 設定ファイル作成
cat <<EOF >> environment/dev/etc/mongod.conf
heredoc> # Store data
heredoc> dbpath = [プロジェクトルート]/environment/dev/var/mongodb
heredoc> 
heredoc> # Only accept local connections
heredoc> bind_ip = 127.0.0.1
heredoc> EOF

# 開発用DBがgitに入らないようにする
cat << EOF >> environment/dev/var/mongodb/README
heredoc> 開発用MongoDBデータ置き場  
heredoc> EOF

cat << EOF >> environment/dev/var/mongodb/.gitignore
heredoc> /*
heredoc> /.*
heredoc> !README
heredoc> !.gitignore
heredoc> EOF

服务器启动

mongod run --config environment/dev/etc/mongod.conf

服务器的初始设置

mongo
> use [DB名]
> db.addUser('[DBユーザ名]', '[DBパスワード]')

更改settings.py中的数据库设置

DATABASES = {
    'default': {
        'ENGINE': 'django_mongodb_engine', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '[DB名]',                      # Or path to database file if using sqlite3.
        'USER': '[DBユーザ名]',                      # Not used with sqlite3.
        'PASSWORD': '[DBパスワード]',                  # Not used with sqlite3.
        'HOST': 'localhost',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': 27017,                      # Set to empty string for default. Not used with sqlite3.
    }
}

如果设置了用户和密码,那么在运行python manage.py test时将会发生数据库登录错误。
因此,在开发环境中最好将用户设置为USER=”,密码设置为PASSWORD=”。

同步数据库

python manage.py syncdb

如果出现SITE_ID的错误

由于MongoDB要求ID必须为ObjectID,而Django的SITE_ID默认为1,因此会出现以下错误。

bson.errors.InvalidId: AutoField (default primary key)的值必须是表示MongoDB的ObjectId的字符串(而不是u’1’)。请确保您的SITE_ID包含一个有效的ObjectId字符串。

在这种情况下,要求用 python manage.py tellsiteid 命令获取要设置为 SITE_ID 的 ID,但是在这个时候 django_site 表中根本没有记录,所以无法获取。

因此,您可以按照以下方式手动创建网站。

python manage.py shell

>>> from django.contrib.sites.models import Site
>>> s = Site()
>>> s.save()
>>> quit()

python manage.py tellsiteid

把获取到的SITE_ID设置到settings.py中。

SITE_ID = u'XXXXXXXXXXXXXXXXX'

我曾经以为,在测试时无法避免出现这个错误。

因为在django/contrib/sites/management.py文件中,
在创建Site时强制性地将pk=1赋值给了Site。

def create_default_site(app, created_models, verbosity, db, **kwargs):
    # Only create the default sites in databases where Django created the table
    if Site in created_models and router.allow_syncdb(db, Site) :
        if verbosity >= 2:
            print "Creating example.com Site object"
        # The default settings set SITE_ID = 1, and some tests in Django's test
        # suite rely on this value. However, if database sequences are reused
        # (e.g. in the test suite after flush/syncdb), it isn't guaranteed that
        # the next id will be 1, so we coerce it. See #15573 and #16353. This
        # can also crop up outside of tests - see #15346.
        s = Site(pk=1, domain="example.com", name="example.com")
        s.save(using=db)
    Site.objects.clear_cache()

signals.post_syncdb.connect(create_default_site, sender=site_app)

因为很麻烦,我不再使用INSTALL_APPS来使用django.contrib.auth和django.contrib.sites。

INSTALLED_APPS = (
    #'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    #'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)
广告
将在 10 秒后关闭
bannerAds