python学习第七天--Django项目创建与应用及生命流程周期

本文介绍了Django项目创建与管理的基础知识,包括HTTP协议、MVC和MTV模式的理解。详细讲解了Django的后台管理设置,如启用Admin站点,自定义模型管理。此外,还阐述了Django项目的生命周期,涉及请求中间件、路由匹配、视图函数和响应中间件等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预备知识

HTTP协议的认识

HTTP协议就是客户端和服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。

  • 基于 TCP/IP
    • HTTP是一个属于应用层的面向对象的协议。
    • HTTP协议工作于客户端-服务端架构上。
  • 基于请求-响应模式
    • 浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
    • Web服务器根据接收到的请求后,向客户端发送响应信息。


HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。

怎么解决Http 协议无状态协议?
无状态协议解决办法:

  • 通过Cookie
  • 通过Session会话保存

Http请求中常见的请求方式

根据 HTTP 标准,HTTP 请求可以使用多种请求方法。

  • HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
  • HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

在网页上按fn+F12进入开发者模式(或者右键选择检查)

  • GET请求是可以缓存的,我们可以从浏览器历史记录中查找到GET请求,还可以把它收藏到书签中;且GET请求有长度限制,仅用于请求数据(不修改)。因GET请求的不安全性,在处理敏感数据时,绝不可以使用GET请求。
  • POST请求永远不会被缓存,且对数据长度没有限制;我们无法从浏览器历史记录中查找到POST请求。
  • PUT方法会将包含的元素放在所提供的URI下,如果URI指示的是当前资源,则会被改变。如果URI未指示当前资源,则服务器可以使用该URI创建资源。

MVC模式和MTV模式

MVC 模式
MVC 就是把Web应用分为模型(M),控制器©和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射( ORM ),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求。

MTV 模式
MTV模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,在Python的世界中,基本(除了Pylons)都使用了 MVC 的变种 MTV (Model Templates View 模型-模板-视图)。
Django 的MTV分别是值:

  • M 代表模型(Model): 负责业务对象和数据库的关系映射( ORM )。
  • T 代表模板 (Template):负责如何把页面展示给用户( html )。
  • V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。

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

Django项目创建与子应用

你所需要知道的关于 Django 的一切。
在这里插入图片描述

后台管理

使用专业版pycharm直接创建Django项目

  • init.py :一个空文件,它告诉Python这个目录应该被看做一个Python包
  • asgi.py:客户端向服务端发送信息的网关接口#这是Django3.x版本才有的
  • settings.py:基本的配置信息,如时区、语言等
  • urls.py:路由配置
  • wsgi.py:web服务网关接口,它会开启一个服务让用户来访问
  • manage.py:一个命令行工具,可以使你用多种方式对 Django 项目进行交互
  • 内层的目录:项目的真正的Python包

在terminal里进行测试


python manage.py runserver 端口号 #可指定访问端口号

启用后台Admin 站点管理


数据库迁移
setting.py文件中的设置

terminal输入以下命令
python manage.py makemigrations
python manage.py migrate





创建管理员用户

# 按提示输入用户名、邮箱、密码
python manage.py createsuperuser
  • 启动服务器,通过 “127.0.0.1:8000/admin” 访问,输入上面创建的用户名、密码完成登录
  • 进入管理站点,默认可以对 groups、users 进行管理

管理界面本地化

编辑 settings.py 文件,设置编码、时区  #为了显示中文和中国的时间
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

自定义模型加入后台管理

打开 bookApp/admin.py 文件,注册模型:
from django.contrib import admin
from models import Book
admin.site.register(Book)

# bookApp/models.py
class Book(models.Model):
# ........此处省略
# 自定义对应的表名,默认表名:bookApp_book
class Meta:
db_table = "books"
# 单数时显示的名称
verbose_name = '图书信息'
# 复数时显示的名称
verbose_name_plural = '图书信息'



自定义管理页面

  • Django 提供了 admin.ModelAdmin 类
  • 通过定义 ModelAdmin 的子类,来定义模型在 Admin 界面的显示方式
from django.contrib import admin
from bookApp.models import  Book,Hero
# 自定义后台站点管理的拓展阅读: https://docs.djangoproject.com/zh-hans/3.1/ref/contrib/admin/
# Register your models here.

class HeroInline(admin.StackedInline):  #内嵌关联注册类
    model = Hero
    extra = 3


class BookAdmin(admin.ModelAdmin):
    # 列表页展示的设置
    list_display =  ['id', 'name', 'pub_date']  #1.显示字段,可以点击列头进行排序
    list_filter = ['pub_date']   #2.过滤字段,过滤框会出现在右侧
    search_fields = ['name']   #3.搜索字段,搜索框会出现在上侧
    list_display_links = ['name']   #以哪个字段为链接
    list_per_page =  5   #分页,分页框会出现在下侧
    inlines =  [HeroInline]

class HeroAdmin(admin.ModelAdmin):
    # 列表页展示的设置
    list_display =  ['id', 'name', 'gender']
    list_filter = ['gender']
    search_fields = ['name', 'content']
    list_display_links = ['name']
    list_per_page =  5


    # 增加和编辑页的设置
    fieldsets = [('必填信息', {'fields': ['name', 'book_id']}),
                 ('选填信息', {'fields': ['gender', 'content']}), ]

admin.site.register(Book, BookAdmin)
admin.site.register(Hero, HeroAdmin)




对于 Hero 模型类,有两种注册方式

  • 方式一:与 Book 模型类相同
  • 方式二:关联注册
    • admin.StackedInline : 内嵌关联注册类
    • admin.TabularInline : 表格关联注册类
# bookApp/admin.py
# class HeroInline(admin.TabularInline):
class HeroInline(admin.StackedInline):
model = Hero
extra = 2
class BookAdmin(admin.ModelAdmin):
list_display = ['pk', 'title', 'pub_date']
# .......此处省略部分重复代码
inlines = [HeroInline]


发布性别的显示不是一个直观的结果,可以使用方法进行封装

# bookApp/models.py
class Hero(models.Model):
# .......此处省略部分重复代码
def sex(self):
if self.gender:
return "男"
else:
return "女"

在 admin 注册中使用 sex 代替 gender

# bookApp/admin.py
class HeroAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'sex', 'content']
# .......此处省略部分重复代码

应用的创建、视图函数及路由规则

创建一个应用程序

  • Django 自带一个实用程序,可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不是创建目录。
  • 在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
python3 manage.py startapp bookApp  %创建应用程序bookapp

__init__.py:只要是包,里面都会有的文件
admin.py:跟后台管理相关的
apps.py:一般情况下不需要修改
models.py:跟数据库相关的
tests.py:测试文件
views.py:视图文件
urls.py:路由规则

编写视图函数

打开文件 bookApp/views.py 并放入以下Python代码:
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
# 视图: 对用户的请求(request)进行业务逻辑操作,最终返回给用户一个响应(response).
def index(request):
    print("用户请求的路径:",request.path)
    return HttpResponse('<h1 style="color:red">图书管理系统</h1>')
    #这里在HttpResponse按下alt+enter就可以在最上面自动导入库

路由规则

要在 bookApp 目录中创建一个 URLconf ,创建一个名为 urls.py 。如下所示:
from django.urls import path
from bookApp import views
urlpatterns = [
    path(r'', views.index, name='index'),#这是回去调用视图函数里的index方法
]

还要编写BookManage\urls.py文件:
from django.contrib import admin
from django.urls import path, include

from bookApp.views import index

urlpatterns = [
    path('admin/', admin.site.urls),
    # 当用户请求路径为/book/时,访问bookApp/urls.py子路由配置文件
    path('book/', include('bookApp.urls')), #include()函数允许引用其他 URLconfs 
]
#这里在include按下alt+enter就可以在最上面自动导入库



当用户请求路径为/book/时,服务内部wsgi web服务网关接口接收用户请求,访问bookApp/urls.py子路由配置文件, 执行views.index视图函数,对用户的请求(request)进行业务逻辑操作,最终返回给用户一个响应(response)。

项目的数据库模型

创建数据库模型

编辑bookApp/models.py文件:
from django.db import models

# Create your models here.

# 类对应数据库表, 表名称默认为bookApp_book.
class Book(models.Model):
    # 属性对应数据库表的列名,默认会添加id这一列。
    name = models.CharField(max_length=40, verbose_name="书籍名称")
    pub_date = models.DateField(verbose_name="出版日期")

    # 魔术方法,字符串友好展示, 便于调试代码
    def __str__(self):
        return  self.name

    class Meta:
        # 单数时显示的名称
        verbose_name = "图书管理"
        # 复数时显示的名称
        verbose_name_plural = verbose_name

# 类对应数据库表, 表名称默认为bookApp_hero.
class Hero(models.Model):
    # 属性对应数据库表的列名,默认会添加id这一列。
    gender_choice = [
        (1, "男"),
        (2, "女")
    ]
    name = models.CharField(max_length=20, verbose_name="人物名称")
    # 性别只能选择男(1)或者女(2)
    gender = models.IntegerField(choices=gender_choice, verbose_name="性别")  # 1, 2
    content = models.TextField(max_length=1000, verbose_name="人物描述")
    # 外键关联, 如果删除书籍时,相关hero对应的书籍设置为空。
    book_id = models.ForeignKey(Book, on_delete=models.SET_NULL,
                                null=True, verbose_name="书籍id")

    def __str__(self):
        return  self.name

    class Meta:
        # 单数时显示的名称
        verbose_name = "人物管理"
        # 复数时显示的名称
        verbose_name_plural = verbose_name

生成数据库表

激活模型:编辑 settings.py 文件,将应用加入到 INSTALLED_APPS 中:
# BookManage/settings.py
# Application definition
INSTALLED_APPS = [
# .......此处省略
'django.contrib.staticfiles',
# 新添加的app
'bookApp',
]
python manage.py makemigrations #生成迁移文件
python manage.py migrate   #执行迁移



数据库模型基本操作

pip install ipython  #装完这个包可以在交互式环境下进行补齐操作
python manage.py shell #进入交互式的Python shell
from bookApp.models import Hero, Book  #导入需要的包
from datetime import date
Book.objects.all() #查询所有图书信息
book = Book(name="射雕英雄传", pub_date=date(1990,1,10)) #新建图书信息
book.save() #保存图书信息,一定要记得save
book.delete() #删除图书信息





关联


前台管理

URLconf 路由管理

# BookManage/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
# 当用户访问的url地址以book开头, 请访问bookApp.urls这个url配置文件进行匹配并执行对应的视图函数.
url(r'^book/', include('bookApp.urls')),
]

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

urlpatterns = [
    # 当用户访问路径是book/, 执行views.index视图函数。
    path(r'', views.index, name='index'),
    # 显示书籍的详情页, 接收一个int值并赋值给id
    path(r'<int:id>/', views.detail, name='detail'),
]

视图函数处理业务逻辑

编辑bookApp/views.py文件:
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

# 视图: 对用户的请求(request)进行业务逻辑操作,最终返回给用户一个响应(response).
from bookApp.models import Book


def index(request):
    # print("用户请求的路径:", request.path)
    books = Book.objects.all()
    # 返回响应信息
    # return  HttpResponse(books)
    # 渲染: 将上下文context{'books': books}填充到book/index.html代码的过程。
    return render(request, 'book/index.html', {'books': books})

def detail(request, id):
    """书籍详情页信息"""
    book = Book.objects.filter(id=id).first()
    heros = book.hero_set.all()
    return render(request, 'book/detail.html',
                  {'book': book, 'heros': heros})

模板管理实现好看的HTML页面

编写html页面的参考文档.





常用的html











Django的生命流程周期

  • wsgi : 封装请求后交给后端的web框架( Flask、Django )。
  • 请求中间件: 对请求进行校验或在请求对象中添加其他相关数据,例如: csrf、request.session 。
  • 路由匹配: 根据浏览器发送的不同 url 去匹配不同的视图函数。
  • 视图函数: 在视图函数中进行业务逻辑的处理,可能涉及到: ORM、Templates 。
  • 响应中间件: 对响应的数据进行处理。
  • wsgi : 将响应的内容发送给浏览器。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值