文章目录
Web开发框架----Django
一、Django学习: 预备知识
1.HTTP协议的认识
(1)什么是HTTP 协议?
HTTP协议就是客户端和 服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。
- 基于 TCP/IP
HTTP是一个属于应用层的面向对象的协议。
HTTP协议工作于客户端-服务端架构上。 - 基于请求-响应模式
浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器根据接收到的请求后,向客户端发送响应信息。
当我们登陆时,默认http是不会保存登陆信息的,我们采用间接方法将用户名、密码等用session会话来保存,当我们判断用户名时从session中拿。(手动存储)
(2)为什么说Http 协议是无状态协议?
HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。
(3)怎么解决Http 协议无状态协议?
有些场景我们必须要保存状态信息,比如用户登陆、购物车信息等
无状态协议解决办法:
- 通过Cookie
- 通过Session会话保存
Cookie流程
没有Cookie信息的状态下,户端向服务端发送一个保存请求,服务端收到请求生成一个Cookie,并添加到响应中返回给客户端。
当第二次存有Cookie信息状态的请求服务端时,服务端检查自己的Cookie,就知道这是刚才某个人给我发的。
2.Http请求中常见的请求方式
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
- HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
- HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和CONNECT 方法(敲重点)
3.MVC模式和MTV模式
1.MVC 模式
MVC 就是把Web应用分为模型(M),控制器©和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射( ORM ),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求。
**控制器(C):**控制url地址,比如,用户访问一个url地址,控制器(C)
就会告诉它要访问那个路由和视图函数。
MVC模式流程:
用户输入一个url,控制器(总管)判断访问的是什么比如访问主页,控制器去找主页的视图函数。
视图函数如果是要返回所有的数据信息,则告诉控制器,控制器去访问数据库模型里面,与数据库进行交流,存储或者取出数据等操作,把这个数据信息返回给view视图函数。
view视图函数将数据和html代码结合起来产生一个真正的html代码,返回给用户。
2.MTV 模式(python中基本都使用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的响应模式如下所示:
MTV模式流程:
第一种:用户访问url,控制器判断是否存在此地址的路由和视图函数,如果有且不需要调用数据库的内容,视图函数view找到这个模板,返回给用户。
第二种:用户访问url,控制器判断是否存在此地址的路由和视图函数,如果有且需要调用数据库的内容,则去module里面访问数据库,拿到数据返回给view试图函数,在交给模板是西安一个动态的html,返回给用户。
二、Django学习: 快速入门
1.Django框架介绍
(1)什么是框架?
软件框架就是为实现或完成某种软件开发时,提供了一些基础的软件产品,
框架的功能类似于 基础设施 ,提供并实现最为 基础的软件架构和体系
通常情况下我们依据框架来实现更为复杂的业务程序开发
二个字,框架就是程序的 骨架
(2)Python 中常见的框架有哪些?
大包大揽 Django 被官方称之为完美主义者的Web框架。
力求精简 web.py 和 Tornado
新生代微框架 Flask 和 Bottle
(3)Django 框架介绍
Django 是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计。
由经验丰富的开发人员构建,它负责Web开发的许多麻烦,因此您可以专注于编写应用程序,而
无需重新创建轮子。
免费的和开源的。
被官方称之为完美主义者的Web框架。
官方网址:https://www.djangoproject.com/
(4)Django 框架的特点
(5)Django 可以使用什么Python版本?
Django 的开发版本
(6)Django 的安装
pip install -i https://pypi.douban.com/simple django==2.2
2.Django快速入门:后台管理
以图书管理系统为例,是西安图书管理的基本功能。
主要代码:
#创建项目
django-admin startproject BookManage
#确认项目的创建
python manage.py runserver
#创建应用
python manage.py startapp bookApp
#编写视图函数
#修改路由即规则
#启动服务器
$ python manage.py runserver
#创建数据库
MariaDB [(none)]> create database BookManage charset=utf8;
#链接数据库设置setting
#创建数据库模型
# bookApp/models.py
#生成数据库表
#激活setting
#生成迁移文件
python manage.py makemigrations
#执行迁移文件
python manage.py migrate
#
第一步:项目的创建(两种方式)与运行
第一次使用Django,必须进行一些初始设置,就是说,需要自动生成一些家里Django项目的代码。
(1)方法一:新建
和创建flask项目一样,在new中新建一个django项目就行
(2)方法二:命令行创建
- 从命令行cd到你要存储代码的目录,运行一下命令:
django-admin startproject BookManage
- cd进入项目目录,目录结构如图:
- 运行下面命令:
python manage.py runserver
出现以下页面,则说明创建成功:
(3)目录说明
manage.py :
一个命令行工具,可以使你用多种方式对 Django 项目进行交互
**内层的目录:**项目的真正的Python包
__init__.py :
一个空文件,它告诉Python这个目录应该被看做一个Python包
settings.py :
项目的配置,#每一个配置前面都有一个url地址,不知道可以去查找
urls.py :
项目的URL声明,路由和对应的视图函数
wsgi.py :
项目与 WSGI 兼容的Web服务器入口。
用户访问百度时,百度有http服务,一般是NGINX、阿帕奇服务,用到的协议时http协议。在这里django项目用到的是WSGI协议,怎样使用户和jango项目结合呢?中间人就是WSGI,支持http协议与用户交流,也可以与jango项目交流。
第二步:应用的创建和使用
(1) 创建第一个应用程序
flask中我们需要自己创建蓝图(一个应用),绑定路由和视图函数,注册蓝图,比较麻烦。
Django 自带一个实用程序,可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不是创建目录。
- 在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
- 创建应用的命令:
python manage.py startapp bookApp
- 应用的目录结构如下图:
(2) 编写第一个视图函数
我们来写第一个视图。打开文件 bookApp/views.py
并放入以下Python代码:
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
#在flask中视图函数不需要传参数,这里第一个参数必须是requsest,所有的请求在这里面
def index(request):
return HttpResponse('<h1>图书馆里系统主页</h1>')
(3) 路由规则
要在 bookApp
目录中创建一个 URLconf
,创建一个名为 urls.py
。如下所示:
# bookApp/urls.py
from django.conf.urls import url
from . import views
# 编写路由规则
urlpatterns=[
# 当用户访问bookApp应用的主页时, 执行视图函数index,反向根据名称获取url地址; r'^$':以什么开头以什么结尾。
url(r'^$',views.index,name='index')
]
此时项目找不到我们的url路由,
根据配置文件 BookManage/settings
可知路由查找的主文件是 BookManage/urls.py
, 因此在 BookManage/urls.py
文件添加一条 url
规则来关联BookManage/urls.py
和bookApp/urls.py
:
# BookManage/urls.py
from django.conf.urls import url
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 当用户访问的url地址以book开头, 请访问bookApp.urls这个url配置文件进行匹配并执行对应 的视图函数.
url(r'^book/', include('bookApp.urls')),
]
include()函数允许引用其他 URLconfs 。
url() 函数介绍
Django url() 可以接收四个参数,分别是两个必选参数: regex 、 view 和两个可选参数:kwargs 、 name 。
- regex : 正则表达式,与之匹配的 URL 会执行对应的第二个参数 view。
- view : 用于执行与正则表达式匹配的 URL 请求。
- kwargs : 视图使用的字典类型的参数。
- name : 用来反向获取 URL。
(4) 效果展示
- 启动服务器
$ python manage.py runserver
- 访问 url 地址: http:// 127.0.0.1:8000/book/ 如果看到主页内容 图书管理系统 即成功。
- 整个流程:
用户输入一个url,jango先去BookManage/urls.py
文件里面找,找到url(r'^book/',include('bookApp.urls'))
,发现是以book开头的,则去'bookApp.urls'
里面找,找到url(r'^$',views.index,name='index')
,意思如果要访问主页的话就去views.index
里面,views
里定义了一个试图函数index
,return HttpResponse('<h1>图书馆里系统主页</h1>')
所以,返回给用户一个html页面。
第三步: 项目的数据库模型
(0). 数据库创建
MariaDB [(none)]> create database BookManage charset=utf8;
(1). 连接 MySQL 数据库配置
- 在 settings.py 文件中,通过DATABASES项进行数据库设置
- Django 支持的数据库包括: sqlite 、 mysql 等主流数据库
- Django 默认使用 SQLite 数据库
- Django数据库设置参考文档:https://docs.djangoproject.com/en/2.2/ref/settings/#databases
其中ENGINE设置为数据库后端使用。内置数据库后端有: - ‘django.db.backends.postgresql’
- ‘django.db.backends.mysql’
- ‘django.db.backends.sqlite3’
- ‘django.db.backends.oracle’
在BookManage/settings.py
文件中,通过DATABASES项进行数据库设置:
# .......
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
# 注释之前的sqlite数据库;
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
# 添加新的Mysql数据库连接;
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'BookManage',
'USER': 'root',
'PASSWORD': '123lh',
'HOST': 'localhost',
'PORT': '3306',
}
}
# .......
注意: Django 使用 MySQL 数据库需要安装 PyMySQL ,若已经安装请略过。
$ pip install pymysql
注意: MySQLdb只支持Python2.*,还不支持3.可以用PyMySQL代替。
打开 BookManage/__init__.py
,写入以下代码导入 pymysql
:
import pymysql
# MySQLdb只支持Python2.*,还不支持3.可以用PyMySQL代替。
pymysql.install_as_MySQLdb()
(2). 创建数据库模型
本示例完成“图书-英雄”信息的维护,需要存储两种数据:图书、英雄
- 图书表结构设计: 表名: Book
图书名称: title
图书发布时间: pub_date - 英雄表结构设计: 表名: Hero
英雄姓名: name
英雄性别: gender
英雄简介: hcontent
所属图书: hbook
图书-英雄的关系为一对多
# bookApp/models.py
from django.db import models
# Create your models here.
class Book(models.Model):
# 定义属性:默认主键自增id字段可不写
title = models.CharField(max_length=20)
pub_date = models.DateTimeField()
# 定义默认输出格式
def __str__(self):
return "%s" % self.title
# 自定义对应的表名,默认表名:bookApp_book
class Meta:
db_table = "books"
class Hero(models.Model):
name = models.CharField(max_length=20)
gender = models.BooleanField()
content = models.CharField(max_length=100)
#外键:一对多时,外键卸载多的一端。
# on_delete:级联删除;为True时,当删掉人物时,人物所在的书本也删掉。在python2以上的版本,必须设置此参数,否则报错。
Book = models.ForeignKey('Book', on_delete=False)
def __str__(self):
return "%s" % self.name
# 自定义对应的表名,默认表名:bookApp_hero
class Meta:
db_table = "heros"
(3). 生成数据库表
- 激活模型:编辑
settings.py
文件,将应用加入到INSTALLED_APPS
中
# Application definition
#jango已经写好的应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#添加引用,要用的时候加进来,不用就可以注释掉
'bookApp',
]
- 生成迁移文件:根据模型类生成
sql
语句
python manage.py makemigrations
产生的迁移文件如下:
注意报错:
(1)使用命令:python manage.py makemigrations
,会报错mysqlclient版本不够,一个暴力的解决措施:去base.py文件中将这句注释掉。
(2)在运行,会报错编码方式,修改:
此时还没有生成数据库表
- 执行迁移:执行 sql 语句生成数据表
python manage.py migrate
数据库中查看数据库表是否创建成功?
(4). 数据库模型基本操作
进入python交互模式,在操作过程中如果遇到错误修改了代码,需要退出重新进入python交互模式。
引入需要的包
#现在进入交互式的Python shell,并使用 Django 提供的免费 API
F:\ziliao\python_kaifa\my_code\09_\BookManage>python manage.py shell
Python 3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4