单独使用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,这样就自动加载了该路径
相关文章推荐
- GoF23种设计模式之行为型模式之模板方法
- Django mtv思想
- Django环境搭建及安装
- HDU3966 Aragorn's Story(树链剖分)
- LeetCode------Majority Element
- 浏览器插件gooreplacer
- 【HDU 4722】Good Numbers
- Django的安装
- google protobuf的编译成jar包
- Django 实现用户注册和登录
- [golang note] 工程组织
- go语言编程(1)--环境搭建liteide--RHEL6.5
- 使用Go 协程对web站点进行压力测试
- goto 语句和标号
- mongo删除表或库后,释放磁盘空间
- 解决 googel 无法直接跳转网页打开搜索结果
- 听说,你想让自己的Go程序运行的更快?
- Django笔记:6.玩转API
- Django学习笔记1.--创建工程
- django 基础入门(一)