python 使用django库进行Web 开发

Posted 一个平凡de人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 使用django库进行Web 开发相关的知识,希望对你有一定的参考价值。

django Web 开发简介
Python Django 网站开发培训 - 2周入门 web后端开发 web服务端开发
django 简介|菜鸟教程

1、Django 简介:

Django 简介:来源django 简介|菜鸟教程

<1> 基本介绍

Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架

使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。

MVC 优势:

  • 低耦合
  • 开发快捷
  • 部署方便
  • 可重用性高
  • 维护成本低

Python 加 Django 是快速开发、设计、部署网站的最佳组合。

特点

  • 强大的数据库功能
  • 自带强大的后台功能
  • 优雅的网址

<2>MVC 与 MTV模型

【1】MVC 模型

MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC 以一种插件式的、松耦合的方式连接在一起。

模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
视图(V)- 图形界面,负责与用户的交互(页面)。
控制器(C)- 负责转发请求,对请求进行处理。

  • M : 模型 与数据库交互
  • T:模版 一个放数据的架子
  • V: 视图

简易图:
用户操作流程图:

【2】MTV 模型

Django 的 MTV 模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django 的 MTV 分别是指:

M 表示模型(Model):编写程序应有的功能,负责业务对象与数据库的映射(ORM)。

  • T 表示模板 (Template):负责如何把页面(html)展示给用户。
  • V 表示视图(View):负责业务逻辑,并在适当时候调用 Model和 Template。

除了以上三层之外,还需要一个 URL 分发器,它的作用是将一个个 URL 的页面请求分发给不同的 View 处理,View 再调用相应的 Model 和 Template,MTV 的响应模式如下所示:
简易图:

用户操作流程图:

解析:

用户通过浏览器向我们的服务器发起一个请求(request),这个请求会去访问视图函数:

a.如果不涉及到数据调用,那么这个时候视图函数直接返回一个模板也就是一个网页给用户。
b.如果涉及到数据调用,那么视图函数调用模型,模型去数据库查找数据,然后逐级返回。
视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。

2、django的安装和运行

<1> 安装

pip install django

<2> 创建项目

django-admin startproject myDjango 

myDjango 是可以自定义的项目名

项目配置目录和项目本身目录同名,比较怪异,可以这样创建目录,结构更合理一些:

# 执行命令创建项目目录,并且进入到项目目录
mkdir myDjango  && cd myDjango 

# 然后执行命令 创建manage.py 和 项目配置目录 名为 config
django-admin startproject config .



目录说明:

  • config: 项目的容器。
  • manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
  • config/__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
  • config/asgi.py: 一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目。
    -config/settings.py: 该 Django 项目的设置/配置。
  • config/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
  • config/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

<3> 启动服务器

python manage.py runserver 0.0.0.0:80

0.0.0.0 代表一切均可以访问
80 是可以自定义端口号

<4> 放行ip

虽说0.0.0.0 代表一切均可以访问,但外网ip还需配置 放行ip



localhost 同理

实战开发:

3、url路由

<1>创建项目的Application

Django 中的一个Application就是项目里面的一个应用的意思。

一个项目包含多个Application

一个Application 通常就是一个相对独立的模块 ,实现相对独立的功能。

比如,我们可以把 这个系统的 管理员管理的功能 做在一个名字为 mgr的Application里面,把 销售人员的操作 实现在另外一个名字为 sales的Application里面。

一个Application 本质上 就是一个 Python 包, 里面包含了一些应用相关的代码文件。

当然,一个项目分成多少个Application 这完全取决你的设计。 你把所有的功能都放入一个大Application内也可以实现功能,只是这样做,这个Application特别的臃肿。

Application 缩写为 app
Django 中创建app 可以 通过执行命令,创建一个app目录,并在里面自动创建app常用的文件。

比如,现在我们需要一个app 专门处理 白月医药系统中销售员的 添加、修改、查询、删除请求。

我们就进入项目根目录,执行下面的命令。

python manage.py startapp sales 


<2>配置url

url路由设置的入口文件:

在 urlpatterns 列表变量中添加一条路由信息,结果如下:

from django.contrib import admin
from django.urls import path

from sales.views import listorders

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

    # 添加如下的路由记录
    path('sales/orders/', listorders),
]


<3> 路由子表

有的时候,我们的项目比较大的时候, 请求的url 会特别多。

【1】创建路由子表


路由子表sales/urls.py:

from django.urls import path
from sales.views import listorders,listorders2,listorders3

urlpatterns = [
    # 添加如下的路由记录
    path('1/', listorders),
    path('2/', listorders2),
    path('3/', listorders3),

]

【2】修改主路由表

config/urls.py:

from django.contrib import admin
from django.urls import path, include

# from sales.views import listorders

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

    # 添加如下的路由记录
    path('sales/', include('sales.urls')),
]

【2】修改views.py

sales/views.py:

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse


def listorders(request):
    return HttpResponse("下面是系统中所有的订单信息。。。111")


def listorders2(request):
    return HttpResponse("下面是系统中所有的订单信息。。。222")


def listorders3(request):
    return HttpResponse("下面是系统中所有的订单信息。。。333")


4、创建数据库和表

<1> 选择数据库

后端开发基本都需要操作数据,包括数据的 存储、查询、修改、删除。

通常,这些都是通过数据库来完成的。目前业界最广泛使用的数据库还是:关系型数据库。

关系型数据库系统,常用的开源数据库有 mysqlpostgresql

但是上面这些数据库,都需要我们安装数据库服务系统 和 客户端库,比较麻烦,现在我们先使用另一种更简单的 数据库sqlite

sqlite 没有 独立的数据库服务进程,数据操作被做成库直接供应用程序调用。 Django中可以直接使用,无须先搭建数据服务。

后面大家要使用mysql 等其他数据库 只需修改一些配置就可以了。

<2> 创建数据库

项目中数据库的配置在config/settings.py 中,这里
django默认使用sqlite数据库,而且创建项目时自动生成db.sqlite文件

虽然有db.sqlite文件,但我们创建数据库,还需要执行如下命令

python manage.py migrate

<3> 使用sqlite 数据库工具 sqlitestudio

<4> 通过对象操作数据库的方法 (ORM)

数据库表定义和表记录之间的关系 就像类和实例 之间的关系,Django 就让开发者 通过 类 和 实例的操作 来对应 数据库 表 和记录的操作。

Django 里面, 数据库表的操作,包括 表的定义、表中数据的增删改查,都可以通过 Model 类型的对象进行的。

通常,在Django中

  • 定义一张数据库的表 就是定义一个继承自 django.db.models.Model 的类

  • 定义该表中的字段(列), 就是定义该类里面的一些属性

  • 类的方法就是对该表中数据的处理方法,包括 数据的增删改查

这样,开发者对数据库的访问,从原来的使用底层的 sql 语句,变成面向对象的开发,通过一系列对象的类定义 和方法调用就可以 操作数据库。

首先 极大的简化了我们应用中的数据库开发,因为无需使用sql语句操作数据库了, 提高了开发的效率;

其次 屏蔽了 不同的数据库访问的底层细节,基本做到了 开发好代码后,如果要换数据库,几乎不需要改代码, 修改几个配置项就可以了。

这种 通过 对象 操作数据库 的方法 被称之为 ORM (object relational mapping),下面我们就来看怎样使用。

<5> 定义数据库表

首先,我们再创建一个名为common的应用目录, 里面存放我们项目需要的一些公共的表的定义。

python manage.py startapp common 


Django是通过定义类来定义数据库表的
所以,我们要定义数据库的表,无需执行sql语句,只需要在app目录下面 定义特殊的类就可以了。

数据库表的定义,一般是放在app目录中的 models.py里面的。

打开 common/models.py,发现里面是空的,因为我们还没有定义我们的业务所需要的表。

我们修改它,加入如下内容
common/models.py:

from django.db import models


class Customer(models.Model):
    # 客户名称
    name = models.CharField(max_length=200)

    # 联系电话
    phonenumber = models.CharField(max_length=200)

    # 地址
    address = models.CharField(max_length=200)

这个 Customer 类继承自 django.db.models.Model, 就是用来定义数据库表的。

里面的 namephonenumberaddress 是该表的3个字段。

定义表中的字段 就是定义一些静态属性,这些属性是django.db.models 里面的各种 Field 对象,对应不同类型的字段。

  • 这里的3个字段 都是 CharField 对象,对应 varchar类型的数据库字段。
  • 后面的参数 max_length 指明了该 varchar字段的 最大长度。
  • Djanog 有很多字段对象类型, 对应不同的类型的数据库字段。

<6> 创建数据库表

在项目的配置文件 config/settings.py 中, INSTALLED_APPS 配置项 加入如下内容

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # 加入下面这行
    'common.apps.CommonConfig',
]

common.apps.CommonConfig告诉 DjangoCommonConfigcommon/apps.py 文件中定义的一个应用配置的类。

common.apps.CommonConfig => 应用名.文件名.类名

common/apps.py:

from django.apps import AppConfig


class CommonConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'common'

CommonConfig 是 AppConfig的 子类, 就表示这个是应用的配置类。

这里 name = ‘common’ , name 是用来定义 应用的python模块路径的。 这里就是说 应用 模块路径为 common 。

<7> 通知Django更新脚本

现在Django知道了我们的 common 应用, 我们可以在项目根目录下执行命令

python manage.py makemigrations common

通知Django , 去看看common这个app里面的models.py ,我们已经修改了数据定义, 你现在去产生相应的更新脚本。

产生了common\\migrations\\0001_initial.py文件,这个脚本就是相应要进行的数据库操作代码。

# Generated by Django 3.2.9 on 2021-11-23 02:12

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Customer',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=200)),
                ('phonenumber', models.CharField(max_length=200)),
                ('address', models.CharField(max_length=200)),
            ],
        ),
    ]

<8> 执行0001_initial.py真正去数据库创建表了

python manage.py migrate

<9> 刷新数据库,查看新创建的表


5、修改数据库和表

例如要新增QQ字段

<1> 修改common\\models.py

from django.db import models


class Customer(models.Model):
    # 客户名称
    name = models.CharField(max_length=200)

    # 联系电话
    phonenumber = models.CharField(max_length=200)

    # 地址
    address = models.CharField(max_length=200)

    # 新增`QQ`字段 
    qq = models.CharField(max_length=30)

<2> 通知Django更新脚本

python manage.py makemigrations common

QQ字段 增加缺省值(即默认值),或允许为null

from django.db import models


class Customer(models.Model):
    # 客户名称
    name = models.CharField(max_length=200)

    # 联系电话
    phonenumber = models.CharField(max_length=200)

    # 地址
    address = models.CharField(max_length=200)

    # 新增`QQ`字段 null=True:允许为null blank=True:允许没有值
    qq = models.CharField(max_length=30, null=True)

又生成新文件common\\migrations\\0002_customer_qq.py

<2> 执行新文件去数据库创建修改表

python manage.py migrate


6、Django Admin 管理数据

<1> 创建一个超级管理员账号

进入到项目的根目录,执行如下命令,依次输入你要创建的管理员的 登录名、email、密码。

E:\\Project\\Python\\DjangoStudy\\myDjango>python manage.py createsuperuser
Username (leave blank to use 'ywl'): admin
Email address: id_07225489@qq.com
Password:
Password (again):
Superuser created successfully.

<2> 管理员登录

访问http://127.0.0.1/admin/

<3> 让Customers表显示

from django.contrib import admin

from .models import Customer

admin.site.register(Customer)
  • 方法一:需要修改应用里面的 管理员 配置文件common/admin.py,注册我们定义的model类\\
  • 方法二: 需要修改应用里面的 common/models.py

7 、读取数据库数据

<1> 获取全部记录

现在我们来实现一个功能:浏览器访问 sales/customers/ ,我们的服务端就返回系统中所有的客户记录给浏览器。
我们先实现一个函数,来处理浏览器发出的URL为sales/customers/ 的访问请求, 我们需要返回 数据库中 customer 表 所有记录。

Django 中 对数据库表的操作, 应该都通过 Model对象 实现对数据的读写,而不是通过SQL语句。
比如,这里我们要获取 customer 表 所有记录, 该表是和我们前面定义的 Customer 类管理的。

我们可以这样获取所有的表记录:

在文件sales/views.py 中,定义一个listcustomers 函数,内容如下:

from django.http import HttpResponse
# 导入 Customer 对象定义
from common.models import Customer


def listcustomers(request):
    # 返回一个 QuerySet 对象 ,包含所有的表记录
    # 每条表记录都是是一个dict对象,
    # key 是字段名,value 是 字段值
    qs = Customer.objects.values()

    # 定义返回字符串
    retStr = ''
    for customer in qs:
        for name, value in customer.items():
            retStr += f'name : value | '

        # <br> 表示换行
        retStr += '<br>'

    return HttpResponse(retStr)

Customer.objects.values() 就会返回一个 QuerySet 对象,这个对象是Django 定义的,在这里它包含所有的Customer 表记录。

我们还需要修改路由表, 加上对sales/customers/url请求的 路由。

前面,我们在config\\urls.py 主路由文件中,已经有如下的记录了

from django.contrib import admin
from django.urls import path, include

# from sales.views import listorders

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

    # 添加如下的路由记录
    path('sales/', include('sales.urls')),

]

我们只需修改 sales/urls.py 即可

from django.urls import path
from sales.views import listcustomers

urlpatterns = [
    # 添加如下的路由记录
    path('customers/', listcustomers)

]

访问http://127.0.0.1/sales/customers/

<2> 过滤条件

有的时候,我们需要根据过滤条件查询部分客户信息。

比如,当用户在浏览器输入 /sales/customers/?phonenumber=13000000001 ,要求返回电话号码为 13000000001 客户记录。
我们可以通过filter 方法加入过滤条件,修改view里面的代码,如下所示

from django.http import HttpResponse
# 导入 Customer 对象定义
from common.models import Customer


def listcustomers(request):
    # 返回一个 QuerySet 对象 ,包含所有的表记录
    qs = Customer.objects.values()

    # 检查url中是否有参数phonenumber,没有则返回Nome
    ph = request.GET.get('phonenumber', None)

    # 如果有,添加过滤条件
    if ph:
        qs = qs.filter(phonenumber=ph)

    # 定义返回字符串
    retStr = ''
    for customer in  qs:
        for name,value in customer.items():
            retStr += f'name : value | '
        # <br> 表示换行
        retStr += '<br>'

    return HttpResponse(retStr)

以上是关于python 使用django库进行Web 开发的主要内容,如果未能解决你的问题,请参考以下文章

Django的配置与了解

python 开发工具库资料合集

Python就业方向

使用 Python 和 Django 搭建 Web 应用

Python五大应用领域是啥

用Python+Django在Eclipse环境下开发web网站转