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

django入门 直接翻译官方文档

2016-08-10 21:14 295 查看
2.3 写你的第一个django应用, 第一部分.

让我们从一个例子学习.

通过这个教程, 我们会带你领略创建一个基本的投票应用.

它包括2部分:

    . 一个公开网站让人们查看投票选项和投票给它们.

    . 一个管理网站让你添加, 修改, 删除投票选项.

我们假设你已经安装了django. 你能通过这个命令查看django版本:

$ python -c 'import django; print(django.get_version())';

如果django安装了, 你应该看见版本号, 如果没有, 你会得到错误"没有叫django的模

块".

这个教程是为django1.8和python3.2或更高写的. 如果你在使用python2.7, 你需要对

代码作少量调整, 象注释里说的.

2.3.1 创建一个项目

如果这是你第一次使用django, 你需要注意一些初始设置. 比方说, 你需要 自动-生成

一些确保一个django项目的代码 - 一组对一个django实例的设置, 包括数据库配置,

django定制选项, 应用定制选项.

在命令行, cd 进入你想存放代码的目录, 执行下列命令:

$ django-admin startproject mysite

这会在当前目录创建一个mysite目录.

注意, 你必须避免用python或django内置组件命名项目. 特别的, 这意味着你不能用

django(与django本身冲突) 或 test(与python一个内置包冲突) 命名.

这个代码应该放哪里?

如果你有简单老式php背景(没有使用现代框架), 你可能习惯把代码放在web服务器根

目录(比如/var/www). 使用django, 你不需要这么做. 把这份代码任何部分放在web服

务器根目下不是一个好主意, 因为有被人们通过web查看你的代码的风险, 不安全.

把代码放在根目录以外的一个目录, 比如/root/kk/django_first.

我们看看startproject 创建了什么

mysite/

    manage.py

    mysite/

        __init__.py

        urls.py

        wsgi.py

这些文件是:

    . 外面的mysite根目录仅仅是这个项目的容器, 它的名子不重要, 你可以重命名它

      为任何名字.

    . manage.py:一个命令行工具, 让你用多用方式与django项目交互.

    . 里面的mysite/ 目录是项目的实际python包, 它的名子是你从里面导入任何东西

      要用到的, 比如mysite.urls.

    : mysite/__init__.py: 一个空文件, 告诉python这个目录应该被当作一个包.

    . mysite/settings.py: 设置/配置这个django项目.

    . mysite/urls.py: 这个django的URL声明, 你的基于django的网站的内容表.

    . mysite/wsgi.py: 一个WSGI兼容web服务器入口.

数据库设置:

现在, 打开mysite/settings.py, 一个用模块级变量表示django设置的普通python模块

.

这个配置默认使用SQLite, 如果你刚学数据库, 或者你只是想试试django, 这是最简单

的选择, python包含了SQLite, 所以你不需要安装别的东西. 但是当开始你的第一个真

正项目, 你可能会用一个更稳健的数据库比如PostgreSQL, 避免可能遇到的数据库切换

问题.

如果你想使用另一种数据库, 安装合适的数据库绑定, 修改DATABASE 'defualt' 项的

下列键:

    . ENGINE - 'django.db.backends.sqlite3',

      'django.db.backends.postgresql_psycopg2', 'django.db.backends.mysql',

      'django.db.backends.oracle' 中的任何一个.

    . NAME - 数据库的名字, 如果使用SQLite, 数据库是一个文件, 这种情况下, NAME

      应该是绝对路径. 默认值 os.path.join(BASE_DIR, 'db.sqlite3') 会在项目目

      录下保存这个文件.

如果用SQLite, USER, PASSWORD, HOST也要被设置.

注意: 如果用postgresql或mysql, 确保你已经创建了数据库.

如果用sqlite, 不需要先创建任何东西, 数据库文件在需要时会被自动创建.

把mysite/settings.py 的TIME_ZONE设置成你的时区.

注意文件上面的INSTALLED_APPS, 它包括了这个django实例里所有被激活的django应用.

应用可以在多个项目里被使用, 你也可以打包, 发布它们给别人在他们的项目里使用.

默认的, INSTALLED_APPS 包括下列应用, 都是django自带的:

    . django.contrib.admin 管理站点.

    . django.contrib.auth 一个认证系统.

    . django.contrib.contenttypes 一个内容类型框架.

    . django.contrib.sessions 一个会话框架.

    . django.contrib.messages 一个信息框架.

    . django.contrib.staticfiles 一个静态文件管理框架.

为了方便通常使用这些应用被默认包括.

其中一些这些应用使用至少一个数据库表, 所以你需要在使用它们前创建这些表. 执行

下列命令来做这个事:

$ python manage.py migrate

migrate命令查找INSTALLED_APPS设置, 创建所有需要的表, 和对应的数据库迁移.

你会看到每个迁移执行的一条信息. 如果你感兴趣, 执行你的数据库命令行客户端, 输

入 \dt(PostgreSQL), SHOW TABLES (MySQL), .schema(SQLite), 或SELECT TABLE_NAME

 FROM USER_TABLES(Oracle) 显示django创建的表.

最小需求

如上面所说, 为通常应用情况默认包含的应用, 不一定每个人都需要, 如果你不需要它

们中任何一个, 可以在执行migrate前从INSTALLED_APPS 中注释或删除掉对应行.

开发服务器

让我们测式你的django项目能工作, 进入外面的mysite目录, 执行下列命令:

$ python manage.py runserver

你将看到下列输出:

Performing system checks...

0 errors found

November 17, 2015 - 15:50:53

Django version 1.8, using settings `mysite.settings'

Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

你已经启动了django开发服务器, 一个纯用python写的轻量级web服务器. 我们用django

包括了它以便你能快速开发, 不需要解决配置生产服务器的问题, 象apache那样, 直到

你为生产作好了准备.

现在是时间注意这个:不要在生产环境使用这个服务器, 它的目地只是开发.(我们的工作

是制作web框架, 不是web服务器.)

现在服务器在运行, 访问 http://127.0.0.1:8000/, 会看见一个页面显示'Welcome to

Django', 淡蓝色粉笔, 它正常工作!

改变端口

默认的, runserver命令从8000端口启动开发服务器, 如果想改变端口, 把端口作为一个

命令行参数传递, 比如这个命令从8080端口启动:

$ python manage.py runserver 8080

如果想改变服务器IP, 把它和端口一起传递, 比如想监听所有公共IP:

$ python manage.py runserver 0.0.0.0:8000

自动重载runserver

开发服务器根据需要为每个请求自动重载python代码, 你不需要为使代码改变生效而重

启服务器, 但是有些动作如添加文件不会触发重启, 这种情况需要手动重启.

2.3.2 创建模块

你在django写的每个应用包含一个跟随一个特定约定的python包. django有一个功能自

动创建应用的目录结构. 使你能专心于写代码.

项目 vs 应用

项目和应用的区别是什么? 一个应用是一个做一些事的web应用, 比如一个Weblog系统,

一个公共记录数据库或者一个简单投票应用. 一个项目是一个特定网站的配置和应用集

合. 一个项目可以包括多个应方用, 一个应用可以在多个项目里.

应用可以在python搜索路径的任何位置. 这个教程里我们在manage.py同一目录创建poll

应用, 这样它能被直接导入为一个顶层模块, 而不是mysite下的一个子模块.

在manage.py同一目录执行下列命令:

$ python manage.py startapp polls

它会创建目录polls :

polls

├── admin.py

├── __init__.py

├── migrations

│   └── __init__.py

├── models.py

├── tests.py

└── views.py

在django里写一个数据库web应用第一步是定义模块 - 基本的数据库布局, 额外的元数

据.

哲学

一个模块是单一的, 数据真实性的权威来源. 它包括你的数据的基本的域和行为. django

遵守DRY原则, 目标是在一个地方定义数据模块, 并自动从里面得到东西.

这包括迁移, 不象ruby on rails, 比如, 迁移完全取决于模块文件.

我们创建两个模块Question和Choice.Qustion有一个问下周和公开日期, Choice包括两

部分, 选择文本和投票记录. 每个Choice和一个Question关联.

这些概念可以用简单的python类表示, 编辑polls/models.py:

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);

    choice_text = models.CharField(max_length = 200);

    votes = models.IntegerField(default = 0);

这段代码很直接, 每个模块由一个类表示, 这些类是django.db.models.Model的子类,

每个模块都有一些变量, 表示一个数据库域.

每个域都被表示成一个Field类实例, CharField 表示字符域, DateTimeField表示日期

域.

每个Field实例的名字是这个域的名字, 以机器友好格式, 数据库把它作为列名.

你可以用一个第一位置参数给Field实例指定一个可读的名字, That's used in a couple

of introspective parts of Django, and it doubles as documentation. 如果这个域

没有提供, Django会使用机器可读的名字. 这个例子里我们只为Question.pub_date 定

义了一个可读的名字.

有的Field类需要参数, 比如CharField, 你需要指定max_length. 它不仅用于数据库模

式, 也用于确认, 我们马上会看到这一点.

一个Field可以有多个参数, 这里我们把votes的默认值设为0.

最后, 注意ForeighKey 定义了一个关系, 它告诉Django每个Choice关联到一个Question,

Django支持所有的数据库关系:多对一, 多对多和一对一.

2.3.3 激活模块

这个小模块给了Django很多信息, 通过它, Django可以:

    . 创建数据库模式.

    . 创建python数据库房问API以访问Question和Choice对象.

但是我们首先要告诉这个项目polls应用安装了.

Django的应用是"可插拨的", 你可以在多个项目使用同一应用, 你还可以发布应用, 因为

它们不需要与一个特定的Django安装绑定.

编辑mysite/settings.py, 修改INSTALLED_APPS设置使包含'polls':

INSTALLED_APPS = (

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'polls',

)

再执行下列命令:

$python manage.py makemigrations polls

你会看到下列输入:

Migrations for 'polls':

  0001_initial.py:

    - Create model Choice

    - Create model Question

    - Add field question to choice

执行makemigration使Django知道你对模块作了些改变(这个例子里, 你添加了些东西)

和你希望这些改变被保存为一个migration.

Django通过Migration 保存你对模块的修改, 它们仅仅是磁盘上的文件, 你可以本看你

新模块的迁移, 它是文件polls/migrations/0001_initial.py.

有一个命令migrate执行迁移并自动管理数据库模式, 我们待会说它, 首先让我们看看

迁移会执行什么SQL语句. 命令sqlmigrate 根据迁移名字反回SQL语句:

$ python manage.py sqlmigrate polls 0001

输出:

BEGIN;

CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,

`choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL);

CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY

KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);

ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer NOT NULL;

ALTER TABLE `polls_choice` ALTER COLUMN `question_id` DROP DEFAULT;

CREATE INDEX `polls_choice_7aa0f6ee` ON `polls_choice` (`question_id`);

ALTER TABLE `polls_choice` ADD CONSTRAINT

`polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id` FOREIGN KEY

(`question_id`) REFERENCES `polls_question` (`id`);

COMMIT;

注意这些事:

    . 实际输出取决于你用的是什么数据库, 这个例子用的是MySQL.

    . 表名字通过结合应用名字(polls)和模块名字小写question和choice产生. (你可以

      修改这个行为)

    . 主键IDs是自动添加的. (你可以修改这个行为)

    . 根据约定, Django为外键域名字添加'_id'.(你可以修改这个行为)

    . 外键关系通过FOREIGN KEY限制显示指定.

    . 你可能通使用不同数据库的情况被仔细考虑到了, 一些特定数据库域类型如

      auto_increment(MySQL), serial(PostgreSQL), 或integer primary key

      autoincrement(SQLite)被自动处理. 用单引号还是双引号把域名字括起来也被

      考虑到了.

    . 命令sqlmigrate 不实际在数据库上执行迁移, 它只输出SQL语句.

你可以执行 python manage.py check, 它会检查项目的任何问题, 不会迁移和碰数据库.

现在执行migrate创建这些模块表:

$ python manage.py migrate

Operations to perform:

  Synchronize unmigrated apps: staticfiles, messages

  Apply all migrations: admin, contenttypes, polls, auth, sessions

Synchronizing apps without migrations:

  Creating tables...

    Running deferred SQL...

  Installing custom SQL...

Running migrations:

  Rendering model states... DONE

  Applying polls.0001_initial... OK

命令migrate执行所有没有执行的迁移, Django通过一个特殊表django_migrations跟踪

哪些迁移已执行了.

迁移很有用, 让你随时修改模块, 而不需要手动操作数据库, 它专门保持你的数据库最

新, 不会丢失数据.

下面总结修改模块的3步:

    . 修改模块models.py.

    . 执行 python manage.py makemigrations 创建迁移.

    . 执行 python manage.py migrate执行迁移.

把创建迁移和执行迁移分开是因为你可能提交迁移给版本控制系统, 并和应用一起航行

, 这不仅让开发简单, 对其它开发者和在生产中也有用.

2.3.4 使用API

现在我们跳进python交互shell并使用Django的自由API. 用这个命令调用python shell:

$ python manage.py shell

我们不直接输python, 是因为manage.py设置DJANGO_SETTINGS_MODULE环境变量, 告诉

mysite/settings.py python导入路径.

绕过manage.py

如果想不用manage.py, 可以在mysite/settings.py 设置DJANGO_SETTING_MODULE环境变
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: