当前位置: 移动技术网 > IT编程>脚本编程>Python > django1.11入门

django1.11入门

2018年12月12日  | 移动技术网IT编程  | 我要评论

鼠猫记事,日本综艺节目在哪看,快乐大脚1

快速安装指南

在使用django之前,您需要安装它。我们有 ,涵盖所有可能性; 本指南将指导您进行简单,最小化的安装,在您完成介绍时可以正常工作。

安装python¶

作为一个python web框架,django需要python。请参阅 django可以使用哪些python版本?详情。python包含一个名为sqlite的轻量级数据库,因此您不需要设置数据库。

或使用操作系统的软件包管理器获取最新版本的python 

关于jython的django

如果您使用(java平台的python实现),则需要执行一些额外的步骤。有关详细信息,请参阅在jython上运行django

您可以通过python从shell 输入来验证是否已安装python 你应该看到类似的东西:

python 3.4.x
[gcc 4.x] on linux
type "help", "copyright", "credits" or "license" for more information.
>>>
>>>

设置数据库

只有在您希望使用postgresql,mysql或oracle等“大型”数据库引擎时,才需要执行此步骤。要安装此类数据库,请查阅 

删除任何旧版本的django¶

如果要从先前版本升级django的安装,则需要在安装新版本之前卸载旧的django版本

安装django¶

你有三个简单的选项来安装django:

  • 这是大多数用户的最佳方法。
  • 安装的django版本
  • 此选项适用于需要最新和最强大功能并且不怕运行全新代码的发烧友。您可能会在开发版本中遇到新的错误,但报告它们有助于django的开发。此外,与最新的稳定版本相比,第三方软件包的发行版不太可能与开发版本兼容。

请始终参考与您正在使用的django版本对应的文档!

如果您执行前两个步骤中的任何一个,请留意开发版本中标记为文档的部分文档该短语标记仅在django的开发版本中可用的功能,并且它们可能不适用于正式版本。

验证

要验证python可以看到django,请python从shell中输入。然后在python提示符下,尝试导入django:

>>> import django
>>> print(django.get_version())
1.11

 

编写你的第一个django应用程序,第1部分

让我们通过例子来学习。

在本教程中,我们将引导您完成基本轮询应用程序的创建。

它由两部分组成:

  • 一个公共站点,允许人们查看民意调查并在其中投票。
  • 一个管理站点,允许您添加,更改和删除民意调查。

我们假设你已经django您可以通过在shell提示符中运行以下命令(由$前缀表示)来告知django已安装以及哪个版本:

$ python -m django --version

如果安装了django,您应该会看到安装的版本。如果不是,您将收到错误消息“没有名为django的模块”。

本教程是为django 1.11和python 3.4或更高版本编写的。如果django版本不匹配,您可以使用本页右下角的版本切换器参考您的django版本的教程,或者将django更新到最新版本。如果您仍在使用python 2.7,则需要稍微调整代码示例,如注释中所述。

有关删除旧版本django并安装较新版本的建议,请参阅如何安装django

 

创建项目

如果这是你第一次使用django,你将不得不处理一些初始设置。也就是说,您需要自动生成一些建立django 代码- django实例的设置集合,包括数据库配置,django特定选项和特定于应用程序的设置。

从命令行cd进入要存储代码的目录,然后运行以下命令:

$ django-admin startproject mysite

这将mysite在当前目录中创建一个目录。如果它不起作用,请参阅

注意

您需要避免在内置python或django组件之后命名项目。特别是,这意味着你应该避免使用像 django(这将与django本身冲突)或test(与内置python包冲突)这样的名称。

这段代码应该在哪里生活?

如果您的背景是普通的php(不使用现代框架),那么您可能习惯将代码放在web服务器的文档根目录下(在某个地方/var/www)。使用django,你不会这样做。将任何此python代码放在​​web服务器的文档根目录中并不是一个好主意,因为它可能会使人们可能通过web查看您的代码。这对安全性不利。

将代码放在文档根目录之外某个目录中,例如 /home/mycode

让我们来看看创造了什么

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

这些文件是:

  • 外部mysite/根目录只是项目的容器。它的名字对django来说无关紧要; 你可以将它重命名为你喜欢的任何东西。
  • manage.py:一个命令行实用程序,允许您以各种方式与此django项目进行交互。您可以manage.py阅读有关的所有详细信息 
  • 内部mysite/目录是项目的实际python包。它的名称是您需要用来导入其中任何内容的python包名称(例如mysite.urls)。
  • mysite/__init__.py:一个空文件,告诉python该目录应该被视为python包。如果您是python初学者,请阅读官方python文档中有关包的更多信息
  • mysite/settings.py:此django项目的设置/配置。 django设置将告诉您有关设置如何工作的所有信息。
  • mysite/urls.py:这个django项目的url声明; 您的django支持的站点的“目录”。您可以在url调度程序中阅读有关url的更多信息
  • mysite/wsgi.py:与wsgi兼容的web服务器的入口点,用于为您的项目提供服务。有关更多详细信息,请参阅如何使用wsgi进行

开发服务器

让我们验证您的django项目是否有效。mysite如果尚未更改到外部目录,请运行以下命令:

$ python manage.py runserver

您将在命令行中看到以下输出:

performing system checks...

system check identified no issues (0 silenced).

you have unapplied migrations; your app may not work properly until they are applied.
run 'python manage.py migrate' to apply them.

december 05, 2018 - 15:50:53
django version 1.11, 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服务器。)

现在服务器正在运行,请使用web浏览器访问您将看到一个“欢迎来到django”页面,采用令人愉悦的浅蓝色粉彩。有效!

改变端口

默认情况下,该命令在端口8000的内部ip上启动开发服务器。

如果要更改服务器的端口,请将其作为命令行参数传递。例如,此命令在端口8080上启动服务器:

$ python manage.py runserver 8080

如果要更改服务器的ip,请将其与端口一起传递。例如,要监听所有可用的公共ip(如果您正在运行vagrant或想要在网络上的其他计算机上展示您的工作,这很有用),请使用:

$ python manage.py runserver 0:8000

00.0.0.0的快捷方式可以在参考中找到开发服务器的完整文档

自动重装 

开发服务器根据需要自动为每个请求重新加载python代码。您无需重新启动服务器即可使代码更改生效。但是,某些操作(如添加文件)不会触发重新启动,因此在这些情况下您必须重新启动服务器。

创建民意调查应用

既然你的环境 - 一个“项目” - 已经建立起来,你就可以开始工作了。

您在django中编写的每个应用程序都包含一个遵循特定约定的python包。django附带了一个实用程序,可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不是创建目录。

项目与应用

项目和应用程序之间有什么区别?应用程序是执行某些操作的web应用程序 - 例如,weblog系统,公共记录数据库或简单的轮询应用程序。项目是特定网站的配置和应用程序的集合。项目可以包含多个应用程序。一个应用程序可以在多个项目中。

您的应用程序可以存在于python路径的任何位置在本教程中,我们将在您的manage.py 文件旁边创建我们的民意调查应用程序,以便可以将其导入为自己的顶级模块,而不是子模块mysite

要创建应用程序,请确保您与该目录位于同一目录中manage.py 并键入以下命令:

$ python manage.py startapp polls

那将创建一个目录polls,其布局如下:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

此目录结构将容纳轮询应用程序。

写下你的第一个视图

我们来写第一个视图。打开文件polls/views.py 并在其中放入以下python代码:

from django.http import httpresponse


def index(request):
    return httpresponse("hello, world. you're at the polls index.")

这是django中最简单的视图。要调用视图,我们需要将其映射到url - 为此我们需要一个urlconf。

要在polls目录中创建urlconf,请创建一个名为的文件urls.py您的app目录现在应该如下所示:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

在该polls/urls.py文件中包含以下代码:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]
polls/urls.py

下一步是将根urlconf指向polls.urls模块。在 mysite/urls.py,添加导入django.conf.urls.includeurlpatterns列表中插入,所以你有:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
]
mysite/urls.py

函数允许引用其他urlconf。请注意,该函数的正则表达式 没有$(字符串结尾匹配字符),而是一个尾部斜杠。每当django遇到时 ,它都会删除与该点匹配的url的任何部分,并将剩余的字符串发送到包含的urlconf以进行进一步处理。

背后的想法是使即插即用的url变得容易。由于民意调查位于他们自己的urlconf(polls/urls.py)中,因此可以将它们放在“/ polls /”下,或“/ fun_polls /”下,或“/ content / polls /”下,或任何其他路径根目录下,并且应用程序仍然可以工作。

什么时候用 

include()当您包含其他url模式时,应始终使用。 admin.site.urls是唯一的例外。

与你看到的不符?

如果您看到的include(admin.site.urls)不是公正的 admin.site.urls,那么您可能正在使用与本教程版本不匹配的django版本。您将要切换到较旧的教程或较新的django版本。

您现在已将index视图连接到urlconf。让我们验证它是否正常工作,运行以下命令:

$ python manage.py runserver

在浏览器中转到,您应该看到文本“ hello,world。. you’re at the polls index.”, 您在index视图中定义的 

函数传递了四个参数,两个必需:regexview,以及两个可选:kwargs,和name在这一点上,值得回顾一下这些论点的用途。

参数:正则表达式

术语“正则表达式”是一种常用的缩写形式,意思是“正则表达式”,它是用于匹配字符串中的模式的语法,或者在这种情况下是url模式。django从第一个正则表达式开始,沿着列表向下,将请求的url与每个正则表达式进行比较,直到找到匹配的正则表达式。

请注意,这些正则表达式不会搜索get和post参数或域名。例如,在请求中 https://www.example.com/myapp/,urlconf将查找myapp/在请求中https://www.example.com/myapp/?page=3,urlconf也会查找myapp/

如果您需要有关正则表达式的帮助,请参阅wikipedia的条目re模块的文档另外,杰弗里·弗里德(jeffrey friedl)的奥莱利(o'reilly)着作“掌握正则表达式”(mastering regular expressions 但是,在实践中,您不需要成为正则表达式的专家,因为您实际上只需要知道如何捕获简单模式。事实上,复杂的正则表达式可能具有较差的查找性能,因此您可能不应该依赖于正则表达式的全部功能。

最后,一个性能说明:这些正则表达式是在第一次加载urlconf模块时编译的。它们超快(只要查找不是太复杂,如上所述)。

参数:视图

当django找到正则表达式匹配时,django调用指定的视图函数,将httprequest对象作为第一个参数,将正则表达式中的任何“捕获”值作为其他参数。如果正则表达式使用简单捕获,则值将作为位置参数传递; 如果它使用命名捕获,则值将作为关键字参数传递。我们稍后会给出一个例子。

参数:kwargs 

任意关键字参数可以在字典中传递到目标视图。我们不打算在教程中使用django的这个功能。

参数:名称

命名您的url可让您从django的其他地方明确地引用它,尤其是在模板中。此强大功能允许您在仅触摸单个文件的同时对项目的url模式进行全局更改。

 

编写你的第一个django应用程序,第2部分

本教程从停止的地方开始我们将设置数据库,创建您的第一个模型,并快速介绍django自动生成的管理站点。

数据库设置

现在,打开mysite/settings.py这是一个普通的python模块,其中模块级变量代表django设置。

默认情况下,配置使用sqlite。如果您是数据库新手,或者您只是想尝试django,这是最简单的选择。sqlite包含在python中,因此您无需安装任何其他东西来支持您的数据库。但是,在启动第一个真正的项目时,您可能希望使用像postgresql这样的更具伸缩性的数据库,以避免数据库切换问题。

如果要使用其他数据库,请安装相应的并更改项目中的以下键 以匹配数据库连接设置:databases 'default'

  • engine-要么 'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql',或'django.db.backends.oracle'其他后端
  • name - 数据库的名称。如果您使用的是sqlite,则数据库将是您计算机上的文件; 在这种情况下,name 应该是该文件的完整绝对路径,包括文件名。默认值,, 将文件存储在项目目录中。os.path.join(base_dir, 'db.sqlite3')

如果你不使用sqlite作为数据库,额外的设置,例如 userpasswordhost必须加入。有关更多详细信息,请参阅参考文档databases

对于sqlite以外的数据库

如果您使用的是除sqlite之外的数据库,请确保此时已创建数据库。在数据库的交互式提示中使用“ ” 执行此操作。createdatabase database_name;

还要确保提供的数据库用户mysite/settings.py 具有“create database”特权。这允许自动创建 ,这将在以后的教程中使用。

如果您使用的是sqlite,则无需事先创建任何内容 - 数据库文件将在需要时自动创建。

在编辑时mysite/settings.py,请设置time_zone为您的时区。

另外,请注意installed_apps文件顶部设置。它包含在这个django实例中激活的所有django应用程序的名称。应用程序可以在多个项目中使用,您可以打包和分发它们以供项目中的其他人使用。

默认情况下,installed_apps包含以下应用程序,所有这些应用程序都随django一起提供:

默认情况下包含这些应用程序,以方便常见情况。

但是,其中一些应用程序至少使用了一个数据库表,因此我们需要先在数据库中创建表,然后才能使用它们。为此,请运行以下命令:

$ python manage.py migrate

命令查看installed_apps设置并根据mysite/settings.py文件中的数据库设置和应用程序附带的数据库迁移创建任何必要的数据库表(稍后我们将介绍这些表)。您将看到适用于每次迁移的消息。如果您有兴趣,请运行数据库的命令行客户端并键入\dt(postgresql),(mysql), (sqlite)或(oracle)以显示django创建的表。show tables;.schemaselect table_name fromuser_tables;

对于极简主义者

就像我们上面所说的那样,默认应用程序包含在常见情况中,但不是每个人都需要它们。如果您不需要其中任何一个或全部,请installed_apps在运行前随意注释或删除相应的行 该 命令仅运行应用程序的迁移installed_apps

创建模型

现在我们将定义您的模型 - 本质上是您的数据库布局,以及其他元数据。

哲学

模型是关于数据的单一,明确的真实来源。它包含您要存储的数据的基本字段和行为。django遵循dry原则目标是在一个地方定义您的数据模型,并自动从中获取数据。

这包括迁移 - 与ruby on rails不同,例如,迁移完全来自您的模型文件,并且基本上只是django可以通过更新数据库模式以匹配您当前模型的历史记录。

在我们简单的民意调查应用程序中,我们将创建两个模型:questionchoicequestion有问题和出版日期。choice有两个字段:选择的文本和投票记录。每个choice都与一个question

这些概念由简单的python类表示。编辑 polls/models.py文件,使其如下所示:

from django.db import models


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)
polls/models.py

代码很简单。每个模型由一个子类表示django.db.models.model每个模型都有许多类变量,每个变量代表模型中的数据库字段。

每个字段由field 类的实例表示- 例如,charfield用于字符字段和 datetimefield日期时间。这告诉django每个字段包含哪种类型的数据。

每个field实例的名称(例如 question_textpub_date)是字段名称,采用机器友好格式。您将在python代码中使用此值,并且您的数据库将使用它作为列名。

您可以使用可选的第一个位置参数 field来指定一个人类可读的名称。这在django的几个内省部分中使用,并且它兼作文档。如果未提供此字段,django将使用机器可读的名称。在这个例子中,我们只定义了一个人类可读的名称question.pub_date对于此模型中的所有其他字段,字段的机器可读名称就足以作为其可读的名称。

有些field类需要参数。 charfield例如,要求你给它一个 max_length这不仅在数据库模式中使用,而且在验证中使用,我们很快就会看到。

field也可以有各种可选参数; 在这种情况下,我们将default值 设置votes为0。

最后,请注意使用的定义关系 foreignkey这告诉django每个choice都与单个相关questiondjango支持所有常见的数据库关系:多对一,多对多和一对一。

激活模型

这一小部分模型代码为django提供了大量信息。有了它,django能够:

  • 为此应用程序创建数据库模式(语句)。create table
  • 创建用于访问questionchoice对象的python数据库访问api 

但首先我们需要告诉我们的项目polls应用程序已安装。

哲学

django应用程序是“可插拔的”:您可以在多个项目中使用应用程序,并且可以分发应用程序,因为它们不必绑定到给定的django安装。

要在我们的项目中包含应用程序,我们需要在设置中添加对其配置类的引用installed_apps该 pollsconfig班是在polls/apps.py文件中,所以它的虚线路径'polls.apps.pollsconfig'编辑mysite/settings.py文件并将该虚线路径添加到installed_apps设置中。它看起来像这样:

installed_apps = [
    'polls.apps.pollsconfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
mysite/settings.py

现在django知道要包含该polls应用程序。让我们运行另一个命令:

$ python manage.py makemigrations polls

您应该看到类似于以下内容的内容:

migrations for 'polls':
  polls/migrations/0001_initial.py:
    - create model choice
    - create model question
    - add field question to choice

通过运行makemigrations,您告诉django您已对模型进行了一些更改(在这种情况下,您已经创建了新模型),并且您希望将更改存储为迁移

迁移是django如何存储对模型(以及数据库模式)的更改 - 它们只是磁盘上的文件。如果您愿意,可以阅读新模型的迁移; 这是文件polls/migrations/0001_initial.py不要担心,每次django制作时都不会读它们,但是如果你想手动调整django如何改变它们,它们的设计是人为可编辑的。

有一个命令可以为您运行迁移并自动管理您的数据库模式 - 这是被调用的,我们马上就会看到它 - 但首先,让我们看看迁移将运行的sql。该 命令获取迁移名称并返回其sql:

$ python manage.py sqlmigrate polls 0001

您应该看到类似于以下内容的东西(为了便于阅读,我们重新格式化了它):

begin;
--
-- create model choice
--
create table "polls_choice" (
    "id" serial not null primary key,
    "choice_text" varchar(200) not null,
    "votes" integer not null
);
--
-- create model question
--
create table "polls_question" (
    "id" serial not null primary key,
    "question_text" varchar(200) not null,
    "pub_date" timestamp with time zone not null
);
--
-- add field question to choice
--
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")
    deferrable initially deferred;

commit;

请注意以下事项:

  • 确切的输出将根据您使用的数据库而有所不同。上面的示例是为postgresql生成的。
  • 表名是通过组合应用程序的名称(自动生成polls)和模型的小写名字- question和 choice(您可以覆盖此行为。)
  • 主键(id)会自动添加。(你也可以覆盖它。)
  • 按照惯例,django附加"_id"到外键字段名称。(是的,你也可以覆盖它。)
  • 外键关系通过 约束显式化不要担心零件; 这只是告诉postgresql在事务结束之前不强制执行外键。foreign keydeferrable
  • 它是根据您正在使用的数据库量身定制的,因此可以自动为您处理特定于数据库的字段类型,如auto_increment(mysql),serial(postgresql)或(sqlite)。引用字段名称也是如此 - 例如,使用双引号或单引号。integer primary key autoincrement
  • 命令实际上并不在您的数据库上运行迁移 - 它只是将其打印到屏幕上,以便您可以看到sql django认为需要什么。它对于检查django将要执行的操作或者是否有需要sql脚本进行更改的数据库管理员非常有用。

如果你有兴趣,你也可以跑 这将检查项目中的任何问题,而无需进行迁移或触摸数据库。

现在,再次运行以在数据库中创建这些模型表:

$ python manage.py migrate
operations to perform:
  apply all migrations: admin, auth, contenttypes, polls, sessions
running migrations:
  rendering model states... done
  applying polls.0001_initial... ok

命令将执行所有尚未应用的迁移(django跟踪使用数据库中的特殊表来应用哪些迁移django_migrations)并针对您的数据库运行它们 - 实际上,您将对模型所做的更改与模型中的模式同步数据库。

迁移功能非常强大,您可以在开发项目时随时更改模型,而无需删除数据库或表并创建新数据库 - 它专门用于实时升级数据库,而不会丢失数据。我们将在本教程的后续部分中更深入地介绍它们,但是现在,请记住进行模型更改的三步指南:

  • 更改模型(in models.py)。
  • 运行以创建这些更改的迁移
  • 运行以将这些更改应用于数据库。

之所以有单独的命令来制作和应用迁移是因为您将提交迁移到您的版本控制系统并随应用程序一起发送; 它们不仅使您的开发更容易,而且还可以被其他开发人员和生产中使用。

阅读,了解该manage.py实用程序可以执行的操作的完整信息

使用api¶

现在,让我们进入交互式python shell并使用django为您提供的免费api。要调用python shell,请使用以下命令:

$ python manage.py shell

我们使用它而不是简单地输入“python”,因为manage.py 设置了django_settings_module环境变量,这为django提供了mysite/settings.py文件的python导入路径

绕过manage.py

如果你不想使用manage.py,没问题。只需设置 django_settings_module环境变量to mysite.settings,启动一个普通的python shell,并设置django:

>>> import django
>>> django.setup()

如果这引发了attributeerror,你可能正在使用与本教程版本不匹配的django版本。您将要切换到较旧的教程或较新的django版本。

您必须python从同一目录运行manage.py,或确保该目录位于python路径上,这样才 有效。import mysite

有关所有这些的更多信息,请参阅

进入shell后,浏览数据库api

>>> from polls.models import question, choice   # import the model classes we just wrote.

# 系统中还没有任何问题。
>>> question.objects.all()
<queryset []>

# 创建一个新问题。
# 默认设置文件中启用了对时区的支持,因此
# django期望pub_date的日期时间为tzinfo。 使用timezone.now()
#而不是datetime.datetime.now(),它会做正确的事情。
>>> from django.utils import timezone
>>> q = question(question_text="what's new?", pub_date=timezone.now())

#将对象保存到数据库中。 您必须显式调用save()。
>>> q.save()

# 现在它有一个id。 请注意,这可能会说“1l”而不是“1”,具体取决于
# 您正在使用哪个数据库。 那不是什么大事; 它只是意味着你的
# 据库后端更喜欢将整数作为python长整数返回
# objects.
>>> q.id
1

# 通过python属性访问模型字段值。
>>> q.question_text
"what's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<utc>)

# 通过更改属性更改值,然后调用 save().
>>> q.question_text = "what's up?"
>>> q.save()

# objects.all()显示数据库中的所有问题。
>>> question.objects.all()
<queryset [<question: question object>]>

等一下。完全是对这个对象的无益表现。让我们来解决这个问题通过编辑模型(在 文件),并加入 到两个方法和 <question: questionobject>questionpolls/models.py__str__()questionchoice

from django.db import models
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible  # only if you need to support python 2
class

                    

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网