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',
)