您的位置:首页 > 编程语言 > Go语言

单独使用django model模块

2016-05-07 10:26 489 查看

Django是啥?

先来看下官网的描述

Django makes it easier to build better Web apps more quickly and with less code.

从上面可以看出,它是一个python web框架,它的宗旨是让开发者以最小的代码最简单的方式快速开发web应用

需求场景

django 是一个为web框架, 且它的ORM model模块很好用.因为项目需要,我需要在命令终端(terminal)直接操作该web服务器的数据库,又不想通过web请求来做这件事.

怎么办?可能你还是没听明白,直接上代码

目录结构

~/test/django/mysite1$ pwd
/home/itleaks/test/django/
├── db.sqlite3
├── __init__.py
├── __init__.pyc
├── manage.py
├── manage.pyc
├── mysite
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
└── sample
├── admin.py
├── admin.pyc
├── apps.py
├── apps.pyc
├── __init__.py
├── __init__.pyc
├── migrations
│   ├── 0001_initial.py
│   ├── 0001_initial.pyc
│   ├── __init__.py
│   └── __init__.pyc
├── models.py
├── models.pyc
├── tests.py
└── views.py


sample/models.py

from __future__ import unicode_literals

from django.db import models

# Create your models here.
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)


sample/tests.py

from sample.models import Question
# Create your tests here.
if __name__ == "__main__":
Question.objects.all()
print 'ok'


上面的Question是一个model, 当该项目以网页运行时,在网页中输入http://127.0.0.1:8000/sample/test是能够正常运行的.但是当我希望在terminal直接执行python sample/tests.py时就会出错.为啥?其实这个问题就是一个运行时环境搭建问题

model运行时环境搭建

用过django的人都知道,当我们要启动它时,肯定都会先执行

python manage.py runserver


上面的manage.py就是用来准备django 框架的运行时环境的,所以我们要做的就是

做一个精简版的manage.py, 然后再执行我们的test.py.哪如何实现一个精简版本的manage.py里。我们先看错误.

No module named local_db.models

~/test/django$ python sample/tests.py
Traceback (most recent call last):
File "sample/tests.py", line 1, in <module>
from sample.models import Question
ImportError: No module named sample.models


这个库找不到,其实正常来想,这个库确实应该找不到的, 因为sample目录是tests.py的父亲目录,不在它的搜索范围内, 自然找不到。但是我又要问了?为啥以web运行时就可以找到呢?这个就是manage.py的功能,它会把”/home/itleaks/test/django/”添加到模块搜索路径里,这样在web服务器启动test.py时自然能够找到sample.models模块.所以,解决这个问题很简单,在执行这个脚本前也添加这个路径。

export PYTHONPATH=/home/itleaks/test/django


然后再执行

python sample/tests.py
Traceback (most recent call last):
File "sample/tests.py", line 1, in <module>
from sample.models import Question
File "/home/itleaks/test/django/sample/models.py", line 3, in <module>
from django.db import models
File "/usr/local/lib/python2.7/dist-packages/django/db/__init__.py", line 14, in <module>
if not settings.DATABASES:
File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 276, in __getattr__
self._setup()
File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 40, in _setup
raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE)
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.


看到没,第一个问题解决额,现在出现了另外一个问题DJANGO_SETTINGS_MODULE is undefined.

DJANGO_SETTINGS_MODULE is undefined

从这个提示看来,是没有配置setting.想来想去,init.py文件里面最适合添加配置了。由于我们需要访问到根目录下settings.py,因此只能在根目录下的init.py添加。这样同时必须将项目的父亲目录设置为模块路径

具体代码如下

export PYTHONPATH=/home/itleaks/test/django


修改init.py

import os
import sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'django.mysite.settings'

sys.path.append(os.path.dirname(__file__))


修改tests.py

from django.sample.models import Question
# Create your tests here.
if __name__ == "__main__":
Question.objects.all()
print 'ok'


这样在一开始引用django.sample.models的时候,会加载init.py,自然将DJANGO_SETTINGS_MODULE赋值了

再执行

python local_db/tests.py
ok


可见运行成功

模块路径优化

我们前面是通过export PYTHONPATH=/home/itleaks/test/django来将

我们的项目目录加入库搜索路径的,其实有一种更好的方法,就是在/usr/lib/python2.7/dist-packages/或者/usr/lib/python2.7/site-packages/下增加一个xxx.pth文件,里面的内容就是/home/itleaks/test/django,这样就自动加载了该路径
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: