一.HTTP协议的认识
(一)HTTP协议就是客户端和 服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。
1.基于 TCP/IP
HTTP是一个属于应用层的面向对象的协议。
HTTP协议工作于客户端-服务端架构上。
2.基于请求-响应模式
浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器根据接收到的请求后,向客户端发送响应信息
(二)HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行
保存
(三)无状态协议解决办法:
通过Cookie
通过Session会话保存
(四)根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
(五)MVC模式和MTV模式
1.MVC 模式
MVC 就是把Web应用分为模型(M),控制器©和视图(V)三层,他们之间以一种插件式的、松耦合的方式
连接在一起,模型负责业务对象与数据库的映射( ORM ),视图负责与用户的交互(页面),控制器接受用户
的输入调用模型和视图完成用户的请求
2.MTV 模式
(1)MTV模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,在
Python的世界中,基本(除了Pylons)都使用了 MVC 的变种 MTV (Model Templates View 模型-模板-
视图)。
(2)Django 的MTV分别是值:
M 代表模型(Model): 负责业务对象和数据库的关系映射( ORM )。
T 代表模板 (Template):负责如何把页面展示给用户( html )。
V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
(3)除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处
理,View再调用相应的Model和Template,MTV的响应模式如下所示
二.Django框架介绍
(一)什么是框架?
软件框架就是为实现或完成某种软件开发时,提供了一些基础的软件产品,
框架的功能类似于 基础设施 ,提供并实现最为 基础的软件架构和体系
通常情况下我们依据框架来实现更为复杂的业务程序开发
二个字,框架就是程序的 骨架
(二)Python 中常见的框架有哪些?
大包大揽 Django 被官方称之为完美主义者的Web框架。
力求精简 web.py 和 Tornado
新生代微框架 Flask 和 Bottle
(三)Django 框架介绍
Django 是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计。
由经验丰富的开发人员构建,它负责Web开发的许多麻烦,因此您可以专注于编写应用程序,而
无需重新创建轮子。
免费的和开源的。
被官方称之为完美主义者的Web框架
官网
(四)Django 框架的特点
快得多,快速将应用程序从概念到完成
安全性好
可拓展性强
三.Django部署
(一)Django 的安装
pip install Django -i https://pypi.douban.com/simple
(二)项目的创建与运行
目录说明: manage.py :一个命令行工具,可以使你用多种方式对 Django 项目进行交互
内层的目录:项目的真正的Python包 init.py :一个空文件,它告诉Python这个目录应该被看做一个Python包 settings.py :项目的配置
urls.py :项目的URL声明
wsgi.py :项目与 WSGI 兼容的Web服务器入口
(三)启用后台Admin 站点管理
1.站点分为“内容发布(后台管理)”和“公共访问(前台管理)”两部分
“内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力
的工作。
因此, Django 会根据定义的模型类完全自动地生成管理模块
2.Django 框架中有一个非常强大的应用功能: 自动管理界面。 常被Web平台管理者使用,去管理整个
Web平台
3.管理员用户
python manage.py makemigrations #数据库迁移
python manage.py migrate
import os
python manage.py createsuperuser #创建管理员用户
官网参考
E:\djangoProject>python manage.py runserver 192.168.1.104:8000 &
运行服务时可能会出现的错误,原因计算机名中包含中文名,改成全英文的
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 2: invalid start byte
4.编辑 settings.py 文件,设置编码、时区
LANGUAGE_CODE = ‘zh-Hans’
TIME_ZONE = ‘Asia/Shanghai’
(四)应用的创建和使用
1.创建第一个应用程序
Django 自带一个实用程序,可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不
是创建目录。在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
python manage.py startapp bookApp
2. 编写第一个视图函数
# bookApp/view.py
from django.shortcuts import render
# Create your views here.
# 视图: 对用户的请求(request)进行业务逻辑操作,最终返回给用户一个响应(response).
from django.http import HttpResponse
def index(request):
print("用户路径",request.path)
# 返回响应信息
return HttpResponse("首页信息")
3.路由规则
url() 函数介绍
Django url() 可以接收四个参数,分别是两个必选参数: regex 、 view 和两个可选参数:kwargs 、 name 。
regex : 正则表达式,与之匹配的 URL 会执行对应的第二个参数 view。 view : 用于执行与正则表达式匹配的 URL 请求。kwargs : 视图使用的字典类型的参数。name : 用来反向获取 URL。
(1)子应用少的时候
from bookApp.views import index
# djangoProject/urls.py
path('index/', index),
(2)方便管理的
# djangoProject/urls.py
from django.urls import path, include
# 当用户请求路径为/book/时,访问bookApp/urls.py子路由配置文件
path('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'),
]
E:\djangoProject>python manage.py runserver 192.168.1.104:8000 & #增加文件需要新建服务
(3)html页面
# bookApp/views.py
from django.http import HttpResponse
def index(request):
print("用户路径",request.path)
# 返回响应信息
return HttpResponse('<h1>测试网页</h1>')
from django.http import HttpResponse
def index(request):
print("用户路径",request.path)
# 返回响应信息
return HttpResponse('<h1 style="color:red">测试网页</h1>')
(五)项目的数据库模型
1.创建数据库模型
本示例完成“图书-英雄”信息的维护,需要存储两种数据:图书、英雄
"""
图书表结构设计: 表名: Book
图书名称: title
图书发布时间: pub_date
英雄表结构设计: 表名: Hero
英雄姓名: name
英雄性别: gender
英雄简介: hcontent
所属图书: hbook
"""
# bookApp/models.py
from django.db import models
"""
名词:
ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。
这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法。
一对多关系:外键写在多的一端
book:hero = 1:n
"""
# 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
"""
更多查询操作请参考网址: https://docs.djangoproject.com/zh-hans/3.1/topics/db/queries/
"""
# 类对应数据库表, 表名称默认为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
# Meta选项的更多使用请参考网址: https://docs.djangoproject.com/zh-hans/3.1/ref/models/options/
class Meta:
# 单数时显示的名称
verbose_name = "人物管理"
# 复数时显示的名称
verbose_name_plural = verbose_name
生成数据库表
python manage.py makemigrations #生成迁移文件:根据模型类生成 sql 语句
python manage.py migrate #执行迁移:执行 sql 语句生成数据表
2.数据库模型基本操作
进入交互式的Python shell,并使用 Django 提供的免费 API
python manage.py shell
修改图书信息
book.title = “xxx”
book.save()
(六)自定义模型加入后台管理和自定义管理页面
打开 bookApp/admin.py 文件,注册模型
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
# Django 提供了 admin.ModelAdmin 类,通过定义 ModelAdmin 的子类,来定义模型在 Admin 界面的显示方式
class BookAdmin(admin.ModelAdmin):
# 列表页展示的设置
list_display = ['id', 'name', 'pub_date']
list_filter = ['pub_date']
search_fields = ['name']
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)
(七) 前台管理
前面主路由和子路由已经配置好了
# 视图函数处理业务逻辑
# bookapp/views.py
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})
# 模板管理实现好看的HTML页面
# templates/book/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 style="color: blueviolet">图书管理系统</h1>
<ul>
{% for book in books %}
<li><a href="/book/{{ book.id }}/">{{ book.name }}</a></li>
{% endfor %}
</ul>
</body>
</html>
(八)Django请求的生命周期
wsgi : 封装请求后交给后端的web框架( Flask、Django )。
请求中间件: 对请求进行校验或在请求对象中添加其他相关数据,例如: csrf、 request.session 。
路由匹配: 根据浏览器发送的不同 url 去匹配不同的视图函数。
视图函数: 在视图函数中进行业务逻辑的处理,可能涉及到: ORM、Templates 。
响应中间件: 对响应的数据进行处理。
wsgi : 将响应的内容发送给浏览器