欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python之Django过程解析

程序员文章站 2023-12-12 08:10:34
python之django过程解析  一、django的认识 1、设计模型model django无需就可以使用,通过对象关系映射器(object-relational mapping),...

python之django过程解析

 一、django的认识

1、设计模型model

django无需就可以使用,通过对象关系映射器(object-relational mapping),仅使用python代码就可以描述数据结构。

# myproject/myapp/models.py
form django.db import models
class book(models.model):
    name = models.charfield(max_length=100)
    pub_date = models.datefield()

分析:

models.py 文件主要用一个 python 类来描述数据表。 称为 模型(model) 。 运用这个类,你可以通过简单的 python 代码来创建、检索、更新、删除 数据库中的记录而无需写一条又一条的sql语句。 在这里我们创建了一个book模型,并定义了name和pub_date属性。

2、 设计视图views

在模型被定义之后,我们便可以在视图中引用模型。通常,视图根据参数检索数据,加载一个模板,并使用检索到的数据呈现模板。

# myproject/myapp/views.py
from django.shortcuts import render
from .models import person

def book_archive(request, year):
    book_list = person.objects.filter(birth_year = year)
    context = {'year': year, 'book_list': book_list}
    return render(request, 'books/year_archive.html', context)

分析:

views.py 文件包含了页面的业务逻辑。 book_archive()函数叫做视图。 这里还用到了year_archive.html模板。

3 、设计链接urls

优雅简洁的url解析式是衡量高品质网站的重要标准。django鼓励使用漂亮的url设计。 使用这些优美的url,只需要建立url和python回调函数简单的映射关系。

# myproject/myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('books/', views.year_archive),
]

分析:

urls.py 指出了什么样的 url 调用什么视图。 在这个例子中 books/xxxxx 将会调用 year_archive() 这个函数。也就是说,在进入这个链接时,会返回视图函数的结果。

4、 设计模板templates

django拥有强大的模板功能,使用该模板能设计出强大的web页面。

# /template/year_archive.html
{% block title %}books for {{ year }}{% endblock %}

{{% block content %}}

articles for {{years}}

{% for book in book_list %}

{{ book.name }}

published {{ book.pub_date|date:"f j, y" }}

{% endfor %} {% end block %}

分析:

year_archive.html 是 html 模板。 使用带基本逻辑声明的模板语言,如{% for book in book_list %},它试图将函数返回的结果显示在网页上。

django的这种结构我们称之为mtv模式:m代表模型(model),t代表模板(template),v代表视图(view)。这三个分别代表了三种不同功能的web应用,各司其职,又彼此合作。 大家一定听说过mvc模式(mode-view-controller),mtv模式本质上与mvc相同,都是让各保持低耦合的关系。 关于mtv模式我们将在后面部分详细的讲解。

二、创建django项目

1、创建django项目 mysite

django-admin startproject mysite

以下是mysite的目录结构:

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

分析:

这些目录和文件的作用分别是:

外层的mysite/:是项目的容器,可以为任意名字。

manage.py:一种让你可以使用各种方式管理django项目的命令行工具。在mysite/目录下输入python3 manage.py help,看一看它都能做什么。

内层的mysite/:包含项目,是一个纯python包。你可以在包里调用它内部的任何东西。

__init__.py:一个空文件,告诉python这个目录应该被认为是一个python包。一般,你不需要去修改它。

settings.py:django项目的配置文件。

urls.py:django项目的url声明。

wsgi.py:作为项目的运行在wsgi兼容的web服务器的入口。

2、启动django

确认django项目是否真的创建成功了,在有manage.py文件存在的根目录里,运行以下的命令:

cd /home/shiyanlou/code/mysite
 python3 manage.py runserver

打开命令里的地址http://127.0.0.1:8000/

三、视图 view

1 、创建应用

django中,每一个应用都是一个python包,并且遵守着相同的约定。

django自带一个工具,可以帮你生成应用的基本目录,极大地提高了开发效率。

进入mysite文件夹,在终端中输入:

cd /home/shiyanlou/code/mysite
python3 manage.py startapp lib

这将会创建一个名为lib的目录,以下是它的目录结构:

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

2、 开始编写视图

打开 lib/views.py,输入以下代码:

# lib/views.py
from django.http import httpresponse

def index(request):
    return httpresponse("hello, world!")

大家可以看出来,我们想要看到的就是在页面中输出hello, world!。

但仅编写视图函数,并不能在django页面上显示出来。如果想要看到效果,我们需要使用url来映射到它。

3、 lib/urls.py

在mysite/lib目录里新建urls.py文件,并输入以下代码:

# lib/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

这一步我们将应用lib里视图函数与url映射到了一起。

我们来详细讲解一下path()函数,它共有4个参数:

参数 意义 是否必须
route route 是一个匹配 url 的准则(类似正则表达式)。当 django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。 必须
view 当 django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 httprequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。 必须
kwargs 任意个关键字参数可以作为一个字典传递给目标视图函数。 可选
name 为你的 url 取名能使你在 django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 url 模式。 可选

在上面的代码中,route为空意味着我们可以直接用链接http://localhost:8000/lib/访问该视图函数,view=view.index是调用了view.py中的index视图,name为index代表我们可以在模板中用index来引用返回的变量。

接下来,我们需要向mysite/mysite/urls.py告知使用应用lib的视图。

输入以下代码:

# mysite/mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('lib/', include('lib.urls')),
    path('admin/', admin.site.urls),
]

实现的原理就是使用了include()函数,它允许应用其他的urlconfs。

比如使用这个地址进行请求时:http://localhost:8000/lib/,首先在mysite/mysite/urls.py中会截断与此项匹配的 url 部分,也就是lib/,然后将剩余的字符串发送到 urlconf 以供进一步处理。

4 、 运行

到这里,我们就把index视图添加进了urlconf。

让我们来验证下它是否可以正常工作:

python3 manage.py runserver

使用浏览器访问http://localhost:8000/lib/,

四、模型 model

1、 配置数据库

django的项目设置都包含在了mysite/mysite/settings.py中。

对于数据库,配置文件使用了sqlite作为默认的数据库文件。对于只是初步尝试django的我们来说,这十分方便,无需再去配置其他的东西。

在实际开发中,我们会用到其它更具扩展性的数据库。例如mysql、oracle等。

如果你选择使用这些数据库,你需要安装相应数据库的绑定,然后改变设置文件中的database default。

本课程默认使用sqlite数据库,想要使用其它数据库,可以参考 django官方文档database。

记得配置设置文件中的time_zone为自己所在地的时区,中国地区为asia/shanghai。

time_zone = 'asia/shanghai'

2 、创建模型

模型是真实数据的简明描述。它包含了存储的数据所必要的字段和行为。django遵循不要重复自己(dry原则)。它的目标是让你只需要定义数据模型,然后其它的东西你都不用关心,都会自动从模型生成。

在我们创建的馆应用中,需要创建一个模型book。book模型包括四个字段:书名、作者、出版社、出版日期。

向`mysite/lib/models.py

# lib/models.py
from django.db import models

class book(models.model):
    name = models.charfield(max_length=200)
    author = models.charfield(max_length=100)
    pub_house = models.charfield(max_length=200)
    pub_date = models.datetimefield('date published')

从代码可以看出,模型是django.db.models.model类的子类。每个模型有一些类变量,它们都表示模型里的一个数据库字段。

每个字段都是field类的实例。比如字符字段是charfield,日期字段被表示为datetimefield。这将告诉django每个字段要处理的数据类型。

定义某些field类实例需要参数。如上面的max_length=100中的max_length。这个参数的用处不止于用来定义数据结构,也用于验证数据。

3、 激活模型

通过前面的代码,django可以:

为这个应用创建数据库schema(生成 create table语句)。

创建可以与book对象进行交互的python数据库api。

为了实现上述功能,我们首先要将lib应用安装到我们项目中。

因为libconfig类写在文件lib/apps.py中,所以它的路径为lib.apps.libconfig

在设置文件中添加路径:、

# mysite/mysite/settings.py
installed_apps = [
    'lib.apps.libconfig',
    'django.contrib.admin',
    ...
]

现在你的django项目会包含lib应用。 运行下面的命令:

python3 manage.py makemigrations lib

通过运行 makemigrations 命令,django 会检测你对模型文件的修改,并且把修改的部分储存为一次迁移

现在运行migrate命令,在数据库里创建新定义的模型的数据表:

python3 manage.py migrate 

4 、使用api

现在尝试一下django为我们创建的各种api:

python3 manage.py shell

使用这个命令而不是简单的使用 "python" 是因为 manage.py 会设置 django_settings_module 环境变量,这个变量会让 django 根据 mysite/settings.py 文件来设置 python 包的导入路径。

>>>from lib.models import book
>>>book.objects.all()   #获取book所有对象

>>>from django.utils import timezone
>>>b = book(name='business', author='tom', pub_house='first press', pub_date=timezone.now())    #创建
>>>b.save() #保存
>>>b.id
1
>>>b.name
'business'
>>>b.pub_date
datetime.datetime(2018, 7, 4, 2, 29, 7, 578323, tzinfo=)

记住,改变模型需要这三步:

编辑 models.py 文件,改变模型。

运行 python manage.py makemigrations 为模型的改变生成迁移文件。

运行 python manage.py migrate 来应用数据库迁移。

五、模板 template

模板是一个文本,用于分离文档的表现形式和内容。

1、 创建模板

首先,在你的 mysite/lib 目录里创建一个 templates 目录。django 将会在这个目录里查找模板文件。

在 mysite/mysite/settings.py 文件中的 templates 配置项描述了 django 如何载入和渲染模板。默认的设置文件设置了 djangotemplates 后端,并设置 app_dirs = true。这一选项将会让 djangotemplates 在每个 installed_apps 文件夹中寻找 templates 子目录。

新建模板文件 lib/templates/lib/detail.html ,并向其中写入如下代码:

# lib/templates/lib/detail.html

book list

{% for book in book_list.all %} {% endfor %}
书名 作者 出版社 出版时间
{{ book.name }} {{ book.author }} {{ book.pub_house }} {{ book.pub_date }}

分析:

模板统一使用点符号.来访问变量的属性。在示例 {{ book.name }} 中,首先 django 尝试对 book 对象使用字典查找(也就是使用 obj.get(str) 操作),如果失败了就尝试属性查找(也就是 obj.str 操作),结果是成功了。如果这一操作也失败的话,将会尝试列表查找(也就是 obj[int] 操作)。

在 {% for ... in ... %} 循环中发生的函数调用:book_list.all 被解释为 python 代码 book_list.objects.all() ,将会返回一个可迭代的 book 对象,这一对象可以在 {% for ... in ... %} 标签内部使用。

上一篇:

下一篇: